1 | // RUN: %clang_cc1 -triple x86_64-windows -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s |
2 | |
3 | // This test is from http://docwiki.embarcadero.com/RADStudio/en/Try |
4 | |
5 | int puts(const char *); |
6 | |
7 | template<typename T> |
8 | int printf(const char *, T); |
9 | |
10 | const char * strdup(const char *); |
11 | |
12 | void free(const void *); |
13 | |
14 | #define EXCEPTION_EXECUTE_HANDLER 1 |
15 | |
16 | class Exception |
17 | { |
18 | public: |
19 | Exception(const char* s = "Unknown"){what = strdup(s); } |
20 | Exception(const Exception& e ){what = strdup(e.what); } |
21 | ~Exception() {free(what); } |
22 | const char* msg() const {return what; } |
23 | private: |
24 | const char* what; |
25 | }; |
26 | |
27 | int main() |
28 | { |
29 | float e, f, g; |
30 | try |
31 | { |
32 | try |
33 | { |
34 | f = 1.0; |
35 | g = 0.0; |
36 | try |
37 | { |
38 | puts("Another exception:"); |
39 | |
40 | e = f / g; |
41 | } |
42 | __except(EXCEPTION_EXECUTE_HANDLER) |
43 | { |
44 | puts("Caught a C-based exception."); |
45 | throw(Exception("Hardware error: Divide by 0")); |
46 | } |
47 | } |
48 | catch(const Exception& e) |
49 | { |
50 | printf("Caught C++ Exception: %s :\n", e.msg()); |
51 | } |
52 | } |
53 | __finally |
54 | { |
55 | puts("C++ allows __finally too!"); |
56 | } |
57 | return e; |
58 | } |
59 | |
60 | namespace PR17584 { |
61 | template <typename> |
62 | void Except() { |
63 | __try { |
64 | } __except(true) { |
65 | } |
66 | } |
67 | |
68 | template <typename> |
69 | void Finally() { |
70 | __try { |
71 | } __finally { |
72 | } |
73 | } |
74 | |
75 | template void Except<void>(); |
76 | template void Finally<void>(); |
77 | |
78 | } |
79 | |
80 | void test___leave() { |
81 | // Most tests are in __try.c. |
82 | |
83 | // Clang accepts try with __finally. MSVC doesn't. (Maybe a Borland thing?) |
84 | // __leave in mixed blocks isn't supported. |
85 | try { |
86 | __leave; // expected-error{{'__leave' statement not in __try block}} |
87 | } __finally { |
88 | } |
89 | } |
90 | |