Skip to content

Commit a8c6519

Browse files
committed
[Sema] TypeCheckStmt: Prevent crash when PatternBindingInitializer is already checked
1 parent e9f7e8d commit a8c6519

File tree

2 files changed

+18
-1
lines changed

2 files changed

+18
-1
lines changed

lib/Sema/TypeCheckStmt.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,13 @@ namespace {
8282
if (CE->getParent() == ParentDC
8383
&& CE->getDiscriminator() != AutoClosureExpr::InvalidDiscriminator)
8484
return { false, E };
85-
85+
// Stop the recursion if the autoclosure is already checked in
86+
// default initializer.
87+
if (auto *initContext = dyn_cast<PatternBindingInitializer>(ParentDC))
88+
if (initContext->getBinding()->isInitializerChecked(0) &&
89+
CE->getDiscriminator() != AutoClosureExpr::InvalidDiscriminator)
90+
return { false, E };
91+
8692
assert(CE->getDiscriminator() == AutoClosureExpr::InvalidDiscriminator);
8793
CE->setDiscriminator(NextDiscriminator++);
8894
CE->setParent(ParentDC);

test/Sema/property_wrapper_parameter.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,3 +137,14 @@ func takesWrapperClosure<T>(_: ProjectionWrapper<[S<T>]>, closure: (ProjectionWr
137137
func testGenericPropertyWrapper<U>(@ProjectionWrapper wrappers: [S<U>]) {
138138
takesWrapperClosure($wrappers) { $wrapper in }
139139
}
140+
141+
@propertyWrapper
142+
public class SR_15940Bar<Value> {
143+
public init(wrappedValue: @autoclosure () -> Value) {}
144+
public var wrappedValue: Value {} // expected-error {{missing return in accessor expected to return 'Value'}}
145+
}
146+
147+
// SR-15940
148+
class SR_15940 {
149+
@SR_15940Bar var a: Bool?
150+
}

0 commit comments

Comments
 (0)