brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · eb4612f Raw
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