2011-04-28 09:08:34 +08:00
|
|
|
// RUN: %clang_cc1 -fborland-extensions -fsyntax-only -verify %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{};
|
|
|
|
|
|
|
|
int __exception_code();
|
|
|
|
struct EXCEPTION_INFO* __exception_info();
|
|
|
|
void __abnormal_termination();
|
|
|
|
|
|
|
|
#define GetExceptionCode __exception_code
|
|
|
|
#define GetExceptionInformation __exception_info
|
|
|
|
#define AbnormalTermination __abnormal_termination
|
|
|
|
|
|
|
|
#pragma sysheader end
|
|
|
|
|
2011-10-21 11:57:52 +08:00
|
|
|
DWORD FilterExpression(int); // expected-note{{declared here}}
|
2011-04-28 09:08:34 +08:00
|
|
|
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() {
|
2011-10-21 11:57:52 +08:00
|
|
|
__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}}
|
2011-04-28 09:08:34 +08:00
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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 ) {}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TEST() {
|
|
|
|
__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();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void TEST() {
|
|
|
|
(void)__exception_code; // expected-error{{only allowed in __except block}}
|
|
|
|
(void)__exception_info; // expected-error{{only allowed in __except filter expression}}
|
|
|
|
(void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
|
|
|
|
|
|
|
|
(void)GetExceptionCode(); // expected-error{{only allowed in __except block}}
|
|
|
|
(void)GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
|
|
|
|
(void)AbnormalTermination(); // expected-error{{only allowed in __finally block}}
|
|
|
|
}
|
2014-07-07 06:32:59 +08:00
|
|
|
|
|
|
|
void test___leave() {
|
2014-07-07 06:53:19 +08:00
|
|
|
__leave; // expected-error{{'__leave' statement not in __try block}}
|
|
|
|
|
2014-07-07 06:32:59 +08:00
|
|
|
__try {
|
|
|
|
// FIXME: should be fine
|
|
|
|
__leave; // expected-error{{not implemented yet}}
|
|
|
|
// FIXME: should say "expected ';' after __leave statement"
|
|
|
|
__leave 4; // expected-error{{not implemented yet}} expected-warning{{expression result unused}}
|
|
|
|
} __except(1) {
|
2014-07-07 06:53:19 +08:00
|
|
|
__leave; // expected-error{{'__leave' statement not in __try block}}
|
2014-07-07 06:32:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
__try {
|
|
|
|
// FIXME: should be fine
|
|
|
|
__leave; // expected-error{{not implemented yet}}
|
|
|
|
} __finally {
|
2014-07-07 06:53:19 +08:00
|
|
|
__leave; // expected-error{{'__leave' statement not in __try block}}
|
2014-07-07 06:32:59 +08:00
|
|
|
}
|
2014-07-07 06:53:19 +08:00
|
|
|
__leave; // expected-error{{'__leave' statement not in __try block}}
|
2014-07-07 06:32:59 +08:00
|
|
|
}
|
|
|
|
|