@@ -18,6 +18,10 @@ public class TClass {
18
18
deinit
19
19
}
20
20
21
+ struct GenericStruct<T> {
22
+ var x: T
23
+ }
24
+
21
25
let nontrivialglobal: TClass
22
26
23
27
// CHECK-LABEL: sil_global hidden [let] @$trivialglobal : $TStruct = {
@@ -32,6 +36,9 @@ sil_global private @globalinit_nontrivialglobal_token : $Builtin.Word
32
36
33
37
sil_global hidden [let] @$nontrivialglobal : $TClass
34
38
39
+ sil_global hidden [let] @empty_global : $GenericStruct<()>
40
+ sil_global private @empty_global_token : $Builtin.Word
41
+
35
42
sil private [global_init_once_fn] [ossa] @globalinit_trivialglobal_func : $@convention(c) () -> () {
36
43
bb0:
37
44
alloc_global @$trivialglobal
@@ -126,3 +133,28 @@ bb0:
126
133
return %5 : $Int32
127
134
}
128
135
136
+ // Check that we don't crash on an initializer struct with an "undef" operand.
137
+ // CHECK-LABEL: sil hidden [global_init_once_fn] [ossa] @globalinit_empty_global :
138
+ // CHECK: struct $GenericStruct<()> (undef : $())
139
+ // CHECK-LABEL: } // end sil function 'globalinit_empty_global'
140
+ sil hidden [global_init_once_fn] [ossa] @globalinit_empty_global : $@convention(c) () -> () {
141
+ bb0:
142
+ alloc_global @empty_global
143
+ %1 = global_addr @empty_global : $*GenericStruct<()>
144
+ %2 = struct $GenericStruct<()> (undef : $())
145
+ store %2 to [trivial] %1 : $*GenericStruct<()>
146
+ %4 = tuple ()
147
+ return %4 : $()
148
+ }
149
+
150
+ sil hidden [global_init] [ossa] @empty_global_accessor : $@convention(thin) () -> Builtin.RawPointer {
151
+ bb0:
152
+ %0 = global_addr @empty_global_token : $*Builtin.Word
153
+ %1 = address_to_pointer %0 : $*Builtin.Word to $Builtin.RawPointer
154
+ %2 = function_ref @globalinit_empty_global : $@convention(c) () -> ()
155
+ %3 = builtin "once"(%1 : $Builtin.RawPointer, %2 : $@convention(c) () -> ()) : $()
156
+ %4 = global_addr @empty_global : $*GenericStruct<()>
157
+ %5 = address_to_pointer %4 : $*GenericStruct<()> to $Builtin.RawPointer
158
+ return %5 : $Builtin.RawPointer
159
+ }
160
+
0 commit comments