blob: 5490aea539edfc3b6fe3f8c8b76b172d8b94410b [file] [log] [blame]
John Wiegley28bbe4b2011-04-28 01:08:34 +00001// RUN: %clang_cc1 -fborland-extensions -fsyntax-only -verify %s
2
3#define JOIN2(x,y) x ## y
4#define JOIN(x,y) JOIN2(x,y)
5#define TEST2(name) JOIN(name,__LINE__)
6#define TEST TEST2(test)
7typedef int DWORD;
8
9#pragma sysheader begin
10
11struct EXCEPTION_INFO{};
12
13int __exception_code();
14struct EXCEPTION_INFO* __exception_info();
15void __abnormal_termination();
16
17#define GetExceptionCode __exception_code
18#define GetExceptionInformation __exception_info
19#define AbnormalTermination __abnormal_termination
20
21#pragma sysheader end
22
23DWORD FilterExpression(int);
24DWORD FilterExceptionInformation(struct EXCEPTION_INFO*);
25
26const char * NotFilterExpression();
27
28void TEST() {
29 __try {
30 __try {
31 __try {
32 }
33 __finally{
34 }
35 }
36 __finally{
37 }
38 }
39 __finally{
40 }
41}
42
43void TEST() {
44 __try {
45
46 }
47} // expected-error{{expected '__except' or '__finally' block}}
48
49void TEST() {
50 __except ( FilterExpression() ) { // expected-error{{}}
51
52 }
53}
54
55void TEST() {
56 __finally { } // expected-error{{}}
57}
58
59void TEST() {
60 __try{
61 int try_scope = 0;
62 } // TODO: expected expression is an extra error
63 __except( try_scope ? 1 : -1 ) // expected-error{{undeclared identifier 'try_scope'}} expected-error{{expected expression}}
64 {}
65}
66
67void TEST() {
68 __try {
69
70 }
71 // TODO: Why are there two errors?
72 __except( ) { // expected-error{{expected expression}} expected-error{{expected expression}}
73 }
74}
75
76void TEST() {
77 __try {
78
79 }
80 __except ( FilterExpression(GetExceptionCode()) ) {
81
82 }
83
84 __try {
85
86 }
87 __except( FilterExpression(__exception_code()) ) {
88
89 }
90
91 __try {
92
93 }
94 __except( FilterExceptionInformation(__exception_info()) ) {
95
96 }
97
98 __try {
99
100 }
101 __except(FilterExceptionInformation( GetExceptionInformation() ) ) {
102
103 }
104}
105
106void TEST() {
107 __try {
108
109 }
110 __except ( NotFilterExpression() ) { // expected-error{{filter expression type should be an integral value not 'const char *'}}
111
112 }
113}
114
115void TEST() {
116 int function_scope = 0;
117 __try {
118 int try_scope = 0;
119 }
120 __except ( FilterExpression(GetExceptionCode()) ) {
121 (void)function_scope;
122 (void)try_scope; // expected-error{{undeclared identifier}}
123 }
124}
125
126void TEST() {
127 int function_scope = 0;
128 __try {
129 int try_scope = 0;
130 }
131 __finally {
132 (void)function_scope;
133 (void)try_scope; // expected-error{{undeclared identifier}}
134 }
135}
136
137void TEST() {
138 int function_scope = 0;
139 __try {
140
141 }
142 __except( function_scope ? 1 : -1 ) {}
143}
144
145void TEST() {
146 __try {
147 (void)AbnormalTermination; // expected-error{{only allowed in __finally block}}
148 (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
149 }
150 __except( 1 ) {
151 (void)AbnormalTermination; // expected-error{{only allowed in __finally block}}
152 (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
153 }
154
155 __try {
156 }
157 __finally {
158 AbnormalTermination();
159 __abnormal_termination();
160 }
161}
162
163void TEST() {
164 (void)__exception_code; // expected-error{{only allowed in __except block}}
165 (void)__exception_info; // expected-error{{only allowed in __except filter expression}}
166 (void)__abnormal_termination; // expected-error{{only allowed in __finally block}}
167
168 (void)GetExceptionCode(); // expected-error{{only allowed in __except block}}
169 (void)GetExceptionInformation(); // expected-error{{only allowed in __except filter expression}}
170 (void)AbnormalTermination(); // expected-error{{only allowed in __finally block}}
171}