90 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-windows -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s2 3// This test is from http://docwiki.embarcadero.com/RADStudio/en/Try4 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 115 16class Exception17{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 try31 {32 try33 {34 f = 1.0;35 g = 0.0;36 try37 {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 __finally54 {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