1// RUN: %clang_cc1 -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s 2 3// This test is from http://docwiki.embarcadero.com/RADStudio/en/Try 4 5int puts(const char *); 6 7template<typename T> 8int printf(const char *, T); 9 10const char * strdup(const char *); 11 12void free(const void *); 13 14#define EXCEPTION_EXECUTE_HANDLER 1 15 16class Exception 17{ 18public: 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; } 23private: 24 const char* what; 25}; 26 27int 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 60namespace PR17584 { 61template <typename> 62void Except() { 63 __try { 64 } __except(true) { 65 } 66} 67 68template <typename> 69void Finally() { 70 __try { 71 } __finally { 72 } 73} 74 75template void Except<void>(); 76template void Finally<void>(); 77 78} 79 80void 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