@@ -14,8 +14,29 @@ struct Box<T> {
14
14
let t : T
15
15
}
16
16
17
+ protocol EmptyP { }
18
+
19
+ struct AddressOnlyStruct : EmptyP { }
20
+
17
21
func s010_hasVarArg( _ args: Any ... ) { }
18
22
23
+ // Tests Address only enums's construction
24
+ // CHECK-LABEL: sil shared [transparent] @_T020opaque_values_silgen15AddressOnlyEnumO4mereAcA6EmptyP_pcACmF : $@convention(method) (@in EmptyP, @thin AddressOnlyEnum.Type) -> @out AddressOnlyEnum {
25
+ // CHECK: bb0([[ARG0:%.*]] : $EmptyP, [[ARG1:%.*]] : $@thin AddressOnlyEnum.Type):
26
+ // CHECK: [[RETVAL:%.*]] = enum $AddressOnlyEnum, #AddressOnlyEnum.mere!enumelt.1, [[ARG0]] : $EmptyP
27
+ // CHECK: return [[RETVAL]] : $AddressOnlyEnum
28
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen15AddressOnlyEnumO4mereAcA6EmptyP_pcACmF'
29
+ // CHECK-LABEL: sil shared [transparent] [thunk] @_T020opaque_values_silgen15AddressOnlyEnumO4mereAcA6EmptyP_pcACmFTc : $@convention(thin) (@thin AddressOnlyEnum.Type) -> @owned @callee_owned (@in EmptyP) -> @out AddressOnlyEnum {
30
+ // CHECK: bb0([[ARG:%.*]] : $@thin AddressOnlyEnum.Type):
31
+ // CHECK: [[RETVAL:%.*]] = partial_apply {{.*}}([[ARG]]) : $@convention(method) (@in EmptyP, @thin AddressOnlyEnum.Type) -> @out AddressOnlyEnum
32
+ // CHECK: return [[RETVAL]] : $@callee_owned (@in EmptyP) -> @out AddressOnlyEnum
33
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen15AddressOnlyEnumO4mereAcA6EmptyP_pcACmFTc'
34
+ enum AddressOnlyEnum {
35
+ case nought
36
+ case mere( EmptyP )
37
+ case phantom( AddressOnlyStruct )
38
+ }
39
+
19
40
// Test that we still use addresses when dealing with array initialization
20
41
// ---
21
42
// CHECK-LABEL: sil @_T020opaque_values_silgen21s020_______callVarArgyyF : $@convention(thin) () -> () {
@@ -411,6 +432,34 @@ func s250_________testBoxT() {
411
432
let _ = Box ( t: 42 )
412
433
}
413
434
435
+ // Tests Address only enums
436
+ // ---
437
+ // CHECK-LABEL: sil hidden @_T020opaque_values_silgen21s260_______AOnly_enumyAA17AddressOnlyStructVF : $@convention(thin) (AddressOnlyStruct) -> () {
438
+ // CHECK: bb0([[ARG:%.*]] : $AddressOnlyStruct):
439
+ // CHECK: [[MTYPE1:%.*]] = metatype $@thin AddressOnlyEnum.Type
440
+ // CHECK: [[APPLY1:%.*]] = apply {{.*}}([[MTYPE1]]) : $@convention(thin) (@thin AddressOnlyEnum.Type) -> @owned @callee_owned (@in EmptyP) -> @out AddressOnlyEnum
441
+ // CHECK: destroy_value [[APPLY1]]
442
+ // CHECK: [[MTYPE2:%.*]] = metatype $@thin AddressOnlyEnum.Type
443
+ // CHECK: [[ENUM1:%.*]] = enum $AddressOnlyEnum, #AddressOnlyEnum.nought!enumelt
444
+ // CHECK: [[MTYPE3:%.*]] = metatype $@thin AddressOnlyEnum.Type
445
+ // CHECK: [[INIT_OPAQUE:%.*]] = init_existential_opaque [[ARG]] : $AddressOnlyStruct, $AddressOnlyStruct, $EmptyP
446
+ // CHECK: [[ENUM2:%.*]] = enum $AddressOnlyEnum, #AddressOnlyEnum.mere!enumelt.1, [[INIT_OPAQUE]] : $EmptyP
447
+ // CHECK: destroy_value [[ENUM2]]
448
+ // CHECK: [[MTYPE4:%.*]] = metatype $@thin AddressOnlyEnum.Type
449
+ // CHECK: [[ENUM3:%.*]] = enum $AddressOnlyEnum, #AddressOnlyEnum.phantom!enumelt.1, [[ARG]] : $AddressOnlyStruct
450
+ // CHECK: return %{{.*}} : $()
451
+ // CHECK-LABEL: } // end sil function '_T020opaque_values_silgen21s260_______AOnly_enumyAA17AddressOnlyStructVF'
452
+ func s260_______AOnly_enum( _ s: AddressOnlyStruct ) {
453
+ _ = AddressOnlyEnum . mere
454
+
455
+ _ = AddressOnlyEnum . nought
456
+
457
+ _ = AddressOnlyEnum . mere ( s)
458
+
459
+ _ = AddressOnlyEnum . phantom ( s)
460
+ }
461
+
462
+
414
463
// Tests conditional value casts and correspondingly generated reabstraction thunk, with <T> types
415
464
// ---
416
465
// CHECK-LABEL: sil hidden @_T020opaque_values_silgen21s999_____condTFromAnyyyp_xtlF : $@convention(thin) <T> (@in Any, @in T) -> () {
0 commit comments