Skip to content

Commit 3b8f44b

Browse files
authored
Merge pull request #34674 from CodaFi/in-a-class-of-ones-own
2 parents c114a2f + 6b3872d commit 3b8f44b

File tree

3 files changed

+48
-13
lines changed

3 files changed

+48
-13
lines changed

include/swift/AST/DiagnosticsSema.def

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1554,10 +1554,13 @@ ERROR(observingprop_requires_initializer,none,
15541554
"non-member observing properties require an initializer", ())
15551555
ERROR(global_requires_initializer,none,
15561556
"global '%select{var|let}0' declaration requires an initializer expression"
1557-
"%select{ or getter/setter specifier|}0", (bool))
1557+
"%select{ or an explicitly stated getter|}0", (bool))
15581558
ERROR(static_requires_initializer,none,
1559-
"%select{ERROR|'static var'|'class var'|}0 declaration requires an initializer "
1560-
"expression or getter/setter specifier", (StaticSpellingKind))
1559+
"'%select{ERROR|static|class|}0 %select{var|let}1' declaration requires "
1560+
"an initializer expression or an explicitly stated getter",
1561+
(StaticSpellingKind, bool))
1562+
NOTE(static_requires_initializer_add_init,none,
1563+
"add an initializer to silence this error", ())
15611564
ERROR(pattern_type_access,none,
15621565
"%select{%select{variable|constant}0|property}1 "
15631566
"%select{must be declared %select{"

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1622,7 +1622,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16221622
Ctx.evaluator, PatternBindingEntryRequest{PBD, i}, nullptr);
16231623
assert(entry && "No pattern binding entry?");
16241624

1625-
PBD->getPattern(i)->forEachVariable([&](VarDecl *var) {
1625+
const auto *Pat = PBD->getPattern(i);
1626+
Pat->forEachVariable([&](VarDecl *var) {
16261627
this->visitBoundVariable(var);
16271628

16281629
if (PBD->isInitialized(i)) {
@@ -1680,7 +1681,10 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16801681
}
16811682

16821683
var->diagnose(diag::static_requires_initializer,
1683-
var->getCorrectStaticSpelling());
1684+
var->getCorrectStaticSpelling(),
1685+
var->isLet());
1686+
var->diagnose(diag::static_requires_initializer_add_init)
1687+
.fixItInsert(Pat->getEndLoc(), " = <#initializer#>");
16841688
markVarAndPBDInvalid();
16851689
return;
16861690
}
@@ -1697,6 +1701,8 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
16971701
}
16981702

16991703
var->diagnose(diag::global_requires_initializer, var->isLet());
1704+
var->diagnose(diag::static_requires_initializer_add_init)
1705+
.fixItInsert(Pat->getEndLoc(), " = <#initializer#>");
17001706
markVarAndPBDInvalid();
17011707
return;
17021708
}

test/decl/var/static_var.swift

Lines changed: 34 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,27 @@
22

33
// See also rdar://15626843.
44
static var gvu1: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
5-
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
5+
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
6+
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
67
class var gvu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
7-
// expected-error@-1 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
8+
// expected-error@-1 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
9+
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
810
override static var gvu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
911
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
10-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
12+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
13+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
1114
override class var gvu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
1215
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
13-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
16+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
17+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
1418
static override var gvu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
1519
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
16-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
20+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
21+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
1722
class override var gvu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
1823
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
19-
// expected-error@-2 {{global 'var' declaration requires an initializer expression or getter/setter specifier}}
24+
// expected-error@-2 {{global 'var' declaration requires an initializer expression or an explicitly stated getter}}
25+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
2026

2127
static var gvu7: Int { // expected-error {{static properties may only be declared on a type}}{{1-8=}}
2228
return 42
@@ -28,20 +34,26 @@ class var gvu8: Int { // expected-error {{class properties may only be declared
2834

2935
static let glu1: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
3036
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
37+
// expected-note@-2 {{add an initializer to silence this error}} {{18-18= = <#initializer#>}}
3138
class let glu2: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
3239
// expected-error@-1 {{global 'let' declaration requires an initializer expression}}
40+
// expected-note@-2 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
3341
override static let glu3: Int // expected-error {{static properties may only be declared on a type}}{{10-17=}}
3442
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
3543
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
44+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
3645
override class let glu4: Int // expected-error {{class properties may only be declared on a type}}{{10-16=}}
3746
// expected-error@-1 {{'override' can only be specified on class members}}{{1-10=}}
3847
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
48+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
3949
static override let glu5: Int // expected-error {{static properties may only be declared on a type}}{{1-8=}}
4050
// expected-error@-1 {{'override' can only be specified on class members}}{{8-17=}}
4151
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
52+
// expected-note@-3 {{add an initializer to silence this error}} {{27-27= = <#initializer#>}}
4253
class override let glu6: Int // expected-error {{class properties may only be declared on a type}}{{1-7=}}
4354
// expected-error@-1 {{'override' can only be specified on class members}}{{7-16=}}
4455
// expected-error@-2 {{global 'let' declaration requires an initializer expression}}
56+
// expected-note@-3 {{add an initializer to silence this error}} {{26-26= = <#initializer#>}}
4557

4658

4759
static var gvi1: Int = 0 // expected-error {{static properties may only be declared on a type}}{{1-8=}}
@@ -187,7 +199,8 @@ extension P {
187199

188200
struct S1 {
189201
// rdar://15626843
190-
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or getter/setter specifier}}
202+
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
203+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
191204
var y = 1
192205

193206
static var z = 5
@@ -205,7 +218,20 @@ enum E1 {
205218
}
206219

207220
class C1 {
208-
class var x: Int // expected-error {{class stored properties not supported}} expected-error {{'class var' declaration requires an initializer expression or getter/setter specifier}}
221+
class var x: Int // expected-error {{class stored properties not supported}} expected-error {{'class var' declaration requires an initializer expression or an explicitly stated getter}}
222+
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
223+
class let x: Int // expected-error {{class stored properties not supported}} expected-error {{'class let' declaration requires an initializer expression or an explicitly stated getter}}
224+
// expected-note@-1 {{add an initializer to silence this error}} {{16-16= = <#initializer#>}}
225+
static var x: Int // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
226+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
227+
static let x: Int // expected-error {{'static let' declaration requires an initializer expression or an explicitly stated getter}}
228+
// expected-note@-1 {{add an initializer to silence this error}} {{17-17= = <#initializer#>}}
229+
230+
// FIXME: We immediately invalidate the pattern binding after the first error
231+
// is emitted, but we could definitely emit a second round of fixits for the
232+
// other pattern here.
233+
static var (x, y): (Int, Int), (z, w): (Int, Int) // expected-error {{'static var' declaration requires an initializer expression or an explicitly stated getter}}
234+
// expected-note@-1 {{add an initializer to silence this error}} {{31-31= = <#initializer#>}}
209235
}
210236

211237
class C2 {

0 commit comments

Comments
 (0)