Skip to content

Commit 0b04c0c

Browse files
authored
Merge pull request #3741 from rintaro/sr-2080-fixit-initializer-delegation
[SR-2080][Parse] Improve fix-it for initializer delegation
2 parents 4ea93f6 + e6b38e3 commit 0b04c0c

File tree

2 files changed

+15
-5
lines changed

2 files changed

+15
-5
lines changed

lib/Parse/ParseStmt.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -412,9 +412,9 @@ ParserStatus Parser::parseBraceItems(SmallVectorImpl<ASTNode> &Entries,
412412
SourceLoc StartLoc = Tok.getLoc();
413413
auto CD = cast<ConstructorDecl>(CurDeclContext);
414414
// Hint at missing 'self.' or 'super.' then skip this statement.
415-
bool isConvenient = CD->isConvenienceInit();
416-
diagnose(StartLoc, diag::invalid_nested_init, isConvenient)
417-
.fixItInsert(StartLoc, isConvenient ? "self." : "super.");
415+
bool isSelf = !CD->isDesignatedInit() || !isa<ClassDecl>(CD->getParent());
416+
diagnose(StartLoc, diag::invalid_nested_init, isSelf)
417+
.fixItInsert(StartLoc, isSelf ? "self." : "super.");
418418
NeedParseErrorRecovery = true;
419419
} else {
420420
ParserStatus ExprOrStmtStatus = parseExprOrStmt(Result);

test/Parse/init_deinit.swift

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,11 +103,21 @@ func barFunc() {
103103
// SR-852
104104
class Aaron {
105105
init(x: Int) {}
106-
convenience init() { init(x: 1) } // expected-error {{missing 'self.' at initializer invocation}}
106+
convenience init() { init(x: 1) } // expected-error {{missing 'self.' at initializer invocation}} {{24-24=self.}}
107107
}
108108

109109
class Theodosia: Aaron {
110110
init() {
111-
init(x: 2) // expected-error {{missing 'super.' at initializer invocation}}
111+
init(x: 2) // expected-error {{missing 'super.' at initializer invocation}} {{5-5=super.}}
112112
}
113113
}
114+
115+
struct AaronStruct {
116+
init(x: Int) {}
117+
init() { init(x: 1) } // expected-error {{missing 'self.' at initializer invocation}} {{12-12=self.}}
118+
}
119+
120+
enum AaronEnum: Int {
121+
case A = 1
122+
init(x: Int) { init(rawValue: x)! } // expected-error {{missing 'self.' at initializer invocation}} {{18-18=self.}}
123+
}

0 commit comments

Comments
 (0)