diff options
-rw-r--r-- | clang/lib/CodeGen/CGException.cpp | 10 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/microsoft-abi-try-throw.cpp | 23 |
2 files changed, 33 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGException.cpp b/clang/lib/CodeGen/CGException.cpp index ca31717403e..bd545234938 100644 --- a/clang/lib/CodeGen/CGException.cpp +++ b/clang/lib/CodeGen/CGException.cpp @@ -418,6 +418,11 @@ llvm::Value *CodeGenFunction::getSelectorFromSlot() { void CodeGenFunction::EmitCXXThrowExpr(const CXXThrowExpr *E, bool KeepInsertionPoint) { + if (CGM.getTarget().getTriple().isWindowsMSVCEnvironment()) { + ErrorUnsupported(E, "throw expression"); + return; + } + if (!E->getSubExpr()) { EmitNoreturnRuntimeCallOrInvoke(getReThrowFn(CGM), ArrayRef<llvm::Value*>()); @@ -574,6 +579,11 @@ void CodeGenFunction::EmitEndEHSpec(const Decl *D) { } void CodeGenFunction::EmitCXXTryStmt(const CXXTryStmt &S) { + if (CGM.getTarget().getTriple().isWindowsMSVCEnvironment()) { + ErrorUnsupported(&S, "try statement"); + return; + } + EnterCXXTryStmt(S); EmitStmt(S.getTryBlock()); ExitCXXTryStmt(S); diff --git a/clang/test/CodeGenCXX/microsoft-abi-try-throw.cpp b/clang/test/CodeGenCXX/microsoft-abi-try-throw.cpp new file mode 100644 index 00000000000..95c2cbd817b --- /dev/null +++ b/clang/test/CodeGenCXX/microsoft-abi-try-throw.cpp @@ -0,0 +1,23 @@ +// RUN: %clang_cc1 -emit-llvm-only %s -triple=i386-pc-win32 -mconstructor-aliases -fcxx-exceptions -fexceptions -fno-rtti -verify -DTRY +// RUN: %clang_cc1 -emit-llvm-only %s -triple=i386-pc-win32 -mconstructor-aliases -fcxx-exceptions -fexceptions -fno-rtti -verify -DTHROW + +void external(); + +inline void not_emitted() { + throw int(13); // no error +} + +int main() { + int rv = 0; +#ifdef TRY + try { // expected-error {{cannot compile this try statement yet}} + external(); + } catch (int) { + rv = 1; + } +#endif +#ifdef THROW + throw int(42); // expected-error {{cannot compile this throw expression yet}} +#endif + return rv; +} |