@@ -2520,45 +2520,61 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
2520
2520
if (!var->hasStorage ())
2521
2521
return ;
2522
2522
2523
+ if (var->isInvalid () || PBD->isInvalid ())
2524
+ return ;
2525
+
2523
2526
auto *varDC = var->getDeclContext ();
2524
2527
2525
- // Non-member observing properties need an initializer.
2526
- if (var->getWriteImpl () == WriteImplKind::StoredWithObservers &&
2527
- !isTypeContext && !var->isInvalid () && !PBD->isInvalid ()) {
2528
- TC.diagnose (var->getLoc (), diag::observingprop_requires_initializer);
2528
+ auto markVarAndPBDInvalid = [PBD, var] {
2529
2529
PBD->setInvalid ();
2530
2530
var->setInvalid ();
2531
- if (!var->hasType ()) {
2531
+ if (!var->hasType ())
2532
2532
var->markInvalid ();
2533
- }
2533
+ };
2534
+
2535
+ // Non-member observing properties need an initializer.
2536
+ if (var->getWriteImpl () == WriteImplKind::StoredWithObservers &&
2537
+ !isTypeContext) {
2538
+ TC.diagnose (var->getLoc (), diag::observingprop_requires_initializer);
2539
+ markVarAndPBDInvalid ();
2534
2540
return ;
2535
2541
}
2536
2542
2537
2543
// Static/class declarations require an initializer unless in a
2538
2544
// protocol.
2539
- if (var->isStatic () && !isa<ProtocolDecl>(varDC) &&
2540
- !var->isInvalid () && !PBD->isInvalid ()) {
2545
+ if (var->isStatic () && !isa<ProtocolDecl>(varDC)) {
2546
+ // ...but don't enforce this for SIL or textual interface files.
2547
+ switch (varDC->getParentSourceFile ()->Kind ) {
2548
+ case SourceFileKind::Interface:
2549
+ case SourceFileKind::SIL:
2550
+ return ;
2551
+ case SourceFileKind::Main:
2552
+ case SourceFileKind::REPL:
2553
+ case SourceFileKind::Library:
2554
+ break ;
2555
+ }
2556
+
2541
2557
TC.diagnose (var->getLoc (), diag::static_requires_initializer,
2542
2558
var->getCorrectStaticSpelling ());
2543
- PBD->setInvalid ();
2544
- var->setInvalid ();
2545
- if (!var->hasType ()) {
2546
- var->markInvalid ();
2547
- }
2559
+ markVarAndPBDInvalid ();
2548
2560
return ;
2549
2561
}
2550
2562
2551
- // Global variables require an initializer (except in top level code) .
2552
- if (varDC->isModuleScopeContext () &&
2553
- ! varDC->getParentSourceFile ()->isScriptMode () &&
2554
- !var-> isInvalid () && !PBD-> isInvalid ()) {
2555
- TC. diagnose (var-> getLoc (),
2556
- diag::global_requires_initializer, var-> isLet ());
2557
- PBD-> setInvalid ();
2558
- var-> setInvalid () ;
2559
- if (!var-> hasType ()) {
2560
- var-> markInvalid () ;
2563
+ // Global variables require an initializer in normal source files .
2564
+ if (varDC->isModuleScopeContext ()) {
2565
+ switch ( varDC->getParentSourceFile ()->Kind ) {
2566
+ case SourceFileKind::Main:
2567
+ case SourceFileKind::REPL:
2568
+ case SourceFileKind::Interface:
2569
+ case SourceFileKind::SIL:
2570
+ return ;
2571
+ case SourceFileKind::Library:
2572
+ break ;
2561
2573
}
2574
+
2575
+ TC.diagnose (var->getLoc (), diag::global_requires_initializer,
2576
+ var->isLet ());
2577
+ markVarAndPBDInvalid ();
2562
2578
return ;
2563
2579
}
2564
2580
});
0 commit comments