diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/test/Regression/C++Frontend/EH/exception_spec_test.cpp | 51 | ||||
| -rw-r--r-- | llvm/test/Regression/C++Frontend/EH/simple_rethrow.cpp | 25 | 
2 files changed, 76 insertions, 0 deletions
diff --git a/llvm/test/Regression/C++Frontend/EH/exception_spec_test.cpp b/llvm/test/Regression/C++Frontend/EH/exception_spec_test.cpp new file mode 100644 index 00000000000..f80f0eeaaba --- /dev/null +++ b/llvm/test/Regression/C++Frontend/EH/exception_spec_test.cpp @@ -0,0 +1,51 @@ +// This tests that exception specifications interact properly with unexpected +// handlers. + +#include <exception> +#include <stdio.h> +#include <stdlib.h> + +static void TerminateHandler() { +  printf("std::terminate called\n"); +  exit(1); +} + +static void UnexpectedHandler1() { +  printf("std::unexpected called: throwing a double\n"); +  throw 1.0; +} + +static void UnexpectedHandler2() { +  printf("std::unexpected called: throwing an int!\n"); +  throw 1; +} + +void test(bool Int) throw (double) { +  if (Int) { +    printf("Throwing an int from a function which only allows doubles!\n"); +    throw 1; +  } else { +    printf("Throwing a double from a function which allows doubles!\n"); +    throw 1.0; +  } +} + +int main() { +  try { +    test(false); +  } catch (double D) { +    printf("Double successfully caught!\n"); +  } + +  std::set_terminate(TerminateHandler); +  std::set_unexpected(UnexpectedHandler1); + +  try { +    test(true); +  } catch (double D) { +    printf("Double successfully caught!\n"); +  } + +  std::set_unexpected(UnexpectedHandler2); +  test(true); +} diff --git a/llvm/test/Regression/C++Frontend/EH/simple_rethrow.cpp b/llvm/test/Regression/C++Frontend/EH/simple_rethrow.cpp new file mode 100644 index 00000000000..34c46812c18 --- /dev/null +++ b/llvm/test/Regression/C++Frontend/EH/simple_rethrow.cpp @@ -0,0 +1,25 @@ +#include <stdio.h> + +int throws() { +  printf("Throwing int\n"); +  throw 16; +}; + +int callsthrows() { +  try { +    throws(); +  } catch (...) { +    printf("Caught something, rethrowing...\n"); +    throw; +  } +} + +int main() { +  try { +    callsthrows(); +  } catch (int i) { +    printf("Caught int: %d\n", i); +    return i-16; +  } +  return 1; +}  | 

