xref: /aosp_15_r20/external/llvm/test/Verifier/invalid-eh.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T1:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK1 %s
2*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T2:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s
3*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T3:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK3 %s
4*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T4:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK4 %s
5*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T5:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK5 %s
6*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T6:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK6 %s
7*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T7:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK7 %s
8*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T8:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK8 %s
9*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T9:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK9 %s
10*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T10:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK10 %s
11*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T11:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK11 %s
12*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T12:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK12 %s
13*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T13:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK13 %s
14*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T14:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK14 %s
15*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T15:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK15 %s
16*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T16:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK16 %s
17*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T17:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK17 %s
18*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T18:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK18 %s
19*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T19:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK19 %s
20*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T20:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK20 %s
21*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T21:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK21 %s
22*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T22:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK22 %s
23*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T23:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK23 %s
24*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T24:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK24 %s
25*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T25:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK25 %s
26*9880d681SAndroid Build Coastguard Worker; RUN: sed -e s/.T26:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK26 %s
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdeclare void @g()
29*9880d681SAndroid Build Coastguard Worker
30*9880d681SAndroid Build Coastguard Worker;T1: define void @f() {
31*9880d681SAndroid Build Coastguard Worker;T1:   entry:
32*9880d681SAndroid Build Coastguard Worker;T1:     catchret from undef to label %next
33*9880d681SAndroid Build Coastguard Worker;T1:     ; CHECK1: CatchReturnInst needs to be provided a CatchPad
34*9880d681SAndroid Build Coastguard Worker;T1:   next:
35*9880d681SAndroid Build Coastguard Worker;T1:     unreachable
36*9880d681SAndroid Build Coastguard Worker;T1: }
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Worker;T2: define void @f() {
39*9880d681SAndroid Build Coastguard Worker;T2:   entry:
40*9880d681SAndroid Build Coastguard Worker;T2:     %x = cleanuppad within none []
41*9880d681SAndroid Build Coastguard Worker;T2:     ; catchret's first operand's operator must be catchpad
42*9880d681SAndroid Build Coastguard Worker;T2:     catchret from %x to label %entry
43*9880d681SAndroid Build Coastguard Worker;T2:     ; CHECK2: CatchReturnInst needs to be provided a CatchPad
44*9880d681SAndroid Build Coastguard Worker;T2: }
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker;T3: define void @f() {
47*9880d681SAndroid Build Coastguard Worker;T3:   entry:
48*9880d681SAndroid Build Coastguard Worker;T3:     cleanupret from undef unwind label %next
49*9880d681SAndroid Build Coastguard Worker;T3:     ; CHECK3: CleanupReturnInst needs to be provided a CleanupPad
50*9880d681SAndroid Build Coastguard Worker;T3:   next:
51*9880d681SAndroid Build Coastguard Worker;T3:     unreachable
52*9880d681SAndroid Build Coastguard Worker;T3: }
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Worker;T4: define void @f() {
55*9880d681SAndroid Build Coastguard Worker;T4:   entry:
56*9880d681SAndroid Build Coastguard Worker;T4:     %cs = catchswitch within none [label %next] unwind to caller
57*9880d681SAndroid Build Coastguard Worker;T4:   next:
58*9880d681SAndroid Build Coastguard Worker;T4:     %x = catchpad within %cs []
59*9880d681SAndroid Build Coastguard Worker;T4:     ; cleanupret first operand's operator must be cleanuppad
60*9880d681SAndroid Build Coastguard Worker;T4:     cleanupret from %x unwind to caller
61*9880d681SAndroid Build Coastguard Worker;T4:     ; CHECK4: CleanupReturnInst needs to be provided a CleanupPad
62*9880d681SAndroid Build Coastguard Worker;T4: }
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Worker;T5: define void @f() personality void ()* @g {
65*9880d681SAndroid Build Coastguard Worker;T5:   entry:
66*9880d681SAndroid Build Coastguard Worker;T5:     ret void
67*9880d681SAndroid Build Coastguard Worker;T5:   switch:
68*9880d681SAndroid Build Coastguard Worker;T5:     %cs = catchswitch within none [label %catch] unwind to caller
69*9880d681SAndroid Build Coastguard Worker;T5:   catch:
70*9880d681SAndroid Build Coastguard Worker;T5:     catchpad within %cs []
71*9880d681SAndroid Build Coastguard Worker;T5:     unreachable
72*9880d681SAndroid Build Coastguard Worker;T5:   bogus:
73*9880d681SAndroid Build Coastguard Worker;T5:     cleanuppad within %cs []
74*9880d681SAndroid Build Coastguard Worker;T5:     ; CHECK5: CleanupPadInst has an invalid parent
75*9880d681SAndroid Build Coastguard Worker;T5:     unreachable
76*9880d681SAndroid Build Coastguard Worker;T5: }
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Worker;T6: define void @f() personality void ()* @g {
79*9880d681SAndroid Build Coastguard Worker;T6:   entry:
80*9880d681SAndroid Build Coastguard Worker;T6:     ret void
81*9880d681SAndroid Build Coastguard Worker;T6:   switch1:
82*9880d681SAndroid Build Coastguard Worker;T6:     %cs1 = catchswitch within none [label %catch1] unwind label %catch2
83*9880d681SAndroid Build Coastguard Worker;T6:     ; CHECK6: Block containg CatchPadInst must be jumped to only by its catchswitch
84*9880d681SAndroid Build Coastguard Worker;T6:   catch1:
85*9880d681SAndroid Build Coastguard Worker;T6:     catchpad within %cs1 []
86*9880d681SAndroid Build Coastguard Worker;T6:     unreachable
87*9880d681SAndroid Build Coastguard Worker;T6:   switch2:
88*9880d681SAndroid Build Coastguard Worker;T6:     %cs2 = catchswitch within none [label %catch2] unwind to caller
89*9880d681SAndroid Build Coastguard Worker;T6:   catch2:
90*9880d681SAndroid Build Coastguard Worker;T6:     catchpad within %cs2 []
91*9880d681SAndroid Build Coastguard Worker;T6:     unreachable
92*9880d681SAndroid Build Coastguard Worker;T6: }
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Worker;T7: define void @f() personality void ()* @g {
95*9880d681SAndroid Build Coastguard Worker;T7:   entry:
96*9880d681SAndroid Build Coastguard Worker;T7:     ret void
97*9880d681SAndroid Build Coastguard Worker;T7:   switch1:
98*9880d681SAndroid Build Coastguard Worker;T7:     %cs1 = catchswitch within none [label %catch1] unwind to caller
99*9880d681SAndroid Build Coastguard Worker;T7:   catch1:
100*9880d681SAndroid Build Coastguard Worker;T7:     catchpad within %cs1 []
101*9880d681SAndroid Build Coastguard Worker;T7:     unreachable
102*9880d681SAndroid Build Coastguard Worker;T7:   switch2:
103*9880d681SAndroid Build Coastguard Worker;T7:     %cs2 = catchswitch within %cs1 [label %catch2] unwind to caller
104*9880d681SAndroid Build Coastguard Worker;T7:     ; CHECK7: CatchSwitchInst has an invalid parent
105*9880d681SAndroid Build Coastguard Worker;T7:   catch2:
106*9880d681SAndroid Build Coastguard Worker;T7:     catchpad within %cs2 []
107*9880d681SAndroid Build Coastguard Worker;T7:     unreachable
108*9880d681SAndroid Build Coastguard Worker;T7: }
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker;T8: define void @f() personality void ()* @g {
111*9880d681SAndroid Build Coastguard Worker;T8:   entry:
112*9880d681SAndroid Build Coastguard Worker;T8:     ret void
113*9880d681SAndroid Build Coastguard Worker;T8:   switch1:
114*9880d681SAndroid Build Coastguard Worker;T8:     %cs1 = catchswitch within none [ label %switch1 ] unwind to caller
115*9880d681SAndroid Build Coastguard Worker;T8:     ; CHECK8: CatchSwitchInst handlers must be catchpads
116*9880d681SAndroid Build Coastguard Worker;T8: }
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker;T9: define void @f() personality void ()* @g {
119*9880d681SAndroid Build Coastguard Worker;T9:   entry:
120*9880d681SAndroid Build Coastguard Worker;T9:     ret void
121*9880d681SAndroid Build Coastguard Worker;T9:   cleanup:
122*9880d681SAndroid Build Coastguard Worker;T9:     %cp = cleanuppad within none []
123*9880d681SAndroid Build Coastguard Worker;T9:     invoke void @g() [ "funclet"(token %cp) ]
124*9880d681SAndroid Build Coastguard Worker;T9:       to label %exit unwind label %cleanup
125*9880d681SAndroid Build Coastguard Worker;T9:       ; CHECK9: EH pad cannot handle exceptions raised within it
126*9880d681SAndroid Build Coastguard Worker;T9:       ; CHECK9-NEXT: %cp = cleanuppad within none []
127*9880d681SAndroid Build Coastguard Worker;T9:       ; CHECK9-NEXT: invoke void @g() [ "funclet"(token %cp) ]
128*9880d681SAndroid Build Coastguard Worker;T9:   exit:
129*9880d681SAndroid Build Coastguard Worker;T9:     ret void
130*9880d681SAndroid Build Coastguard Worker;T9: }
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker;T10: define void @f() personality void ()* @g {
133*9880d681SAndroid Build Coastguard Worker;T10:   entry:
134*9880d681SAndroid Build Coastguard Worker;T10:     ret void
135*9880d681SAndroid Build Coastguard Worker;T10:   cleanup1:
136*9880d681SAndroid Build Coastguard Worker;T10:     %cp1 = cleanuppad within none []
137*9880d681SAndroid Build Coastguard Worker;T10:     unreachable
138*9880d681SAndroid Build Coastguard Worker;T10:   switch:
139*9880d681SAndroid Build Coastguard Worker;T10:     %cs = catchswitch within %cp1 [label %catch] unwind to caller
140*9880d681SAndroid Build Coastguard Worker;T10:   catch:
141*9880d681SAndroid Build Coastguard Worker;T10:     %catchp1 = catchpad within %cs [i32 1]
142*9880d681SAndroid Build Coastguard Worker;T10:     unreachable
143*9880d681SAndroid Build Coastguard Worker;T10:   cleanup2:
144*9880d681SAndroid Build Coastguard Worker;T10:     %cp2 = cleanuppad within %catchp1 []
145*9880d681SAndroid Build Coastguard Worker;T10:     unreachable
146*9880d681SAndroid Build Coastguard Worker;T10:   cleanup3:
147*9880d681SAndroid Build Coastguard Worker;T10:     %cp3 = cleanuppad within %cp2 []
148*9880d681SAndroid Build Coastguard Worker;T10:     cleanupret from %cp3 unwind label %switch
149*9880d681SAndroid Build Coastguard Worker;T10:       ; CHECK10: EH pad cannot handle exceptions raised within it
150*9880d681SAndroid Build Coastguard Worker;T10:       ; CHECK10-NEXT: %cs = catchswitch within %cp1 [label %catch] unwind to caller
151*9880d681SAndroid Build Coastguard Worker;T10:       ; CHECK10-NEXT: cleanupret from %cp3 unwind label %switch
152*9880d681SAndroid Build Coastguard Worker;T10: }
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker;T11: define void @f() personality void ()* @g {
155*9880d681SAndroid Build Coastguard Worker;T11:   entry:
156*9880d681SAndroid Build Coastguard Worker;T11:     ret void
157*9880d681SAndroid Build Coastguard Worker;T11:   cleanup1:
158*9880d681SAndroid Build Coastguard Worker;T11:     %cp1 = cleanuppad within none []
159*9880d681SAndroid Build Coastguard Worker;T11:     unreachable
160*9880d681SAndroid Build Coastguard Worker;T11:   cleanup2:
161*9880d681SAndroid Build Coastguard Worker;T11:     %cp2 = cleanuppad within %cp1 []
162*9880d681SAndroid Build Coastguard Worker;T11:     unreachable
163*9880d681SAndroid Build Coastguard Worker;T11:   switch:
164*9880d681SAndroid Build Coastguard Worker;T11:     %cs = catchswitch within none [label %catch] unwind label %cleanup2
165*9880d681SAndroid Build Coastguard Worker;T11:     ; CHECK11: A single unwind edge may only enter one EH pad
166*9880d681SAndroid Build Coastguard Worker;T11:     ; CHECK11-NEXT: %cs = catchswitch within none [label %catch] unwind label %cleanup2
167*9880d681SAndroid Build Coastguard Worker;T11:   catch:
168*9880d681SAndroid Build Coastguard Worker;T11:     catchpad within %cs [i32 1]
169*9880d681SAndroid Build Coastguard Worker;T11:     unreachable
170*9880d681SAndroid Build Coastguard Worker;T11: }
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker;T12: define void @f() personality void ()* @g {
173*9880d681SAndroid Build Coastguard Worker;T12:   entry:
174*9880d681SAndroid Build Coastguard Worker;T12:     ret void
175*9880d681SAndroid Build Coastguard Worker;T12:   cleanup:
176*9880d681SAndroid Build Coastguard Worker;T12:     %cp = cleanuppad within none []
177*9880d681SAndroid Build Coastguard Worker;T12:     cleanupret from %cp unwind label %switch
178*9880d681SAndroid Build Coastguard Worker;T12:     ; CHECK12: A cleanupret must exit its cleanup
179*9880d681SAndroid Build Coastguard Worker;T12:     ; CHECK12-NEXT: cleanupret from %cp unwind label %switch
180*9880d681SAndroid Build Coastguard Worker;T12:   switch:
181*9880d681SAndroid Build Coastguard Worker;T12:     %cs = catchswitch within %cp [label %catch] unwind to caller
182*9880d681SAndroid Build Coastguard Worker;T12:   catch:
183*9880d681SAndroid Build Coastguard Worker;T12:     catchpad within %cs [i32 1]
184*9880d681SAndroid Build Coastguard Worker;T12:     unreachable
185*9880d681SAndroid Build Coastguard Worker;T12: }
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker;T13: define void @f() personality void ()* @g {
188*9880d681SAndroid Build Coastguard Worker;T13:   entry:
189*9880d681SAndroid Build Coastguard Worker;T13:     ret void
190*9880d681SAndroid Build Coastguard Worker;T13:   switch:
191*9880d681SAndroid Build Coastguard Worker;T13:     %cs = catchswitch within none [label %catch] unwind label %switch
192*9880d681SAndroid Build Coastguard Worker;T13:     ; CHECK13: EH pad cannot handle exceptions raised within it
193*9880d681SAndroid Build Coastguard Worker;T13:     ; CHECK13-NEXT:  %cs = catchswitch within none [label %catch] unwind label %switch
194*9880d681SAndroid Build Coastguard Worker;T13:   catch:
195*9880d681SAndroid Build Coastguard Worker;T13:     catchpad within %cs [i32 0]
196*9880d681SAndroid Build Coastguard Worker;T13:     unreachable
197*9880d681SAndroid Build Coastguard Worker;T13: }
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker;T14: define void @f() personality void ()* @g {
200*9880d681SAndroid Build Coastguard Worker;T14:   entry:
201*9880d681SAndroid Build Coastguard Worker;T14:     ret void
202*9880d681SAndroid Build Coastguard Worker;T14:   cleanup:
203*9880d681SAndroid Build Coastguard Worker;T14:     %cp = cleanuppad within none []
204*9880d681SAndroid Build Coastguard Worker;T14:     unreachable
205*9880d681SAndroid Build Coastguard Worker;T14:   left:
206*9880d681SAndroid Build Coastguard Worker;T14:     cleanupret from %cp unwind label %switch
207*9880d681SAndroid Build Coastguard Worker;T14:   right:
208*9880d681SAndroid Build Coastguard Worker;T14:     cleanupret from %cp unwind to caller
209*9880d681SAndroid Build Coastguard Worker;T14:     ; CHECK14: Unwind edges out of a funclet pad must have the same unwind dest
210*9880d681SAndroid Build Coastguard Worker;T14:     ; CHECK14-NEXT: %cp = cleanuppad within none []
211*9880d681SAndroid Build Coastguard Worker;T14:     ; CHECK14-NEXT: cleanupret from %cp unwind label %switch
212*9880d681SAndroid Build Coastguard Worker;T14:     ; CHECK14-NEXT: cleanupret from %cp unwind to caller
213*9880d681SAndroid Build Coastguard Worker;T14:   switch:
214*9880d681SAndroid Build Coastguard Worker;T14:     %cs = catchswitch within none [label %catch] unwind to caller
215*9880d681SAndroid Build Coastguard Worker;T14:   catch:
216*9880d681SAndroid Build Coastguard Worker;T14:     catchpad within %cs [i32 1]
217*9880d681SAndroid Build Coastguard Worker;T14:     unreachable
218*9880d681SAndroid Build Coastguard Worker;T14: }
219*9880d681SAndroid Build Coastguard Worker
220*9880d681SAndroid Build Coastguard Worker;T15: define void @f() personality void ()* @g {
221*9880d681SAndroid Build Coastguard Worker;T15:   entry:
222*9880d681SAndroid Build Coastguard Worker;T15:     ret void
223*9880d681SAndroid Build Coastguard Worker;T15:   switch:
224*9880d681SAndroid Build Coastguard Worker;T15:     %cs = catchswitch within none [label %catch] unwind to caller
225*9880d681SAndroid Build Coastguard Worker;T15:   catch:
226*9880d681SAndroid Build Coastguard Worker;T15:     %catch.pad = catchpad within %cs [i32 1]
227*9880d681SAndroid Build Coastguard Worker;T15:     invoke void @g() [ "funclet"(token %catch.pad) ]
228*9880d681SAndroid Build Coastguard Worker;T15:       to label %unreachable unwind label %target1
229*9880d681SAndroid Build Coastguard Worker;T15:   unreachable:
230*9880d681SAndroid Build Coastguard Worker;T15:     unreachable
231*9880d681SAndroid Build Coastguard Worker;T15:   target1:
232*9880d681SAndroid Build Coastguard Worker;T15:     cleanuppad within none []
233*9880d681SAndroid Build Coastguard Worker;T15:     unreachable
234*9880d681SAndroid Build Coastguard Worker;T15:   target2:
235*9880d681SAndroid Build Coastguard Worker;T15:     cleanuppad within none []
236*9880d681SAndroid Build Coastguard Worker;T15:     unreachable
237*9880d681SAndroid Build Coastguard Worker;T15:   nested.1:
238*9880d681SAndroid Build Coastguard Worker;T15:     %nested.pad.1 = cleanuppad within %catch.pad []
239*9880d681SAndroid Build Coastguard Worker;T15:     unreachable
240*9880d681SAndroid Build Coastguard Worker;T15:   nested.2:
241*9880d681SAndroid Build Coastguard Worker;T15:     %nested.pad.2 = cleanuppad within %nested.pad.1 []
242*9880d681SAndroid Build Coastguard Worker;T15:     cleanupret from %nested.pad.2 unwind label %target2
243*9880d681SAndroid Build Coastguard Worker;T15:     ; CHECK15: Unwind edges out of a funclet pad must have the same unwind dest
244*9880d681SAndroid Build Coastguard Worker;T15:     ; CHECK15-NEXT: %catch.pad = catchpad within %cs [i32 1]
245*9880d681SAndroid Build Coastguard Worker;T15:     ; CHECK15-NEXT: cleanupret from %nested.pad.2 unwind label %target2
246*9880d681SAndroid Build Coastguard Worker;T15:     ; CHECK15-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ]
247*9880d681SAndroid Build Coastguard Worker;T15:     ; CHECK15-NEXT:   to label %unreachable unwind label %target1
248*9880d681SAndroid Build Coastguard Worker;T15: }
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker;T16: define void @f() personality void ()* @g {
251*9880d681SAndroid Build Coastguard Worker;T16:   entry:
252*9880d681SAndroid Build Coastguard Worker;T16:     ret void
253*9880d681SAndroid Build Coastguard Worker;T16:   switch:
254*9880d681SAndroid Build Coastguard Worker;T16:     %cs = catchswitch within none [label %catch] unwind to caller
255*9880d681SAndroid Build Coastguard Worker;T16:   catch:
256*9880d681SAndroid Build Coastguard Worker;T16:     %catch.pad = catchpad within %cs [i32 1]
257*9880d681SAndroid Build Coastguard Worker;T16:     invoke void @g() [ "funclet"(token %catch.pad) ]
258*9880d681SAndroid Build Coastguard Worker;T16:       to label %unreachable unwind label %target1
259*9880d681SAndroid Build Coastguard Worker;T16:     ; CHECK16: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch
260*9880d681SAndroid Build Coastguard Worker;T16:     ; CHECK16-NEXT:   %catch.pad = catchpad within %cs [i32 1]
261*9880d681SAndroid Build Coastguard Worker;T16:     ; CHECK16-NEXT:  invoke void @g() [ "funclet"(token %catch.pad) ]
262*9880d681SAndroid Build Coastguard Worker;T16:     ; CHECK16-NEXT:          to label %unreachable unwind label %target1
263*9880d681SAndroid Build Coastguard Worker;T16:     ; CHECK16-NEXT:  %cs = catchswitch within none [label %catch] unwind to caller
264*9880d681SAndroid Build Coastguard Worker;T16:   unreachable:
265*9880d681SAndroid Build Coastguard Worker;T16:     unreachable
266*9880d681SAndroid Build Coastguard Worker;T16:   target1:
267*9880d681SAndroid Build Coastguard Worker;T16:     cleanuppad within none []
268*9880d681SAndroid Build Coastguard Worker;T16:     unreachable
269*9880d681SAndroid Build Coastguard Worker;T16: }
270*9880d681SAndroid Build Coastguard Worker
271*9880d681SAndroid Build Coastguard Worker;T17: define void @f() personality void ()* @g {
272*9880d681SAndroid Build Coastguard Worker;T17:   entry:
273*9880d681SAndroid Build Coastguard Worker;T17:     ret void
274*9880d681SAndroid Build Coastguard Worker;T17:   switch:
275*9880d681SAndroid Build Coastguard Worker;T17:     %cs = catchswitch within none [label %catch] unwind label %target1
276*9880d681SAndroid Build Coastguard Worker;T17:   catch:
277*9880d681SAndroid Build Coastguard Worker;T17:     %catch.pad = catchpad within %cs [i32 1]
278*9880d681SAndroid Build Coastguard Worker;T17:     invoke void @g() [ "funclet"(token %catch.pad) ]
279*9880d681SAndroid Build Coastguard Worker;T17:       to label %unreachable unwind label %target2
280*9880d681SAndroid Build Coastguard Worker;T17:     ; CHECK17: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch
281*9880d681SAndroid Build Coastguard Worker;T17:     ; CHECK17-NEXT:  %catch.pad = catchpad within %cs [i32 1]
282*9880d681SAndroid Build Coastguard Worker;T17:     ; CHECK17-NEXT:  invoke void @g() [ "funclet"(token %catch.pad) ]
283*9880d681SAndroid Build Coastguard Worker;T17:     ; CHECK17-NEXT:          to label %unreachable unwind label %target2
284*9880d681SAndroid Build Coastguard Worker;T17:     ; CHECK17-NEXT:  %cs = catchswitch within none [label %catch] unwind label %target1
285*9880d681SAndroid Build Coastguard Worker;T17:   unreachable:
286*9880d681SAndroid Build Coastguard Worker;T17:     unreachable
287*9880d681SAndroid Build Coastguard Worker;T17:   target1:
288*9880d681SAndroid Build Coastguard Worker;T17:     cleanuppad within none []
289*9880d681SAndroid Build Coastguard Worker;T17:     unreachable
290*9880d681SAndroid Build Coastguard Worker;T17:   target2:
291*9880d681SAndroid Build Coastguard Worker;T17:     cleanuppad within none []
292*9880d681SAndroid Build Coastguard Worker;T17:     unreachable
293*9880d681SAndroid Build Coastguard Worker;T17: }
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Worker;T18: define void @f() personality void ()* @g {
296*9880d681SAndroid Build Coastguard Worker;T18:   entry:
297*9880d681SAndroid Build Coastguard Worker;T18:     invoke void @g()
298*9880d681SAndroid Build Coastguard Worker;T18:       to label %invoke.cont unwind label %left
299*9880d681SAndroid Build Coastguard Worker;T18:   invoke.cont:
300*9880d681SAndroid Build Coastguard Worker;T18:     invoke void @g()
301*9880d681SAndroid Build Coastguard Worker;T18:       to label %unreachable unwind label %right
302*9880d681SAndroid Build Coastguard Worker;T18:   left:
303*9880d681SAndroid Build Coastguard Worker;T18:     %cp.left = cleanuppad within none []
304*9880d681SAndroid Build Coastguard Worker;T18:     invoke void @g() [ "funclet"(token %cp.left) ]
305*9880d681SAndroid Build Coastguard Worker;T18:       to label %unreachable unwind label %right
306*9880d681SAndroid Build Coastguard Worker;T18:   right:
307*9880d681SAndroid Build Coastguard Worker;T18:     %cp.right = cleanuppad within none []
308*9880d681SAndroid Build Coastguard Worker;T18:     invoke void @g() [ "funclet"(token %cp.right) ]
309*9880d681SAndroid Build Coastguard Worker;T18:       to label %unreachable unwind label %left
310*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18: EH pads can't handle each other's exceptions
311*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT: %cp.left = cleanuppad within none []
312*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT:  invoke void @g() [ "funclet"(token %cp.left) ]
313*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT:          to label %unreachable unwind label %right
314*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT:  %cp.right = cleanuppad within none []
315*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT:  invoke void @g() [ "funclet"(token %cp.right) ]
316*9880d681SAndroid Build Coastguard Worker;T18:     ; CHECK18-NEXT:          to label %unreachable unwind label %left
317*9880d681SAndroid Build Coastguard Worker;T18:   unreachable:
318*9880d681SAndroid Build Coastguard Worker;T18:     unreachable
319*9880d681SAndroid Build Coastguard Worker;T18: }
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Worker;T19: define void @f() personality void ()* @g {
322*9880d681SAndroid Build Coastguard Worker;T19:   entry:
323*9880d681SAndroid Build Coastguard Worker;T19:     ret void
324*9880d681SAndroid Build Coastguard Worker;T19:   red:
325*9880d681SAndroid Build Coastguard Worker;T19:     %redpad = cleanuppad within none []
326*9880d681SAndroid Build Coastguard Worker;T19:     unreachable
327*9880d681SAndroid Build Coastguard Worker;T19:   red.inner:
328*9880d681SAndroid Build Coastguard Worker;T19:     %innerpad = cleanuppad within %redpad []
329*9880d681SAndroid Build Coastguard Worker;T19:     invoke void @g() [ "funclet"(token %innerpad) ]
330*9880d681SAndroid Build Coastguard Worker;T19:       to label %unreachable unwind label %green
331*9880d681SAndroid Build Coastguard Worker;T19:   green:
332*9880d681SAndroid Build Coastguard Worker;T19:     %greenswitch = catchswitch within none [label %catch] unwind label %blue
333*9880d681SAndroid Build Coastguard Worker;T19:   catch:
334*9880d681SAndroid Build Coastguard Worker;T19:     catchpad within %greenswitch [i32 42]
335*9880d681SAndroid Build Coastguard Worker;T19:     unreachable
336*9880d681SAndroid Build Coastguard Worker;T19:   blue:
337*9880d681SAndroid Build Coastguard Worker;T19:     %bluepad = cleanuppad within none []
338*9880d681SAndroid Build Coastguard Worker;T19:     cleanupret from %bluepad unwind label %red
339*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19: EH pads can't handle each other's exceptions
340*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT: %redpad = cleanuppad within none []
341*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT: invoke void @g() [ "funclet"(token %innerpad) ]
342*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT:         to label %unreachable unwind label %green
343*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT: %greenswitch = catchswitch within none [label %catch] unwind label %blue
344*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT: %bluepad = cleanuppad within none []
345*9880d681SAndroid Build Coastguard Worker;T19:     ; CHECK19-NEXT: cleanupret from %bluepad unwind label %red
346*9880d681SAndroid Build Coastguard Worker;T19:   unreachable:
347*9880d681SAndroid Build Coastguard Worker;T19:     unreachable
348*9880d681SAndroid Build Coastguard Worker;T19: }
349*9880d681SAndroid Build Coastguard Worker
350*9880d681SAndroid Build Coastguard Worker;T20: define void @f() personality void ()* @g {
351*9880d681SAndroid Build Coastguard Worker;T20:   entry:
352*9880d681SAndroid Build Coastguard Worker;T20:     ret void
353*9880d681SAndroid Build Coastguard Worker;T20:   switch:
354*9880d681SAndroid Build Coastguard Worker;T20:     %cs = catchswitch within none [label %catch] unwind label %catch
355*9880d681SAndroid Build Coastguard Worker;T20:     ; CHECK20: Catchswitch cannot unwind to one of its catchpads
356*9880d681SAndroid Build Coastguard Worker;T20:     ; CHECK20-NEXT: %cs = catchswitch within none [label %catch] unwind label %catch
357*9880d681SAndroid Build Coastguard Worker;T20:     ; CHECK20-NEXT: %cp = catchpad within %cs [i32 4]
358*9880d681SAndroid Build Coastguard Worker;T20:   catch:
359*9880d681SAndroid Build Coastguard Worker;T20:     %cp = catchpad within %cs [i32 4]
360*9880d681SAndroid Build Coastguard Worker;T20:     unreachable
361*9880d681SAndroid Build Coastguard Worker;T20: }
362*9880d681SAndroid Build Coastguard Worker
363*9880d681SAndroid Build Coastguard Worker;T21: define void @f() personality void ()* @g {
364*9880d681SAndroid Build Coastguard Worker;T21:   entry:
365*9880d681SAndroid Build Coastguard Worker;T21:     ret void
366*9880d681SAndroid Build Coastguard Worker;T21:   switch:
367*9880d681SAndroid Build Coastguard Worker;T21:     %cs = catchswitch within none [label %catch1] unwind label %catch2
368*9880d681SAndroid Build Coastguard Worker;T21:     ; CHECK21: Catchswitch cannot unwind to one of its catchpads
369*9880d681SAndroid Build Coastguard Worker;T21:     ; CHECK21-NEXT: %cs = catchswitch within none [label %catch1] unwind label %catch2
370*9880d681SAndroid Build Coastguard Worker;T21:     ; CHECK21-NEXT: %cp2 = catchpad within %cs [i32 2]
371*9880d681SAndroid Build Coastguard Worker;T21:   catch1:
372*9880d681SAndroid Build Coastguard Worker;T21:     %cp1 = catchpad within %cs [i32 1]
373*9880d681SAndroid Build Coastguard Worker;T21:     unreachable
374*9880d681SAndroid Build Coastguard Worker;T21:   catch2:
375*9880d681SAndroid Build Coastguard Worker;T21:     %cp2 = catchpad within %cs [i32 2]
376*9880d681SAndroid Build Coastguard Worker;T21:     unreachable
377*9880d681SAndroid Build Coastguard Worker;T21: }
378*9880d681SAndroid Build Coastguard Worker
379*9880d681SAndroid Build Coastguard Worker;T22: define void @f() personality void ()* @g {
380*9880d681SAndroid Build Coastguard Worker;T22:   invoke void @g()
381*9880d681SAndroid Build Coastguard Worker;T22:           to label %merge unwind label %cleanup
382*9880d681SAndroid Build Coastguard Worker;T22:
383*9880d681SAndroid Build Coastguard Worker;T22: cleanup:
384*9880d681SAndroid Build Coastguard Worker;T22:   %outer = cleanuppad within none []
385*9880d681SAndroid Build Coastguard Worker;T22:   invoke void @g() [ "funclet"(token %outer) ]
386*9880d681SAndroid Build Coastguard Worker;T22:           to label %merge unwind label %merge
387*9880d681SAndroid Build Coastguard Worker;T22:   ; CHECK22: The unwind destination does not have an exception handling instruction!
388*9880d681SAndroid Build Coastguard Worker;T22:   ; CHECK22:   invoke void @g() [ "funclet"(token %outer) ]
389*9880d681SAndroid Build Coastguard Worker;T22:   ; CHECK22:           to label %merge unwind label %merge
390*9880d681SAndroid Build Coastguard Worker;T22:
391*9880d681SAndroid Build Coastguard Worker;T22: merge:
392*9880d681SAndroid Build Coastguard Worker;T22:   unreachable
393*9880d681SAndroid Build Coastguard Worker;T22: }
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Worker;T23: define void @f() personality void ()* @g {
396*9880d681SAndroid Build Coastguard Worker;T23:   invoke void @g()
397*9880d681SAndroid Build Coastguard Worker;T23:           to label %exit unwind label %pad
398*9880d681SAndroid Build Coastguard Worker;T23:
399*9880d681SAndroid Build Coastguard Worker;T23: pad:
400*9880d681SAndroid Build Coastguard Worker;T23:   %outer = catchpad within %outer []
401*9880d681SAndroid Build Coastguard Worker;T23:   ; CHECK23: CatchPadInst needs to be directly nested in a CatchSwitchInst.
402*9880d681SAndroid Build Coastguard Worker;T23:   ; CHECK23:   %outer = catchpad within %outer []
403*9880d681SAndroid Build Coastguard Worker;T23:   unreachable
404*9880d681SAndroid Build Coastguard Worker;T23:
405*9880d681SAndroid Build Coastguard Worker;T23: exit:
406*9880d681SAndroid Build Coastguard Worker;T23:   unreachable
407*9880d681SAndroid Build Coastguard Worker;T23: }
408*9880d681SAndroid Build Coastguard Worker
409*9880d681SAndroid Build Coastguard Worker;T24: define void @f() personality void ()* @g {
410*9880d681SAndroid Build Coastguard Worker;T24:   invoke void @g()
411*9880d681SAndroid Build Coastguard Worker;T24:           to label %exit unwind label %pad
412*9880d681SAndroid Build Coastguard Worker;T24:   ; CHECK24: A single unwind edge may only enter one EH pad
413*9880d681SAndroid Build Coastguard Worker;T24:   ; CHECK24:   invoke void @g()
414*9880d681SAndroid Build Coastguard Worker;T24:   ; CHECK24:           to label %exit unwind label %pad
415*9880d681SAndroid Build Coastguard Worker;T24:
416*9880d681SAndroid Build Coastguard Worker;T24: pad:
417*9880d681SAndroid Build Coastguard Worker;T24:   %outer = cleanuppad within %outer []
418*9880d681SAndroid Build Coastguard Worker;T24:   ; CHECK24: FuncletPadInst must not be nested within itself
419*9880d681SAndroid Build Coastguard Worker;T24:   ; CHECK24:   %outer = cleanuppad within %outer []
420*9880d681SAndroid Build Coastguard Worker;T24:   unreachable
421*9880d681SAndroid Build Coastguard Worker;T24:
422*9880d681SAndroid Build Coastguard Worker;T24: exit:
423*9880d681SAndroid Build Coastguard Worker;T24:   unreachable
424*9880d681SAndroid Build Coastguard Worker;T24: }
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker;T25: define void @f() personality void ()* @g {
427*9880d681SAndroid Build Coastguard Worker;T25: entry:
428*9880d681SAndroid Build Coastguard Worker;T25:   unreachable
429*9880d681SAndroid Build Coastguard Worker;T25:
430*9880d681SAndroid Build Coastguard Worker;T25: catch.dispatch:
431*9880d681SAndroid Build Coastguard Worker;T25:   %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup
432*9880d681SAndroid Build Coastguard Worker;T25:   ; CHECK25: EH pad jumps through a cycle of pads
433*9880d681SAndroid Build Coastguard Worker;T25:   ; CHECK25:   %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup
434*9880d681SAndroid Build Coastguard Worker;T25:
435*9880d681SAndroid Build Coastguard Worker;T25: catch:
436*9880d681SAndroid Build Coastguard Worker;T25:   %cp2 = catchpad within %cs [i8* null, i32 64, i8* null]
437*9880d681SAndroid Build Coastguard Worker;T25:   unreachable
438*9880d681SAndroid Build Coastguard Worker;T25:
439*9880d681SAndroid Build Coastguard Worker;T25: ehcleanup:
440*9880d681SAndroid Build Coastguard Worker;T25:   %cp3 = cleanuppad within none []
441*9880d681SAndroid Build Coastguard Worker;T25:   cleanupret from %cp3 unwind to caller
442*9880d681SAndroid Build Coastguard Worker;T25: }
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker;T26: define void @f() personality void ()* @g {
445*9880d681SAndroid Build Coastguard Worker;T26: entry:
446*9880d681SAndroid Build Coastguard Worker;T26:   ret void
447*9880d681SAndroid Build Coastguard Worker;T26:
448*9880d681SAndroid Build Coastguard Worker;T26: ehcleanup:
449*9880d681SAndroid Build Coastguard Worker;T26:   cleanuppad within none []
450*9880d681SAndroid Build Coastguard Worker;T26:   cleanupret from none unwind label %ehcleanup
451*9880d681SAndroid Build Coastguard Worker;T26:   ; CHECK26: A cleanupret must exit its cleanup
452*9880d681SAndroid Build Coastguard Worker;T26:   ; CHECK26:   cleanupret from none unwind label %ehcleanup
453*9880d681SAndroid Build Coastguard Worker;T26:   ; CHECK26: CleanupReturnInst needs to be provided a CleanupPad
454*9880d681SAndroid Build Coastguard Worker;T26:   ; CHECK26:   cleanupret from none unwind label %ehcleanup
455*9880d681SAndroid Build Coastguard Worker;T26:   ; CHECK26: token none
456*9880d681SAndroid Build Coastguard Worker;T26: }
457