@@ -18,6 +18,10 @@ public class TClass {
1818 deinit
1919}
2020
21+ struct GenericStruct<T> {
22+ var x: T
23+ }
24+
2125let nontrivialglobal: TClass
2226
2327// CHECK-LABEL: sil_global hidden [let] @$trivialglobal : $TStruct = {
@@ -32,6 +36,9 @@ sil_global private @globalinit_nontrivialglobal_token : $Builtin.Word
3236
3337sil_global hidden [let] @$nontrivialglobal : $TClass
3438
39+ sil_global hidden [let] @empty_global : $GenericStruct<()>
40+ sil_global private @empty_global_token : $Builtin.Word
41+
3542sil private [global_init_once_fn] [ossa] @globalinit_trivialglobal_func : $@convention(c) () -> () {
3643bb0:
3744 alloc_global @$trivialglobal
@@ -126,3 +133,28 @@ bb0:
126133 return %5 : $Int32
127134}
128135
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