1 // RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm -o - | FileCheck %s
2 
3 // FIXME: Rewrite CHECKs for unnamed BBs and Insts.
4 // REQUIRES: asserts
5 
6 void g();
7 
8 //////////////////////////////////////////////////////////////////////////////
9 // __leave with __except
10 
11 // Nothing in the __try block can trap, so __try.cont isn't created.
12 int __leave_with___except_simple() {
13   int myres = 0;
14   __try {
15     myres = 15;
16     __leave;
17     myres = 23;
18   } __except (1) {
19     return 0;
20   }
21   return 1;
22 }
23 // CHECK-LABEL: define i32 @__leave_with___except_simple()
24 // CHECK: store i32 15, i32* %myres
25 // CHECK-NEXT: br label %__try.__leave
26 // CHECK-NOT: store i32 23
27 // CHECK: __try.__leave:
28 // CHECK-NEXT: ret i32 1
29 
30 
31 // The "normal" case.
32 int __leave_with___except() {
33   int myres = 0;
34   __try {
35     g();
36     __leave;
37     myres = 23;
38   } __except (1) {
39     return 0;
40   }
41   return 1;
42 }
43 // CHECK-LABEL: define i32 @__leave_with___except()
44 // CHECK: invoke void bitcast (void (...)* @g to void ()*)()
45 // CHECK-NEXT:       to label %[[cont:.*]] unwind label %{{.*}}
46 // For __excepts, instead of an explicit __try.__leave label, we could use
47 // use invoke.cont as __leave jump target instead.  However, not doing this
48 // keeps the CodeGen code simpler, __leave is very rare, and SimplifyCFG will
49 // simplify this anyways.
50 // CHECK: [[cont]]
51 // CHECK-NEXT: br label %__try.__leave
52 // CHECK-NOT: store i32 23
53 // CHECK: __try.__leave:
54 // CHECK-NEXT: br label %__try.cont
55 
56 
57 //////////////////////////////////////////////////////////////////////////////
58 // __leave with __finally
59 
60 void abort(void) __attribute__((noreturn));
61 
62 // Nothing in the __try block can trap, so __finally.cont and friends aren't
63 // created.
64 int __leave_with___finally_simple() {
65   int myres = 0;
66   __try {
67     myres = 15;
68     __leave;
69     myres = 23;
70   } __finally {
71     return 0;
72   }
73   return 1;
74 }
75 // CHECK-LABEL: define i32 @__leave_with___finally_simple()
76 // CHECK: store i32 15, i32* %myres
77 // CHECK-NEXT: br label %__try.__leave
78 // CHECK-NOT: store i32 23
79 // CHECK: __try.__leave:
80 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot
81 // CHECK-NEXT: br label %__finally
82 
83 // __finally block doesn't return, __finally.cont doesn't exist.
84 int __leave_with___finally_noreturn() {
85   int myres = 0;
86   __try {
87     myres = 15;
88     __leave;
89     myres = 23;
90   } __finally {
91     abort();
92   }
93   return 1;
94 }
95 // CHECK-LABEL: define i32 @__leave_with___finally_noreturn()
96 // CHECK: store i32 15, i32* %myres
97 // CHECK-NEXT: br label %__try.__leave
98 // CHECK-NOT: store i32 23
99 // CHECK: __try.__leave:
100 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot
101 // CHECK-NEXT: br label %__finally
102 
103 // The "normal" case.
104 int __leave_with___finally() {
105   int myres = 0;
106   __try {
107     g();
108     __leave;
109     myres = 23;
110   } __finally {
111     return 0;
112   }
113   return 1;
114 }
115 // CHECK-LABEL: define i32 @__leave_with___finally()
116 // CHECK: invoke void bitcast (void (...)* @g to void ()*)()
117 // CHECK-NEXT:       to label %[[cont:.*]] unwind label %{{.*}}
118 // For __finally, there needs to be an explicit __try.__leave, because
119 // abnormal.termination.slot needs to be set there.
120 // CHECK: [[cont]]
121 // CHECK-NEXT: br label %__try.__leave
122 // CHECK-NOT: store i32 23
123 // CHECK: __try.__leave:
124 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot
125 // CHECK-NEXT: br label %__finally
126 
127 
128 //////////////////////////////////////////////////////////////////////////////
129 // Mixed, nested cases.
130 
131 // FIXME: Test with outer __finally once PR22553 is fixed.
132 
133 int nested___except___finally() {
134   int myres = 0;
135   __try {
136     __try {
137       g();
138     } __finally {
139       g();
140       __leave;  // Refers to the outer __try, not the __finally!
141       myres = 23;
142       return 0;
143     }
144 
145     myres = 51;
146   } __except (1) {
147   }
148   return 1;
149 }
150 // The order of basic blocks in the below doesn't matter.
151 // CHECK-LABEL: define i32 @nested___except___finally()
152 
153 // CHECK-LABEL: invoke void bitcast (void (...)* @g to void ()*)()
154 // CHECK-NEXT:       to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]]
155 
156 // CHECK: [[g1_cont]]:
157 // CHECK-NEXT: store i8 0, i8* %abnormal.termination.slot
158 // CHECK-NEXT: br label %__finally
159 
160 // CHECK-LABEL: __finally:
161 // CHECK-NEXT: invoke void bitcast (void (...)* @g to void ()*)() #3
162 // CHECK-NEXT:       to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]]
163 
164 // CHECK: [[g2_cont]]:
165 // CHECK-NOT: store i32 23
166 // CHECK: br label %__try.__leave
167 
168 // CHECK: [[g1_lpad]]:
169 // CHECK: store i8 1, i8* %abnormal.termination.slot
170 // CHECK-NEXT:  br label %__finally
171 
172 // CHECK: [[g2_lpad]]:
173 // CHECK-NOT: %abnormal.termination.slot
174 // CHECK: br label %__except
175 
176 // CHECK-LABEL: __except:
177 // CHECK-NEXT: br label %__try.cont
178 
179 // CHECK-LABEL: __try.__leave:
180 // CHECK-NEXT: br label %__try.cont
181 
182 int nested___except___except() {
183   int myres = 0;
184   __try {
185     __try {
186       g();
187       myres = 16;
188     } __except (1) {
189       g();
190       __leave;  // Refers to the outer __try, not the __except we're in!
191       myres = 23;
192       return 0;
193     }
194 
195     myres = 51;
196   } __except (1) {
197   }
198   return 1;
199 }
200 // The order of basic blocks in the below doesn't matter.
201 // CHECK-LABEL: define i32 @nested___except___except()
202 
203 // CHECK-LABEL: invoke void bitcast (void (...)* @g to void ()*)()
204 // CHECK-NEXT:       to label %[[g1_cont:.*]] unwind label %[[g1_lpad:.*]]
205 
206 // CHECK: [[g1_cont]]:
207 // CHECK: store i32 16, i32* %myres
208 // CHECK-NEXT: br label %__try.cont
209 
210 // CHECK: [[g1_lpad]]:
211 // CHECK:  br label %__except
212 
213 // CHECK-LABEL: __except:
214 // CHECK-NEXT: invoke void bitcast (void (...)* @g to void ()*)() #3
215 // CHECK-NEXT:       to label %[[g2_cont:.*]] unwind label %[[g2_lpad:.*]]
216 
217 // CHECK: [[g2_cont]]:
218 // CHECK-NOT: store i32 23
219 // CHECK: br label %__try.__leave
220 
221 // CHECK: [[g2_lpad]]:
222 // CHECK: br label %__except3
223 
224 // CHECK-LABEL: __except3:
225 // CHECK-NEXT: br label %__try.cont4
226 
227 // CHECK-LABEL: __try.cont:
228 // CHECK-NEXT: store i32 51, i32* %myres
229 // CHECK-NEXT: br label %__try.__leave
230 
231 // CHECK-LABEL: __try.__leave:
232 // CHECK-NEXT: br label %__try.cont4
233