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 Livoid 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 Livoid 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 Livoid 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 Livoid TEST() { 60*67e74705SXin Li __finally { } // expected-error{{}} 61*67e74705SXin Li } 62*67e74705SXin Li TEST()63*67e74705SXin Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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 Livoid 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