|
92 | 92 | return %28 : $()
|
93 | 93 | }
|
94 | 94 |
|
| 95 | +// CHECK-LABEL: sil shared [noinline] @testSpecializedS1Negative : $@convention(thin) (S1<Int8>) -> () { |
| 96 | +// CHECK: bb0(%0 : $S1<Int8>): |
| 97 | +// CHECK: [[EXIS:%.*]] = alloc_stack $HasFoo |
| 98 | +// CHECK: [[VAL:%.*]] = alloc_stack $S1<Int8> |
| 99 | +// CHECK: store %0 to [[VAL]] : $*S1<Int8> |
| 100 | +// CHECK: [[OPT:%.*]] = alloc_stack $Optional<HasFoo> |
| 101 | +// CHECK: [[IEDA:%.*]] = init_enum_data_addr [[OPT]] : $*Optional<HasFoo>, #Optional.some!enumelt.1 |
| 102 | +// CHECK: checked_cast_addr_br take_always S1<Int8> in [[VAL]] : $*S1<Int8> to HasFoo in [[IEDA]] : $*HasFoo, bb1, bb2 |
| 103 | +// bbs... |
| 104 | +// CHECK: switch_enum_addr [[OPT]] : $*Optional<HasFoo>, case #Optional.some!enumelt.1: bb4, case #Optional.none!enumelt: bb5 |
| 105 | +// bbs... |
| 106 | +// CHECK: [[UNWRAP:%.*]] = unchecked_take_enum_data_addr [[OPT]] : $*Optional<HasFoo>, #Optional.some!enumelt.1 |
| 107 | +// CHECK: copy_addr [take] [[UNWRAP]] to [initialization] [[EXIS]] : $*HasFoo |
| 108 | +// CHECK: [[OPEN:%.*]] = open_existential_addr immutable_access [[EXIS]] : $*HasFoo to $*@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo |
| 109 | +// CHECK: [[WM:%.*]] = witness_method $@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo, #HasFoo.foo!1 : <Self where Self : HasFoo> (Self) -> () -> (), [[OPEN]] : $*@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo : $@convention(witness_method: HasFoo) <τ_0_0 where τ_0_0 : HasFoo> (@in_guaranteed τ_0_0) -> () |
| 110 | +// CHECK: apply [[WM]]<@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo>([[OPEN]]) : $@convention(witness_method: HasFoo) <τ_0_0 where τ_0_0 : HasFoo> (@in_guaranteed τ_0_0) -> () |
| 111 | +// CHECK-LABEL: } // end sil function 'testSpecializedS1Negative' |
| 112 | +sil shared [noinline] @testSpecializedS1Negative : $@convention(thin) (S1<Int8>) -> () { |
| 113 | +bb0(%0 : $S1<Int8>): |
| 114 | + debug_value %0 : $S1<Int8>, let, name "t", argno 1 |
| 115 | + debug_value %0 : $S1<Int8>, let, name "t", argno 1 |
| 116 | + %3 = alloc_stack $HasFoo |
| 117 | + %4 = alloc_stack $S1<Int8> |
| 118 | + store %0 to %4 : $*S1<Int8> |
| 119 | + %6 = alloc_stack $Optional<HasFoo> |
| 120 | + %7 = init_enum_data_addr %6 : $*Optional<HasFoo>, #Optional.some!enumelt.1 |
| 121 | + checked_cast_addr_br take_always S1<Int8> in %4 : $*S1<Int8> to HasFoo in %7 : $*HasFoo, bb1, bb2 |
| 122 | + |
| 123 | +bb1: |
| 124 | + inject_enum_addr %6 : $*Optional<HasFoo>, #Optional.some!enumelt.1 |
| 125 | + br bb3 |
| 126 | + |
| 127 | +bb2: |
| 128 | + inject_enum_addr %6 : $*Optional<HasFoo>, #Optional.none!enumelt |
| 129 | + br bb3 |
| 130 | + |
| 131 | +bb3: |
| 132 | + switch_enum_addr %6 : $*Optional<HasFoo>, case #Optional.some!enumelt.1: bb4, case #Optional.none!enumelt: bb5 |
| 133 | + |
| 134 | +bb4: |
| 135 | + %14 = unchecked_take_enum_data_addr %6 : $*Optional<HasFoo>, #Optional.some!enumelt.1 |
| 136 | + copy_addr [take] %14 to [initialization] %3 : $*HasFoo |
| 137 | + dealloc_stack %6 : $*Optional<HasFoo> |
| 138 | + dealloc_stack %4 : $*S1<Int8> |
| 139 | + %18 = open_existential_addr immutable_access %3 : $*HasFoo to $*@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo |
| 140 | + %19 = witness_method $@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo, #HasFoo.foo!1 : <Self where Self : HasFoo> (Self) -> () -> (), %18 : $*@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo : $@convention(witness_method: HasFoo) <τ_0_0 where τ_0_0 : HasFoo> (@in_guaranteed τ_0_0) -> () |
| 141 | + %20 = apply %19<@opened("4E16CBC0-FD9F-11E8-A311-D0817AD9F6DD") HasFoo>(%18) : $@convention(witness_method: HasFoo) <τ_0_0 where τ_0_0 : HasFoo> (@in_guaranteed τ_0_0) -> () |
| 142 | + destroy_addr %3 : $*HasFoo |
| 143 | + br bb6 |
| 144 | + |
| 145 | +bb5: |
| 146 | + destroy_addr %6 : $*Optional<HasFoo> |
| 147 | + dealloc_stack %6 : $*Optional<HasFoo> |
| 148 | + dealloc_stack %4 : $*S1<Int8> |
| 149 | + br bb6 |
| 150 | + |
| 151 | +bb6: |
| 152 | + dealloc_stack %3 : $*HasFoo |
| 153 | + %28 = tuple () |
| 154 | + return %28 : $() |
| 155 | +} |
| 156 | + |
95 | 157 | struct S2<T> {
|
96 | 158 | init(_: T) {}
|
97 | 159 | }
|
|
0 commit comments