From 192d781cd5d580756692f997bc5592f8a5962f7c Mon Sep 17 00:00:00 2001 From: Reid Kleckner Date: Mon, 5 May 2014 21:12:12 +0000 Subject: [PATCH] MS ABI: Emit an error during IRgen on C++ exception handling Currently, users get error messages about RTTI descriptor mangling with no useful source location. This addresses that. Another approach would be to disable C++ exceptions by default in the driver when using the Microsoft C++ ABI. However, this makes it impossible to parse system headers that use exception handling constructs. By delaying the error to IRgen, we can figure out if we actually need to emit code for this construct. Additionally, users who are only interested in building refactoring tools on Windows still get a correct AST without having to add flags. Finally, this is consistent with what we do for SEH. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@207999 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/CGException.cpp | 10 +++++++++ test/CodeGenCXX/microsoft-abi-try-throw.cpp | 23 +++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/CodeGenCXX/microsoft-abi-try-throw.cpp diff --git a/lib/CodeGen/CGException.cpp b/lib/CodeGen/CGException.cpp index ca31717403..bd54523493 100644 --- a/lib/CodeGen/CGException.cpp +++ b/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()); @@ -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/test/CodeGenCXX/microsoft-abi-try-throw.cpp b/test/CodeGenCXX/microsoft-abi-try-throw.cpp new file mode 100644 index 0000000000..95c2cbd817 --- /dev/null +++ b/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; +} -- 2.40.0