| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289 |
- // RUN: %clang_cc1 -triple x86_64-windows -fborland-extensions -DBORLAND -fsyntax-only -verify -fblocks %s
- // RUN: %clang_cc1 -triple x86_64-windows -fms-extensions -fsyntax-only -verify -fblocks %s
- #define JOIN2(x,y) x ## y
- #define JOIN(x,y) JOIN2(x,y)
- #define TEST2(name) JOIN(name,__LINE__)
- #define TEST TEST2(test)
- typedef int DWORD;
- #pragma sysheader begin
- struct EXCEPTION_INFO{};
- unsigned long __exception_code();
- #ifdef BORLAND
- struct EXCEPTION_INFO* __exception_info();
- #endif
- int __abnormal_termination();
- #define GetExceptionCode __exception_code
- #define GetExceptionInformation __exception_info
- #define AbnormalTermination __abnormal_termination
- #pragma sysheader end
- DWORD FilterExpression(int); // expected-note{{declared here}}
- DWORD FilterExceptionInformation(struct EXCEPTION_INFO*);
- const char * NotFilterExpression();
- void TEST() {
- __try {
- __try {
- __try {
- }
- __finally{
- }
- }
- __finally{
- }
- }
- __finally{
- }
- }
- void TEST() {
- __try {
- }
- } // expected-error{{expected '__except' or '__finally' block}}
- void TEST() {
- __except ( FilterExpression() ) { // expected-warning{{implicit declaration of function '__except' is invalid in C99}} \
- // expected-error{{too few arguments to function call, expected 1, have 0}}
- }
- }
- void TEST() {
- __finally { } // expected-error{{}}
- }
- void TEST() {
- __try{
- int try_scope = 0;
- } // TODO: expected expression is an extra error
- __except( try_scope ? 1 : -1 ) // expected-error{{undeclared identifier 'try_scope'}} expected-error{{expected expression}}
- {}
- }
- void TEST() {
- __try {
- }
- // TODO: Why are there two errors?
- __except( ) { // expected-error{{expected expression}} expected-error{{expected expression}}
- }
- }
- void TEST() {
- __try {
- }
- __except ( FilterExpression(GetExceptionCode()) ) {
- }
- __try {
- }
- __except( FilterExpression(__exception_code()) ) {
- }
- __try {
- }
- __except( FilterExceptionInformation(__exception_info()) ) {
- }
- __try {
- }
- __except(FilterExceptionInformation( GetExceptionInformation() ) ) {
- }
- }
- void TEST() {
- __try {
- }
- __except ( NotFilterExpression() ) { // expected-error{{filter expression type should be an integral value not 'const char *'}}
- }
- }
- void TEST() {
- int function_scope = 0;
- __try {
- int try_scope = 0;
- }
- __except ( FilterExpression(GetExceptionCode()) ) {
- (void)function_scope;
- (void)try_scope; // expected-error{{undeclared identifier}}
- }
- }
- void TEST() {
- int function_scope = 0;
- __try {
- int try_scope = 0;
- }
- __finally {
- (void)function_scope;
- (void)try_scope; // expected-error{{undeclared identifier}}
- }
- }
- void TEST() {
- int function_scope = 0;
- __try {
- }
- __except( function_scope ? 1 : -1 ) {}
- }
- #ifdef BORLAND
- void TEST() {
- (void)__abnormal_termination(); // expected-error{{only allowed in __finally block}}
- (void)AbnormalTermination(); // expected-error{{only allowed in __finally block}}
- __try {
- (void)AbnormalTermination; // expected-error{{only allowed in __finally block}}
- (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
- }
- __except( 1 ) {
- (void)AbnormalTermination; // expected-error{{only allowed in __finally block}}
- (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
- }
- __try {
- }
- __finally {
- AbnormalTermination();
- __abnormal_termination();
- }
- }
- #endif
- void TEST() {
- (void)__exception_info(); // expected-error{{only allowed in __except filter expression}}
- (void)GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
- }
- void TEST() {
- #ifndef BORLAND
- (void)__exception_code; // expected-error{{builtin functions must be directly called}}
- #endif
- (void)__exception_code(); // expected-error{{only allowed in __except block or filter expression}}
- (void)GetExceptionCode(); // expected-error{{only allowed in __except block or filter expression}}
- }
- void TEST() {
- __try {
- } __except(1) {
- GetExceptionCode(); // valid
- GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
- }
- }
- void test_seh_leave_stmt() {
- __leave; // expected-error{{'__leave' statement not in __try block}}
- __try {
- __leave;
- __leave 4; // expected-error{{expected ';' after __leave statement}}
- } __except(1) {
- __leave; // expected-error{{'__leave' statement not in __try block}}
- }
- __try {
- __leave;
- } __finally {
- __leave; // expected-error{{'__leave' statement not in __try block}}
- }
- __leave; // expected-error{{'__leave' statement not in __try block}}
- }
- void test_jump_out_of___finally() {
- while(1) {
- __try {
- } __finally {
- continue; // expected-warning{{jump out of __finally block has undefined behavior}}
- }
- }
- __try {
- } __finally {
- while (1) {
- continue;
- }
- }
- // Check that a deep __finally containing a block with a shallow continue
- // doesn't trigger the warning.
- while(1) {{{{
- __try {
- } __finally {
- ^{
- while(1)
- continue;
- }();
- }
- }}}}
- while(1) {
- __try {
- } __finally {
- break; // expected-warning{{jump out of __finally block has undefined behavior}}
- }
- }
- switch(1) {
- case 1:
- __try {
- } __finally {
- break; // expected-warning{{jump out of __finally block has undefined behavior}}
- }
- }
- __try {
- } __finally {
- while (1) {
- break;
- }
- }
- __try {
- __try {
- } __finally {
- __leave; // expected-warning{{jump out of __finally block has undefined behavior}}
- }
- } __finally {
- }
- __try {
- } __finally {
- __try {
- __leave;
- } __finally {
- }
- }
- __try {
- } __finally {
- return; // expected-warning{{jump out of __finally block has undefined behavior}}
- }
- __try {
- } __finally {
- ^{
- return;
- }();
- }
- }
- void test_typo_in_except() {
- __try {
- } __except(undeclared_identifier) { // expected-error {{use of undeclared identifier 'undeclared_identifier'}} expected-error {{expected expression}}
- }
- }
|