Skip to content

Commit 26e69d9

Browse files
committed
Sema: Diagnose self.init and super.init inside closures
Fixes <rdar://problem/27420414>.
1 parent c25c214 commit 26e69d9

File tree

2 files changed

+27
-8
lines changed

2 files changed

+27
-8
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -371,15 +371,10 @@ static void diagSyntacticUseRestrictions(TypeChecker &TC, const Expr *E,
371371
.highlight(IOE->getSubExpr()->getSourceRange());
372372
}
373373

374-
// Diagnose 'self.init' or 'super.init' nested in another expression.
374+
// Diagnose 'self.init' or 'super.init' nested in another expression
375+
// or closure.
375376
if (auto *rebindSelfExpr = dyn_cast<RebindSelfInConstructorExpr>(E)) {
376-
bool inDefer = false;
377-
auto *innerDecl = DC->getInnermostDeclarationDeclContext();
378-
if (auto *FD = dyn_cast_or_null<FuncDecl>(innerDecl)) {
379-
inDefer = FD->isDeferBody();
380-
}
381-
382-
if (!Parent.isNull() || !IsExprStmt || inDefer) {
377+
if (!Parent.isNull() || !IsExprStmt || DC->getParent()->isLocalContext()) {
383378
bool isChainToSuper;
384379
(void)rebindSelfExpr->getCalledConstructor(isChainToSuper);
385380
TC.diagnose(E->getLoc(), diag::init_delegation_nested,

test/expr/postfix/dot/init_ref_delegation.swift

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,30 @@ class TestNestedExpr {
373373
convenience init(i: Int) {
374374
_ = ((), try! self.init(error: true)) // expected-error {{initializer delegation ('self.init') cannot be nested in another expression}}
375375
}
376+
377+
convenience init(j: Int) throws {
378+
_ = {
379+
try self.init(error: true)
380+
// expected-error@-1 {{initializer delegation ('self.init') cannot be nested in another expression}}
381+
}
382+
383+
_ = {
384+
do {
385+
try self.init(error: true)
386+
// expected-error@-1 {{initializer delegation ('self.init') cannot be nested in another expression}}
387+
}
388+
}
389+
390+
defer {
391+
try! self.init(error: true)
392+
// expected-error@-1 {{initializer delegation ('self.init') cannot be nested in another expression}}
393+
}
394+
395+
func local() throws {
396+
try self.init(error: true)
397+
// expected-error@-1 {{initializer delegation ('self.init') cannot be nested in another expression}}
398+
}
399+
}
376400
}
377401

378402
class TestNestedExprSub : TestNestedExpr {

0 commit comments

Comments
 (0)