David Majnemer 7e75550fa1 Sema: Don't crash when __try/__except/__finally appears in a template function
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
2013-10-15 09:30:14 +00:00

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>();
}