xref: /aosp_15_r20/external/clang/test/Sema/__try.c (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-windows -fborland-extensions -DBORLAND -fsyntax-only -verify -fblocks %s
2*67e74705SXin Li // RUN: %clang_cc1 -triple x86_64-windows -fms-extensions -fsyntax-only -verify -fblocks %s
3*67e74705SXin Li 
4*67e74705SXin Li #define JOIN2(x,y) x ## y
5*67e74705SXin Li #define JOIN(x,y) JOIN2(x,y)
6*67e74705SXin Li #define TEST2(name) JOIN(name,__LINE__)
7*67e74705SXin Li #define TEST TEST2(test)
8*67e74705SXin Li typedef int DWORD;
9*67e74705SXin Li 
10*67e74705SXin Li #pragma sysheader begin
11*67e74705SXin Li 
12*67e74705SXin Li struct EXCEPTION_INFO{};
13*67e74705SXin Li 
14*67e74705SXin Li unsigned long __exception_code();
15*67e74705SXin Li #ifdef BORLAND
16*67e74705SXin Li struct EXCEPTION_INFO* __exception_info();
17*67e74705SXin Li #endif
18*67e74705SXin Li int __abnormal_termination();
19*67e74705SXin Li 
20*67e74705SXin Li #define GetExceptionCode __exception_code
21*67e74705SXin Li #define GetExceptionInformation __exception_info
22*67e74705SXin Li #define AbnormalTermination __abnormal_termination
23*67e74705SXin Li 
24*67e74705SXin Li #pragma sysheader end
25*67e74705SXin Li 
26*67e74705SXin Li DWORD FilterExpression(int); // expected-note{{declared here}}
27*67e74705SXin Li DWORD FilterExceptionInformation(struct EXCEPTION_INFO*);
28*67e74705SXin Li 
29*67e74705SXin Li const char * NotFilterExpression();
30*67e74705SXin Li 
TEST()31*67e74705SXin Li void TEST() {
32*67e74705SXin Li   __try {
33*67e74705SXin Li     __try {
34*67e74705SXin Li       __try {
35*67e74705SXin Li       }
36*67e74705SXin Li       __finally{
37*67e74705SXin Li       }
38*67e74705SXin Li     }
39*67e74705SXin Li     __finally{
40*67e74705SXin Li     }
41*67e74705SXin Li   }
42*67e74705SXin Li   __finally{
43*67e74705SXin Li   }
44*67e74705SXin Li }
45*67e74705SXin Li 
TEST()46*67e74705SXin Li void TEST() {
47*67e74705SXin Li   __try {
48*67e74705SXin Li 
49*67e74705SXin Li   }
50*67e74705SXin Li }  // expected-error{{expected '__except' or '__finally' block}}
51*67e74705SXin Li 
TEST()52*67e74705SXin Li void TEST() {
53*67e74705SXin Li   __except ( FilterExpression() ) { // expected-warning{{implicit declaration of function '__except' is invalid in C99}} \
54*67e74705SXin Li     // expected-error{{too few arguments to function call, expected 1, have 0}}
55*67e74705SXin Li 
56*67e74705SXin Li   }
57*67e74705SXin Li }
58*67e74705SXin Li 
TEST()59*67e74705SXin Li void TEST() {
60*67e74705SXin Li   __finally { } // expected-error{{}}
61*67e74705SXin Li }
62*67e74705SXin Li 
TEST()63*67e74705SXin Li void TEST() {
64*67e74705SXin Li   __try{
65*67e74705SXin Li     int try_scope = 0;
66*67e74705SXin Li   } // TODO: expected expression is an extra error
67*67e74705SXin Li   __except( try_scope ? 1 : -1 ) // expected-error{{undeclared identifier 'try_scope'}} expected-error{{expected expression}}
68*67e74705SXin Li   {}
69*67e74705SXin Li }
70*67e74705SXin Li 
TEST()71*67e74705SXin Li void TEST() {
72*67e74705SXin Li   __try {
73*67e74705SXin Li 
74*67e74705SXin Li   }
75*67e74705SXin Li   // TODO: Why are there two errors?
76*67e74705SXin Li   __except( ) { // expected-error{{expected expression}} expected-error{{expected expression}}
77*67e74705SXin Li   }
78*67e74705SXin Li }
79*67e74705SXin Li 
TEST()80*67e74705SXin Li void TEST() {
81*67e74705SXin Li   __try {
82*67e74705SXin Li 
83*67e74705SXin Li   }
84*67e74705SXin Li   __except ( FilterExpression(GetExceptionCode()) ) {
85*67e74705SXin Li 
86*67e74705SXin Li   }
87*67e74705SXin Li 
88*67e74705SXin Li   __try {
89*67e74705SXin Li 
90*67e74705SXin Li   }
91*67e74705SXin Li   __except( FilterExpression(__exception_code()) ) {
92*67e74705SXin Li 
93*67e74705SXin Li   }
94*67e74705SXin Li 
95*67e74705SXin Li   __try {
96*67e74705SXin Li 
97*67e74705SXin Li   }
98*67e74705SXin Li   __except( FilterExceptionInformation(__exception_info()) ) {
99*67e74705SXin Li 
100*67e74705SXin Li   }
101*67e74705SXin Li 
102*67e74705SXin Li   __try {
103*67e74705SXin Li 
104*67e74705SXin Li   }
105*67e74705SXin Li   __except(FilterExceptionInformation( GetExceptionInformation() ) ) {
106*67e74705SXin Li 
107*67e74705SXin Li   }
108*67e74705SXin Li }
109*67e74705SXin Li 
TEST()110*67e74705SXin Li void TEST() {
111*67e74705SXin Li   __try {
112*67e74705SXin Li 
113*67e74705SXin Li   }
114*67e74705SXin Li   __except ( NotFilterExpression() ) { // expected-error{{filter expression type should be an integral value not 'const char *'}}
115*67e74705SXin Li 
116*67e74705SXin Li   }
117*67e74705SXin Li }
118*67e74705SXin Li 
TEST()119*67e74705SXin Li void TEST() {
120*67e74705SXin Li   int function_scope = 0;
121*67e74705SXin Li   __try {
122*67e74705SXin Li     int try_scope = 0;
123*67e74705SXin Li   }
124*67e74705SXin Li   __except ( FilterExpression(GetExceptionCode()) ) {
125*67e74705SXin Li     (void)function_scope;
126*67e74705SXin Li     (void)try_scope; // expected-error{{undeclared identifier}}
127*67e74705SXin Li   }
128*67e74705SXin Li }
129*67e74705SXin Li 
TEST()130*67e74705SXin Li void TEST() {
131*67e74705SXin Li   int function_scope = 0;
132*67e74705SXin Li   __try {
133*67e74705SXin Li     int try_scope = 0;
134*67e74705SXin Li   }
135*67e74705SXin Li   __finally {
136*67e74705SXin Li     (void)function_scope;
137*67e74705SXin Li     (void)try_scope; // expected-error{{undeclared identifier}}
138*67e74705SXin Li   }
139*67e74705SXin Li }
140*67e74705SXin Li 
TEST()141*67e74705SXin Li void TEST() {
142*67e74705SXin Li   int function_scope = 0;
143*67e74705SXin Li   __try {
144*67e74705SXin Li 
145*67e74705SXin Li   }
146*67e74705SXin Li   __except( function_scope ? 1 : -1 ) {}
147*67e74705SXin Li }
148*67e74705SXin Li 
149*67e74705SXin Li #ifdef BORLAND
TEST()150*67e74705SXin Li void TEST() {
151*67e74705SXin Li   (void)__abnormal_termination(); // expected-error{{only allowed in __finally block}}
152*67e74705SXin Li   (void)AbnormalTermination();  // expected-error{{only allowed in __finally block}}
153*67e74705SXin Li 
154*67e74705SXin Li   __try {
155*67e74705SXin Li     (void)AbnormalTermination;  // expected-error{{only allowed in __finally block}}
156*67e74705SXin Li     (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
157*67e74705SXin Li   }
158*67e74705SXin Li   __except( 1 ) {
159*67e74705SXin Li     (void)AbnormalTermination;  // expected-error{{only allowed in __finally block}}
160*67e74705SXin Li     (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
161*67e74705SXin Li   }
162*67e74705SXin Li 
163*67e74705SXin Li   __try {
164*67e74705SXin Li   }
165*67e74705SXin Li   __finally {
166*67e74705SXin Li     AbnormalTermination();
167*67e74705SXin Li     __abnormal_termination();
168*67e74705SXin Li   }
169*67e74705SXin Li }
170*67e74705SXin Li #endif
171*67e74705SXin Li 
TEST()172*67e74705SXin Li void TEST() {
173*67e74705SXin Li   (void)__exception_info();       // expected-error{{only allowed in __except filter expression}}
174*67e74705SXin Li   (void)GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
175*67e74705SXin Li }
176*67e74705SXin Li 
TEST()177*67e74705SXin Li void TEST() {
178*67e74705SXin Li #ifndef BORLAND
179*67e74705SXin Li   (void)__exception_code;     // expected-error{{builtin functions must be directly called}}
180*67e74705SXin Li #endif
181*67e74705SXin Li   (void)__exception_code();     // expected-error{{only allowed in __except block or filter expression}}
182*67e74705SXin Li   (void)GetExceptionCode();     // expected-error{{only allowed in __except block or filter expression}}
183*67e74705SXin Li }
184*67e74705SXin Li 
TEST()185*67e74705SXin Li void TEST() {
186*67e74705SXin Li   __try {
187*67e74705SXin Li   } __except(1) {
188*67e74705SXin Li     GetExceptionCode(); // valid
189*67e74705SXin Li     GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
190*67e74705SXin Li   }
191*67e74705SXin Li }
192*67e74705SXin Li 
test_seh_leave_stmt()193*67e74705SXin Li void test_seh_leave_stmt() {
194*67e74705SXin Li   __leave; // expected-error{{'__leave' statement not in __try block}}
195*67e74705SXin Li 
196*67e74705SXin Li   __try {
197*67e74705SXin Li     __leave;
198*67e74705SXin Li     __leave 4; // expected-error{{expected ';' after __leave statement}}
199*67e74705SXin Li   } __except(1) {
200*67e74705SXin Li     __leave; // expected-error{{'__leave' statement not in __try block}}
201*67e74705SXin Li   }
202*67e74705SXin Li 
203*67e74705SXin Li   __try {
204*67e74705SXin Li     __leave;
205*67e74705SXin Li   } __finally {
206*67e74705SXin Li     __leave; // expected-error{{'__leave' statement not in __try block}}
207*67e74705SXin Li   }
208*67e74705SXin Li   __leave; // expected-error{{'__leave' statement not in __try block}}
209*67e74705SXin Li }
210*67e74705SXin Li 
test_jump_out_of___finally()211*67e74705SXin Li void test_jump_out_of___finally() {
212*67e74705SXin Li   while(1) {
213*67e74705SXin Li     __try {
214*67e74705SXin Li     } __finally {
215*67e74705SXin Li       continue; // expected-warning{{jump out of __finally block has undefined behavior}}
216*67e74705SXin Li     }
217*67e74705SXin Li   }
218*67e74705SXin Li   __try {
219*67e74705SXin Li   } __finally {
220*67e74705SXin Li     while (1) {
221*67e74705SXin Li       continue;
222*67e74705SXin Li     }
223*67e74705SXin Li   }
224*67e74705SXin Li 
225*67e74705SXin Li   // Check that a deep __finally containing a block with a shallow continue
226*67e74705SXin Li   // doesn't trigger the warning.
227*67e74705SXin Li   while(1) {{{{
228*67e74705SXin Li     __try {
229*67e74705SXin Li     } __finally {
230*67e74705SXin Li       ^{
231*67e74705SXin Li         while(1)
232*67e74705SXin Li           continue;
233*67e74705SXin Li       }();
234*67e74705SXin Li     }
235*67e74705SXin Li   }}}}
236*67e74705SXin Li 
237*67e74705SXin Li   while(1) {
238*67e74705SXin Li     __try {
239*67e74705SXin Li     } __finally {
240*67e74705SXin Li       break; // expected-warning{{jump out of __finally block has undefined behavior}}
241*67e74705SXin Li     }
242*67e74705SXin Li   }
243*67e74705SXin Li   switch(1) {
244*67e74705SXin Li   case 1:
245*67e74705SXin Li     __try {
246*67e74705SXin Li     } __finally {
247*67e74705SXin Li       break; // expected-warning{{jump out of __finally block has undefined behavior}}
248*67e74705SXin Li     }
249*67e74705SXin Li   }
250*67e74705SXin Li   __try {
251*67e74705SXin Li   } __finally {
252*67e74705SXin Li     while (1) {
253*67e74705SXin Li       break;
254*67e74705SXin Li     }
255*67e74705SXin Li   }
256*67e74705SXin Li 
257*67e74705SXin Li   __try {
258*67e74705SXin Li     __try {
259*67e74705SXin Li     } __finally {
260*67e74705SXin Li       __leave; // expected-warning{{jump out of __finally block has undefined behavior}}
261*67e74705SXin Li     }
262*67e74705SXin Li   } __finally {
263*67e74705SXin Li   }
264*67e74705SXin Li   __try {
265*67e74705SXin Li   } __finally {
266*67e74705SXin Li     __try {
267*67e74705SXin Li       __leave;
268*67e74705SXin Li     } __finally {
269*67e74705SXin Li     }
270*67e74705SXin Li   }
271*67e74705SXin Li 
272*67e74705SXin Li   __try {
273*67e74705SXin Li   } __finally {
274*67e74705SXin Li     return; // expected-warning{{jump out of __finally block has undefined behavior}}
275*67e74705SXin Li   }
276*67e74705SXin Li 
277*67e74705SXin Li   __try {
278*67e74705SXin Li   } __finally {
279*67e74705SXin Li     ^{
280*67e74705SXin Li       return;
281*67e74705SXin Li     }();
282*67e74705SXin Li   }
283*67e74705SXin Li }
284*67e74705SXin Li 
test_typo_in_except()285*67e74705SXin Li void test_typo_in_except() {
286*67e74705SXin Li   __try {
287*67e74705SXin Li   } __except(undeclared_identifier) { // expected-error {{use of undeclared identifier 'undeclared_identifier'}} expected-error {{expected expression}}
288*67e74705SXin Li   }
289*67e74705SXin Li }
290