Skip to content

Commit 9eac6fe

Browse files
committed
[AST] Properties can be explicitly initialized via their wrapper.
The computation for "is explicitly initialized" on a pattern binding entry didn't account for explicit initialization via the property wrapper (e.g. @wrapper(closure: { ... })), which lead to a crash for properties with optional type. Fixes rdar://problem/57411331.
1 parent 0af22a4 commit 9eac6fe

File tree

3 files changed

+29
-4
lines changed

3 files changed

+29
-4
lines changed

include/swift/AST/Decl.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1889,7 +1889,10 @@ class PatternBindingEntry {
18891889
void setPattern(Pattern *P) { PatternAndFlags.setPointer(P); }
18901890

18911891
/// Whether the given pattern binding entry is initialized.
1892-
bool isInitialized() const;
1892+
///
1893+
/// \param onlyExplicit Only consider explicit initializations (rather
1894+
/// than implicitly-generated ones).
1895+
bool isInitialized(bool onlyExplicit = false) const;
18931896

18941897
Expr *getInit() const {
18951898
if (PatternAndFlags.getInt().contains(Flags::Removed) ||

lib/AST/Decl.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,9 +1539,9 @@ void PatternBindingEntry::setOriginalInit(Expr *E) {
15391539
PatternFlags::IsText);
15401540
}
15411541

1542-
bool PatternBindingEntry::isInitialized() const {
1542+
bool PatternBindingEntry::isInitialized(bool onlyExplicit) const {
15431543
// Directly initialized.
1544-
if (getInit())
1544+
if (getInit() && (!onlyExplicit || getEqualLoc().isValid()))
15451545
return true;
15461546

15471547
// Initialized via a property wrapper.
@@ -1833,7 +1833,7 @@ bool PatternBindingDecl::isComputingPatternBindingEntry(
18331833

18341834
bool PatternBindingDecl::isExplicitlyInitialized(unsigned i) const {
18351835
const auto &entry = getPatternList()[i];
1836-
return entry.isInitialized() && entry.getEqualLoc().isValid();
1836+
return entry.isInitialized(/*onlyExplicit=*/true);
18371837
}
18381838

18391839
SourceLoc PatternBindingDecl::getEqualLoc(unsigned i) const {

test/decl/var/property_wrappers.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1809,3 +1809,25 @@ func test_rdar56350060() {
18091809
}
18101810
}
18111811
}
1812+
1813+
// rdar://problem/57411331 - crash due to incorrectly synthesized "nil" default
1814+
// argument.
1815+
@propertyWrapper
1816+
struct Blah<Value> {
1817+
init(blah _: Int) { }
1818+
1819+
var wrappedValue: Value {
1820+
let val: Value? = nil
1821+
return val!
1822+
}
1823+
}
1824+
1825+
struct UseRdar57411331 {
1826+
let x = Rdar57411331(other: 5)
1827+
}
1828+
1829+
struct Rdar57411331 {
1830+
@Blah(blah: 17) var something: Int?
1831+
1832+
var other: Int
1833+
}

0 commit comments

Comments
 (0)