Skip to content

Commit a03d4d0

Browse files
authored
Merge pull request swiftlang#21246 from atrick/cast-conditional-negative-test
Add a negative test case for cast optimizer conditional conformance.
2 parents 2fc4d46 + 126b316 commit a03d4d0

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

test/SILOptimizer/cast_optimizer_conditional_conformance.sil

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,68 @@ bb6:
9292
return %28 : $()
9393
}
9494

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+
95157
struct S2<T> {
96158
init(_: T) {}
97159
}

0 commit comments

Comments
 (0)