Skip to content

Commit 7753383

Browse files
committed
[AST] Add @_hasInitialValue to var/lets that have initializers.
The information about whether a variable/property is initialized is lost in the public interface, but is, unfortunately, required because it results in a symbol for the initializer (if a class/struct `init` is inlined, it will call initializers for properties that it doesn't initialize itself). This is important to preserve for TBD file generation. Using an attribute rather than just a bit on the VarDecl means this fits into the scheme for module interfaces: textual/valid Swift.
1 parent 1c622fd commit 7753383

12 files changed

+131
-92
lines changed

include/swift/AST/Attr.def

+4
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ SIMPLE_DECL_ATTR(_forbidSerializingReference, ForbidSerializingReference,
376376
OnAnyDecl |
377377
LongAttribute | RejectByParser | UserInaccessible | NotSerialized,
378378
77)
379+
SIMPLE_DECL_ATTR(_hasInitialValue, HasInitialValue,
380+
OnVar |
381+
UserInaccessible,
382+
78)
379383

380384
#undef TYPE_ATTR
381385
#undef DECL_ATTR_ALIAS

lib/Sema/TypeCheckAttr.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ class AttributeEarlyChecker : public AttributeVisitor<AttributeEarlyChecker> {
7171

7272
#define IGNORED_ATTR(X) void visit##X##Attr(X##Attr *) {}
7373
IGNORED_ATTR(Available)
74+
IGNORED_ATTR(HasInitialValue)
7475
IGNORED_ATTR(CDecl)
7576
IGNORED_ATTR(ClangImporterSynthesizedType)
7677
IGNORED_ATTR(Convenience)
@@ -774,6 +775,7 @@ class AttributeChecker : public AttributeVisitor<AttributeChecker> {
774775
void visit##CLASS##Attr(CLASS##Attr *) {}
775776

776777
IGNORED_ATTR(Alignment)
778+
IGNORED_ATTR(HasInitialValue)
777779
IGNORED_ATTR(ClangImporterSynthesizedType)
778780
IGNORED_ATTR(Consuming)
779781
IGNORED_ATTR(Convenience)

lib/Sema/TypeCheckConstraints.cpp

+8
Original file line numberDiff line numberDiff line change
@@ -2494,6 +2494,7 @@ bool TypeChecker::typeCheckBinding(Pattern *&pattern, Expr *&initializer,
24942494
bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
24952495
unsigned patternNumber,
24962496
bool skipApplyingSolution) {
2497+
auto &ctx = PBD->getASTContext();
24972498
const auto &pbe = PBD->getPatternList()[patternNumber];
24982499
Pattern *pattern = PBD->getPattern(patternNumber);
24992500
Expr *init = PBD->getInit(patternNumber);
@@ -2516,6 +2517,13 @@ bool TypeChecker::typeCheckPatternBinding(PatternBindingDecl *PBD,
25162517
PBD->setPattern(patternNumber, pattern, initContext);
25172518
PBD->setInit(patternNumber, init);
25182519

2520+
// Add the attribute that preserves the "has an initializer" value across
2521+
// module generation, as required for TBDGen.
2522+
PBD->getPattern(patternNumber)->forEachVariable([&](VarDecl *VD) {
2523+
if (VD->hasStorage())
2524+
VD->getAttrs().add(new (ctx) HasInitialValueAttr(/*IsImplicit=*/true));
2525+
});
2526+
25192527
if (!hadError) {
25202528
// If we're performing an binding to a weak or unowned variable from a
25212529
// constructor call, emit a warning that the instance will be immediately

lib/Sema/TypeCheckDeclOverride.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -1169,6 +1169,7 @@ namespace {
11691169
UNINTERESTING_ATTR(ClangImporterSynthesizedType)
11701170
UNINTERESTING_ATTR(WeakLinked)
11711171
UNINTERESTING_ATTR(Frozen)
1172+
UNINTERESTING_ATTR(HasInitialValue)
11721173
#undef UNINTERESTING_ATTR
11731174

11741175
void visitAvailableAttr(AvailableAttr *attr) {

test/IDE/print_ast_tc_decls.swift

+48-48
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ struct d0100_FooStruct {
108108
// PASS_COMMON-LABEL: {{^}}struct d0100_FooStruct {{{$}}
109109

110110
var instanceVar1: Int = 0
111-
// PASS_COMMON-NEXT: {{^}} var instanceVar1: Int{{$}}
111+
// PASS_COMMON-NEXT: {{^}} @_hasInitialValue var instanceVar1: Int{{$}}
112112

113113
var computedProp1: Int {
114114
get {
@@ -207,7 +207,7 @@ struct d0100_FooStruct {
207207
// PASS_COMMON-NEXT: {{^}} typealias NestedTypealias = Int{{$}}
208208

209209
static var staticVar1: Int = 42
210-
// PASS_COMMON-NEXT: {{^}} static var staticVar1: Int{{$}}
210+
// PASS_COMMON-NEXT: {{^}} @_hasInitialValue static var staticVar1: Int{{$}}
211211

212212
static var computedStaticProp1: Int {
213213
get {
@@ -303,7 +303,7 @@ extension d0100_FooStruct.ExtNestedStruct {
303303
// PASS_COMMON-NEXT: {{^}}}{{$}}
304304

305305
var fooObject: d0100_FooStruct = d0100_FooStruct()
306-
// PASS_ONE_LINE-DAG: {{^}}var fooObject: d0100_FooStruct{{$}}
306+
// PASS_ONE_LINE-DAG: {{^}}@_hasInitialValue var fooObject: d0100_FooStruct{{$}}
307307

308308
struct d0110_ReadWriteProperties {
309309
// PASS_RW_PROP_GET_SET-LABEL: {{^}}struct d0110_ReadWriteProperties {{{$}}
@@ -432,7 +432,7 @@ class d0120_TestClassBase {
432432
final class var baseClassVar3: Int { return 0 }
433433
// PASS_COMMON-NEXT: {{^}} final class var baseClassVar3: Int { get }{{$}}
434434
static var baseClassVar4: Int = 0
435-
// PASS_COMMON-NEXT: {{^}} static var baseClassVar4: Int{{$}}
435+
// PASS_COMMON-NEXT: {{^}} @_hasInitialValue static var baseClassVar4: Int{{$}}
436436
static var baseClassVar5: Int { return 0 }
437437
// PASS_COMMON-NEXT: {{^}} static var baseClassVar5: Int { get }{{$}}
438438

@@ -541,35 +541,35 @@ class d0170_TestAvailability {
541541
// PASS_EXPLODE_PATTERN-LABEL: {{^}}@objc class d0181_TestIBAttrs {{{$}}
542542

543543
@IBOutlet weak var anOutlet: d0181_TestIBAttrs!
544-
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBOutlet @_implicitly_unwrapped_optional weak var anOutlet: @sil_weak d0181_TestIBAttrs!{{$}}
544+
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBOutlet @_implicitly_unwrapped_optional @_hasInitialValue weak var anOutlet: @sil_weak d0181_TestIBAttrs!{{$}}
545545

546546
@IBInspectable var inspectableProp: Int = 0
547-
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBInspectable var inspectableProp: Int{{$}}
547+
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @IBInspectable @_hasInitialValue var inspectableProp: Int{{$}}
548548

549549
@GKInspectable var inspectableProp2: Int = 0
550-
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @GKInspectable var inspectableProp2: Int{{$}}
550+
// PASS_EXPLODE_PATTERN-NEXT: {{^}} @objc @GKInspectable @_hasInitialValue var inspectableProp2: Int{{$}}
551551
}
552552

553553
struct d0190_LetVarDecls {
554554
// PASS_PRINT_AST-LABEL: {{^}}struct d0190_LetVarDecls {{{$}}
555555
// PASS_PRINT_MODULE_INTERFACE-LABEL: {{^}}struct d0190_LetVarDecls {{{$}}
556556

557557
let instanceVar1: Int = 0
558-
// PASS_PRINT_AST-NEXT: {{^}} let instanceVar1: Int{{$}}
559-
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} let instanceVar1: Int{{$}}
558+
// PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue let instanceVar1: Int{{$}}
559+
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue let instanceVar1: Int{{$}}
560560

561561
let instanceVar2 = 0
562-
// PASS_PRINT_AST-NEXT: {{^}} let instanceVar2: Int{{$}}
563-
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} let instanceVar2: Int{{$}}
562+
// PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue let instanceVar2: Int{{$}}
563+
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue let instanceVar2: Int{{$}}
564564

565565
static let staticVar1: Int = 42
566-
// PASS_PRINT_AST-NEXT: {{^}} static let staticVar1: Int{{$}}
567-
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} static let staticVar1: Int{{$}}
566+
// PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue static let staticVar1: Int{{$}}
567+
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue static let staticVar1: Int{{$}}
568568

569569
static let staticVar2 = 42
570570
// FIXME: PRINTED_WITHOUT_TYPE
571-
// PASS_PRINT_AST-NEXT: {{^}} static let staticVar2: Int{{$}}
572-
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} static let staticVar2: Int{{$}}
571+
// PASS_PRINT_AST-NEXT: {{^}} @_hasInitialValue static let staticVar2: Int{{$}}
572+
// PASS_PRINT_MODULE_INTERFACE-NEXT: {{^}} @_hasInitialValue static let staticVar2: Int{{$}}
573573
}
574574

575575
struct d0200_EscapedIdentifiers {
@@ -612,7 +612,7 @@ struct d0200_EscapedIdentifiers {
612612
// PASS_COMMON-NEXT: {{^}} func `func`<`let`, `where`>(class: Int, struct: {{(d0200_EscapedIdentifiers.)?}}`protocol`, foo: `let`, bar: `where`) where `let` : {{(d0200_EscapedIdentifiers.)?}}`protocol`, `where` : {{(d0200_EscapedIdentifiers.)?}}`protocol`{{$}}
613613

614614
var `var`: `struct` = `struct`()
615-
// PASS_COMMON-NEXT: {{^}} var `var`: {{(d0200_EscapedIdentifiers.)?}}`struct`{{$}}
615+
// PASS_COMMON-NEXT: {{^}} @_hasInitialValue var `var`: {{(d0200_EscapedIdentifiers.)?}}`struct`{{$}}
616616

617617
var tupleType: (`var`: Int, `let`: `struct`)
618618
// PASS_COMMON-NEXT: {{^}} var tupleType: (`var`: Int, `let`: {{(d0200_EscapedIdentifiers.)?}}`struct`){{$}}
@@ -635,16 +635,16 @@ struct d0210_Qualifications {
635635
// PASS_QUAL_IF_AMBIGUOUS: {{^}}struct d0210_Qualifications {{{$}}
636636

637637
var propFromStdlib1: Int = 0
638-
// PASS_QUAL_UNQUAL-NEXT: {{^}} var propFromStdlib1: Int{{$}}
639-
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} var propFromStdlib1: Int{{$}}
638+
// PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromStdlib1: Int{{$}}
639+
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromStdlib1: Int{{$}}
640640

641641
var propFromSwift1: FooSwiftStruct = FooSwiftStruct()
642-
// PASS_QUAL_UNQUAL-NEXT: {{^}} var propFromSwift1: FooSwiftStruct{{$}}
643-
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} var propFromSwift1: foo_swift_module.FooSwiftStruct{{$}}
642+
// PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromSwift1: FooSwiftStruct{{$}}
643+
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromSwift1: foo_swift_module.FooSwiftStruct{{$}}
644644

645645
var propFromClang1: FooStruct1 = FooStruct1(x: 0, y: 0.0)
646-
// PASS_QUAL_UNQUAL-NEXT: {{^}} var propFromClang1: FooStruct1{{$}}
647-
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} var propFromClang1: FooStruct1{{$}}
646+
// PASS_QUAL_UNQUAL-NEXT: {{^}} @_hasInitialValue var propFromClang1: FooStruct1{{$}}
647+
// PASS_QUAL_IF_AMBIGUOUS-NEXT: {{^}} @_hasInitialValue var propFromClang1: FooStruct1{{$}}
648648

649649

650650
func instanceFuncFromStdlib1(a: Int) -> Float {
@@ -678,43 +678,43 @@ class d0250_ExplodePattern {
678678
var instanceVar1 = 0
679679
var instanceVar2 = 0.0
680680
var instanceVar3 = ""
681-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar1: Int{{$}}
682-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar2: Double{{$}}
683-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar3: String{{$}}
681+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar1: Int{{$}}
682+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar2: Double{{$}}
683+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar3: String{{$}}
684684

685685
var instanceVar4 = FooStruct()
686686
var (instanceVar5, instanceVar6) = (FooStruct(), FooStruct())
687687
var (instanceVar7, instanceVar8) = (FooStruct(), FooStruct())
688688
var (instanceVar9, instanceVar10) : (FooStruct, FooStruct) = (FooStruct(), FooStruct())
689689
final var (instanceVar11, instanceVar12) = (FooStruct(), FooStruct())
690-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar4: FooStruct{{$}}
691-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar5: FooStruct{{$}}
692-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar6: FooStruct{{$}}
693-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar7: FooStruct{{$}}
694-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar8: FooStruct{{$}}
695-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar9: FooStruct{{$}}
696-
// PASS_EXPLODE_PATTERN: {{^}} var instanceVar10: FooStruct{{$}}
697-
// PASS_EXPLODE_PATTERN: {{^}} final var instanceVar11: FooStruct{{$}}
698-
// PASS_EXPLODE_PATTERN: {{^}} final var instanceVar12: FooStruct{{$}}
690+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar4: FooStruct{{$}}
691+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar5: FooStruct{{$}}
692+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar6: FooStruct{{$}}
693+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar7: FooStruct{{$}}
694+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar8: FooStruct{{$}}
695+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar9: FooStruct{{$}}
696+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue var instanceVar10: FooStruct{{$}}
697+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final var instanceVar11: FooStruct{{$}}
698+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final var instanceVar12: FooStruct{{$}}
699699

700700
let instanceLet1 = 0
701701
let instanceLet2 = 0.0
702702
let instanceLet3 = ""
703-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet1: Int{{$}}
704-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet2: Double{{$}}
705-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet3: String{{$}}
703+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet1: Int{{$}}
704+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet2: Double{{$}}
705+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet3: String{{$}}
706706

707707
let instanceLet4 = FooStruct()
708708
let (instanceLet5, instanceLet6) = (FooStruct(), FooStruct())
709709
let (instanceLet7, instanceLet8) = (FooStruct(), FooStruct())
710710
let (instanceLet9, instanceLet10) : (FooStruct, FooStruct) = (FooStruct(), FooStruct())
711-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet4: FooStruct{{$}}
712-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet5: FooStruct{{$}}
713-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet6: FooStruct{{$}}
714-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet7: FooStruct{{$}}
715-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet8: FooStruct{{$}}
716-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet9: FooStruct{{$}}
717-
// PASS_EXPLODE_PATTERN: {{^}} final let instanceLet10: FooStruct{{$}}
711+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet4: FooStruct{{$}}
712+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet5: FooStruct{{$}}
713+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet6: FooStruct{{$}}
714+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet7: FooStruct{{$}}
715+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet8: FooStruct{{$}}
716+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet9: FooStruct{{$}}
717+
// PASS_EXPLODE_PATTERN: {{^}} @_hasInitialValue final let instanceLet10: FooStruct{{$}}
718718
}
719719

720720
class d0260_ExplodePattern_TestClassBase {
@@ -879,11 +879,11 @@ protocol AssociatedType1 {
879879
//===---
880880

881881
var d0300_topLevelVar1: Int = 42
882-
// PASS_COMMON: {{^}}var d0300_topLevelVar1: Int{{$}}
882+
// PASS_COMMON: {{^}}@_hasInitialValue var d0300_topLevelVar1: Int{{$}}
883883
// PASS_COMMON-NOT: d0300_topLevelVar1
884884

885885
var d0400_topLevelVar2: Int = 42
886-
// PASS_COMMON: {{^}}var d0400_topLevelVar2: Int{{$}}
886+
// PASS_COMMON: {{^}}@_hasInitialValue var d0400_topLevelVar2: Int{{$}}
887887
// PASS_COMMON-NOT: d0400_topLevelVar2
888888

889889
var d0500_topLevelVar2: Int {
@@ -902,13 +902,13 @@ class d0600_InClassVar1 {
902902
// PASS_COMMON-NOT: instanceVar1
903903

904904
var instanceVar2: Int = 42
905-
// PASS_COMMON: {{^}} var instanceVar2: Int{{$}}
905+
// PASS_COMMON: {{^}} @_hasInitialValue var instanceVar2: Int{{$}}
906906
// PASS_COMMON-NOT: instanceVar2
907907

908908
// FIXME: this is sometimes printed without a type, see PASS_EXPLODE_PATTERN.
909909
// FIXME: PRINTED_WITHOUT_TYPE
910910
var instanceVar3 = 42
911-
// PASS_COMMON: {{^}} var instanceVar3
911+
// PASS_COMMON: {{^}} @_hasInitialValue var instanceVar3
912912
// PASS_COMMON-NOT: instanceVar3
913913

914914
var instanceVar4: Int {

test/IDE/reconstruct_type_from_mangled_name.swift

+6-6
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ struct Mystruct1 {
55
func s1f1() -> Int { return 0 }
66
// CHECK: decl: func s1f1() -> Int
77
var intField = 3
8-
// CHECK: decl: var intField: Int
8+
// CHECK: decl: @_hasInitialValue var intField: Int
99
// CHECK: decl: init(intField: Int)
1010
// CHECK: decl: init()
1111
}
@@ -22,22 +22,22 @@ struct MyStruct2 {
2222
class Myclass1 {
2323
// CHECK: decl: class Myclass1
2424
var intField = 4
25-
// CHECK: decl: var intField: Int
25+
// CHECK: decl: @_hasInitialValue var intField: Int
2626
// CHECK: decl: init()
2727
}
2828

2929
func f1() {
3030
// CHECK: decl: func f1()
3131
var s1ins = Mystruct1() // Implicit ctor
32-
// CHECK: decl: var s1ins: Mystruct1
32+
// CHECK: decl: @_hasInitialValue var s1ins: Mystruct1
3333
_ = Mystruct1(intField: 1) // Implicit ctor
3434

3535
s1ins.intField = 34
3636
// CHECK: type: Mystruct1
3737
// CHECK: type: Int
3838

3939
var c1ins = Myclass1()
40-
// CHECK: decl: var c1ins: Myclass1
40+
// CHECK: decl: @_hasInitialValue var c1ins: Myclass1
4141
// CHECK: type: Myclass1
4242

4343
c1ins.intField = 3
@@ -59,7 +59,7 @@ class Myclass2 {
5959
// CHECK: decl: func f1()
6060

6161
var arr1 = [1, 2]
62-
// CHECK: decl: var arr1: [Int]
62+
// CHECK: decl: @_hasInitialValue var arr1: [Int]
6363
// CHECK: type: Array<Int>
6464

6565
arr1.append(1)
@@ -151,7 +151,7 @@ struct MyGenStruct1<T, U: ExpressibleByStringLiteral, V: Sequence> {
151151
}
152152

153153
let genstruct1 = MyGenStruct1<Int, String, [Float]>(x: 1, y: "", z: [1.0])
154-
// CHECK: decl: let genstruct1: MyGenStruct1<Int, String, [Float]>
154+
// CHECK: decl: @_hasInitialValue let genstruct1: MyGenStruct1<Int, String, [Float]>
155155

156156
func test001() {
157157
// CHECK: decl: func test001()

test/SIL/Parser/final.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
// RUN: %target-swift-frontend %s -emit-silgen | %FileCheck %s
22

33
// CHECK: final class Rect
4-
// CHECK: @sil_stored final var orgx: Double
4+
// CHECK: @sil_stored @_hasInitialValue final var orgx: Double
55
final class Rect {
66
var orgx = 0.0
77
}
88

99
protocol P { }
1010
// CHECK: struct Rect2 : P {
11-
// CHECK: @sil_stored var orgx: Double
11+
// CHECK: @sil_stored @_hasInitialValue var orgx: Double
1212
struct Rect2 : P {
1313
var orgx = 0.0
1414
}

test/api-digester/Outputs/cake.json

+2
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,7 @@
232232
"location": "",
233233
"moduleName": "cake",
234234
"declAttributes": [
235+
"HasInitialValue",
235236
"ReferenceOwnership"
236237
],
237238
"ownership": 1,
@@ -313,6 +314,7 @@
313314
"location": "",
314315
"moduleName": "cake",
315316
"declAttributes": [
317+
"HasInitialValue",
316318
"ReferenceOwnership"
317319
],
318320
"ownership": 2,

test/attr/attr_dynamic_infer.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ extension FinalTests {
7979
set { }
8080
}
8181

82-
// CHECK: @objc static var x
82+
// CHECK: @objc @_hasInitialValue static var x
8383
@objc static var x: Int = 0
8484

8585
// CHECK: @objc static func bar

0 commit comments

Comments
 (0)