We wouldn't transform the compound statement in any of these forms, causing crashes when it got time to act on them. Additionally, we wouldn't check to see if the handler was invalid before deciding whether or not we should continue acting on the __try. This fixes PR17584. llvm-svn: 192682
80 lines
1.4 KiB
C++
80 lines
1.4 KiB
C++
// RUN: %clang_cc1 -fsyntax-only -verify -fborland-extensions -fcxx-exceptions %s
|
|
// expected-no-diagnostics
|
|
|
|
// This test is from http://docwiki.embarcadero.com/RADStudio/en/Try
|
|
|
|
int puts(const char *);
|
|
|
|
template<typename T>
|
|
int printf(const char *, T);
|
|
|
|
const char * strdup(const char *);
|
|
|
|
void free(const void *);
|
|
|
|
#define EXCEPTION_EXECUTE_HANDLER 1
|
|
|
|
class Exception
|
|
{
|
|
public:
|
|
Exception(const char* s = "Unknown"){what = strdup(s); }
|
|
Exception(const Exception& e ){what = strdup(e.what); }
|
|
~Exception() {free(what); }
|
|
const char* msg() const {return what; }
|
|
private:
|
|
const char* what;
|
|
};
|
|
|
|
int main()
|
|
{
|
|
float e, f, g;
|
|
try
|
|
{
|
|
try
|
|
{
|
|
f = 1.0;
|
|
g = 0.0;
|
|
try
|
|
{
|
|
puts("Another exception:");
|
|
|
|
e = f / g;
|
|
}
|
|
__except(EXCEPTION_EXECUTE_HANDLER)
|
|
{
|
|
puts("Caught a C-based exception.");
|
|
throw(Exception("Hardware error: Divide by 0"));
|
|
}
|
|
}
|
|
catch(const Exception& e)
|
|
{
|
|
printf("Caught C++ Exception: %s :\n", e.msg());
|
|
}
|
|
}
|
|
__finally
|
|
{
|
|
puts("C++ allows __finally too!");
|
|
}
|
|
return e;
|
|
}
|
|
|
|
namespace PR17584 {
|
|
template <typename>
|
|
void Except() {
|
|
__try {
|
|
} __except(true) {
|
|
}
|
|
}
|
|
|
|
template <typename>
|
|
void Finally() {
|
|
__try {
|
|
} __finally {
|
|
}
|
|
}
|
|
|
|
template void Except<void>();
|
|
template void Finally<void>();
|
|
|
|
}
|