r228329 - Re-land r228258 and make clang-cl's /EHs- disable -fexceptions again
Reid Kleckner
rnk at google.com
Fri Feb 6 10:46:34 PST 2015
It passes for me locally in debug but not release.
On Thu, Feb 5, 2015 at 9:04 PM, Nico Weber <thakis at chromium.org> wrote:
> WrappedWindowProc.CatchesExceptions started failing again on all 64-bit
> chromium bots, with a regression range of r228301:228332. Probably this
> change again?
>
> On Thu, Feb 5, 2015 at 10:56 AM, Reid Kleckner <reid at kleckner.net> wrote:
>
>> Author: rnk
>> Date: Thu Feb 5 12:56:03 2015
>> New Revision: 228329
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=228329&view=rev
>> Log:
>> Re-land r228258 and make clang-cl's /EHs- disable -fexceptions again
>>
>> After r228258, Clang started emitting C++ EH IR that LLVM wasn't ready
>> to deal with, even when exceptions were disabled with /EHs-. This time,
>> make /EHs- turn off -fexceptions while still emitting exceptional
>> constructs in functions using __try. Since Sema rejects C++ exception
>> handling constructs before CodeGen, landingpads should only appear in
>> such functions as the result of a __try.
>>
>> Added:
>> cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp
>> Modified:
>> cfe/trunk/include/clang/AST/Decl.h
>> cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> cfe/trunk/lib/CodeGen/CGException.cpp
>> cfe/trunk/lib/Driver/Tools.cpp
>> cfe/trunk/lib/Sema/SemaStmt.cpp
>> cfe/trunk/test/CodeGen/exceptions-seh-finally.c
>> cfe/trunk/test/CodeGen/exceptions-seh-leave.c
>> cfe/trunk/test/CodeGen/exceptions-seh.c
>> cfe/trunk/test/Driver/cl-eh.cpp
>> cfe/trunk/test/SemaCXX/exceptions-seh.cpp
>>
>> Modified: cfe/trunk/include/clang/AST/Decl.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/AST/Decl.h?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/AST/Decl.h (original)
>> +++ cfe/trunk/include/clang/AST/Decl.h Thu Feb 5 12:56:03 2015
>> @@ -1482,6 +1482,9 @@ private:
>> bool IsLateTemplateParsed : 1;
>> bool IsConstexpr : 1;
>>
>> + /// \brief Indicates if the function uses __try.
>> + bool UsesSEHTry : 1;
>> +
>> /// \brief Indicates if the function was a definition but its body was
>> /// skipped.
>> unsigned HasSkippedBody : 1;
>> @@ -1570,8 +1573,8 @@ protected:
>> HasWrittenPrototype(true), IsDeleted(false), IsTrivial(false),
>> IsDefaulted(false), IsExplicitlyDefaulted(false),
>> HasImplicitReturnZero(false), IsLateTemplateParsed(false),
>> - IsConstexpr(isConstexprSpecified), HasSkippedBody(false),
>> - EndRangeLoc(NameInfo.getEndLoc()),
>> + IsConstexpr(isConstexprSpecified), UsesSEHTry(false),
>> + HasSkippedBody(false), EndRangeLoc(NameInfo.getEndLoc()),
>> TemplateOrSpecialization(),
>> DNLoc(NameInfo.getInfo()) {}
>>
>> @@ -1751,6 +1754,10 @@ public:
>> bool isConstexpr() const { return IsConstexpr; }
>> void setConstexpr(bool IC) { IsConstexpr = IC; }
>>
>> + /// Whether this is a (C++11) constexpr function or constexpr
>> constructor.
>> + bool usesSEHTry() const { return UsesSEHTry; }
>> + void setUsesSEHTry(bool UST) { UsesSEHTry = UST; }
>> +
>> /// \brief Whether this function has been deleted.
>> ///
>> /// A function that is "deleted" (via the C++0x "= delete" syntax)
>>
>> Modified: cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td (original)
>> +++ cfe/trunk/include/clang/Basic/DiagnosticSemaKinds.td Thu Feb 5
>> 12:56:03 2015
>> @@ -5466,6 +5466,8 @@ def err_exceptions_disabled : Error<
>> "cannot use '%0' with exceptions disabled">;
>> def err_objc_exceptions_disabled : Error<
>> "cannot use '%0' with Objective-C exceptions disabled">;
>> +def err_seh_try_outside_functions : Error<
>> + "cannot use SEH '__try' in blocks, captured regions, or Obj-C method
>> decls">;
>> def err_mixing_cxx_try_seh_try : Error<
>> "cannot use C++ 'try' in the same function as SEH '__try'">;
>> def note_conflicting_try_here : Note<
>>
>> Modified: cfe/trunk/lib/CodeGen/CGException.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGException.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/CodeGen/CGException.cpp (original)
>> +++ cfe/trunk/lib/CodeGen/CGException.cpp Thu Feb 5 12:56:03 2015
>> @@ -128,7 +128,12 @@ namespace {
>> // This function must have prototype void(void*).
>> const char *CatchallRethrowFn;
>>
>> - static const EHPersonality &get(CodeGenModule &CGM);
>> + static const EHPersonality &get(CodeGenModule &CGM,
>> + const FunctionDecl *FD);
>> + static const EHPersonality &get(CodeGenFunction &CGF) {
>> + return get(CGF.CGM,
>> dyn_cast_or_null<FunctionDecl>(CGF.CurCodeDecl));
>> + }
>> +
>> static const EHPersonality GNU_C;
>> static const EHPersonality GNU_C_SJLJ;
>> static const EHPersonality GNU_C_SEH;
>> @@ -141,6 +146,7 @@ namespace {
>> static const EHPersonality GNU_CPlusPlus_SEH;
>> static const EHPersonality MSVC_except_handler;
>> static const EHPersonality MSVC_C_specific_handler;
>> + static const EHPersonality MSVC_CxxFrameHandler3;
>> };
>> }
>>
>> @@ -167,6 +173,8 @@ const EHPersonality
>> EHPersonality::MSVC_except_handler = { "_except_handler3", nullptr };
>> const EHPersonality
>> EHPersonality::MSVC_C_specific_handler = { "__C_specific_handler",
>> nullptr };
>> +const EHPersonality
>> +EHPersonality::MSVC_CxxFrameHandler3 = { "__CxxFrameHandler3", nullptr };
>>
>> /// On Win64, use libgcc's SEH personality function. We fall back to
>> dwarf on
>> /// other platforms, unless the user asked for SjLj exceptions.
>> @@ -239,35 +247,27 @@ static const EHPersonality &getObjCXXPer
>> llvm_unreachable("bad runtime kind");
>> }
>>
>> -static const EHPersonality &getCPersonalityMSVC(const llvm::Triple &T,
>> - const LangOptions &L) {
>> - if (L.SjLjExceptions)
>> - return EHPersonality::GNU_C_SJLJ;
>> -
>> +static const EHPersonality &getSEHPersonalityMSVC(const llvm::Triple &T)
>> {
>> if (T.getArch() == llvm::Triple::x86)
>> return EHPersonality::MSVC_except_handler;
>> return EHPersonality::MSVC_C_specific_handler;
>> }
>>
>> -static const EHPersonality &getCXXPersonalityMSVC(const llvm::Triple &T,
>> - const LangOptions &L) {
>> - if (L.SjLjExceptions)
>> - return EHPersonality::GNU_CPlusPlus_SJLJ;
>> - // FIXME: Implement C++ exceptions.
>> - return getCPersonalityMSVC(T, L);
>> -}
>> -
>> -const EHPersonality &EHPersonality::get(CodeGenModule &CGM) {
>> +const EHPersonality &EHPersonality::get(CodeGenModule &CGM,
>> + const FunctionDecl *FD) {
>> const llvm::Triple &T = CGM.getTarget().getTriple();
>> const LangOptions &L = CGM.getLangOpts();
>> +
>> // Try to pick a personality function that is compatible with MSVC if
>> we're
>> // not compiling Obj-C. Obj-C users better have an Obj-C runtime that
>> supports
>> // the GCC-style personality function.
>> if (T.isWindowsMSVCEnvironment() && !L.ObjC1) {
>> - if (L.CPlusPlus)
>> - return getCXXPersonalityMSVC(T, L);
>> + if (L.SjLjExceptions)
>> + return EHPersonality::GNU_CPlusPlus_SJLJ;
>> + else if (FD && FD->usesSEHTry())
>> + return getSEHPersonalityMSVC(T);
>> else
>> - return getCPersonalityMSVC(T, L);
>> + return EHPersonality::MSVC_CxxFrameHandler3;
>> }
>>
>> if (L.CPlusPlus && L.ObjC1)
>> @@ -354,7 +354,7 @@ void CodeGenModule::SimplifyPersonality(
>> if (!LangOpts.ObjCRuntime.isNeXTFamily())
>> return;
>>
>> - const EHPersonality &ObjCXX = EHPersonality::get(*this);
>> + const EHPersonality &ObjCXX = EHPersonality::get(*this,
>> /*FD=*/nullptr);
>> const EHPersonality &CXX =
>> getCXXPersonality(getTarget().getTriple(), LangOpts);
>> if (&ObjCXX == &CXX)
>> @@ -737,8 +737,16 @@ llvm::BasicBlock *CodeGenFunction::getIn
>> assert(EHStack.requiresLandingPad());
>> assert(!EHStack.empty());
>>
>> - if (!CGM.getLangOpts().Exceptions)
>> - return nullptr;
>> + // If exceptions are disabled, there are usually no landingpads.
>> However, when
>> + // SEH is enabled, functions using SEH still get landingpads.
>> + const LangOptions &LO = CGM.getLangOpts();
>> + if (!LO.Exceptions) {
>> + if (!LO.Borland && !LO.MicrosoftExt)
>> + return nullptr;
>> + const auto *FD = dyn_cast_or_null<FunctionDecl>(CurCodeDecl);
>> + if (!FD || !FD->usesSEHTry())
>> + return nullptr;
>> + }
>>
>> // Check the innermost scope for a cached landing pad. If this is
>> // a non-EH cleanup, we'll check enclosing scopes in EmitLandingPad.
>> @@ -778,7 +786,7 @@ llvm::BasicBlock *CodeGenFunction::EmitL
>> CGBuilderTy::InsertPoint savedIP = Builder.saveAndClearIP();
>> auto DL = ApplyDebugLocation::CreateDefaultArtificial(*this,
>> CurEHLocation);
>>
>> - const EHPersonality &personality = EHPersonality::get(CGM);
>> + const EHPersonality &personality = EHPersonality::get(*this);
>>
>> // Create and configure the landing pad.
>> llvm::BasicBlock *lpad = createBasicBlock("lpad");
>> @@ -1595,7 +1603,7 @@ llvm::BasicBlock *CodeGenFunction::getTe
>> Builder.SetInsertPoint(TerminateLandingPad);
>>
>> // Tell the backend that this is a landing pad.
>> - const EHPersonality &Personality = EHPersonality::get(CGM);
>> + const EHPersonality &Personality = EHPersonality::get(*this);
>> llvm::LandingPadInst *LPadInst =
>> Builder.CreateLandingPad(llvm::StructType::get(Int8PtrTy, Int32Ty,
>> nullptr),
>> getOpaquePersonalityFn(CGM, Personality),
>> 0);
>> @@ -1654,7 +1662,7 @@ llvm::BasicBlock *CodeGenFunction::getEH
>> EHResumeBlock = createBasicBlock("eh.resume");
>> Builder.SetInsertPoint(EHResumeBlock);
>>
>> - const EHPersonality &Personality = EHPersonality::get(CGM);
>> + const EHPersonality &Personality = EHPersonality::get(*this);
>>
>> // This can always be a call because we necessarily didn't find
>> // anything on the EH stack which needs our help.
>>
>> Modified: cfe/trunk/lib/Driver/Tools.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Tools.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Driver/Tools.cpp (original)
>> +++ cfe/trunk/lib/Driver/Tools.cpp Thu Feb 5 12:56:03 2015
>> @@ -4877,10 +4877,10 @@ void Clang::AddClangCLArgs(const ArgList
>> const Driver &D = getToolChain().getDriver();
>> EHFlags EH = parseClangCLEHFlags(D, Args);
>> // FIXME: Do something with NoExceptC.
>> - if (EH.Synch || EH.Asynch)
>> + if (EH.Synch || EH.Asynch) {
>> CmdArgs.push_back("-fcxx-exceptions");
>> - // Always add -fexceptions to allow SEH __try.
>> - CmdArgs.push_back("-fexceptions");
>> + CmdArgs.push_back("-fexceptions");
>> + }
>>
>> // /EP should expand to -E -P.
>> if (Args.hasArg(options::OPT__SLASH_EP)) {
>>
>> Modified: cfe/trunk/lib/Sema/SemaStmt.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaStmt.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/lib/Sema/SemaStmt.cpp (original)
>> +++ cfe/trunk/lib/Sema/SemaStmt.cpp Thu Feb 5 12:56:03 2015
>> @@ -3303,11 +3303,12 @@ StmtResult Sema::ActOnCXXTryBlock(Source
>> if (getCurScope() && getCurScope()->isOpenMPSimdDirectiveScope())
>> Diag(TryLoc, diag::err_omp_simd_region_cannot_use_stmt) << "try";
>>
>> + sema::FunctionScopeInfo *FSI = getCurFunction();
>> +
>> // C++ try is incompatible with SEH __try.
>> - if (!getLangOpts().Borland &&
>> getCurFunction()->FirstSEHTryLoc.isValid()) {
>> + if (!getLangOpts().Borland && FSI->FirstSEHTryLoc.isValid()) {
>> Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>> - Diag(getCurFunction()->FirstSEHTryLoc,
>> diag::note_conflicting_try_here)
>> - << "'__try'";
>> + Diag(FSI->FirstSEHTryLoc, diag::note_conflicting_try_here) <<
>> "'__try'";
>> }
>>
>> const unsigned NumHandlers = Handlers.size();
>> @@ -3352,7 +3353,7 @@ StmtResult Sema::ActOnCXXTryBlock(Source
>> }
>> }
>>
>> - getCurFunction()->setHasCXXTry(TryLoc);
>> + FSI->setHasCXXTry(TryLoc);
>>
>> // FIXME: We should detect handlers that cannot catch anything because
>> an
>> // earlier handler catches a superclass. Need to find a method that is
>> not
>> @@ -3367,15 +3368,29 @@ StmtResult Sema::ActOnSEHTryBlock(bool I
>> Stmt *TryBlock, Stmt *Handler) {
>> assert(TryBlock && Handler);
>>
>> + sema::FunctionScopeInfo *FSI = getCurFunction();
>> +
>> // SEH __try is incompatible with C++ try. Borland appears to support
>> this,
>> // however.
>> - if (!getLangOpts().Borland &&
>> getCurFunction()->FirstCXXTryLoc.isValid()) {
>> - Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>> - Diag(getCurFunction()->FirstCXXTryLoc,
>> diag::note_conflicting_try_here)
>> - << "'try'";
>> + if (!getLangOpts().Borland) {
>> + if (FSI->FirstCXXTryLoc.isValid()) {
>> + Diag(TryLoc, diag::err_mixing_cxx_try_seh_try);
>> + Diag(FSI->FirstCXXTryLoc, diag::note_conflicting_try_here) <<
>> "'try'";
>> + }
>> }
>>
>> - getCurFunction()->setHasSEHTry(TryLoc);
>> + FSI->setHasSEHTry(TryLoc);
>> +
>> + // Reject __try in Obj-C methods, blocks, and captured decls, since we
>> don't
>> + // track if they use SEH.
>> + DeclContext *DC = CurContext;
>> + while (DC && !DC->isFunctionOrMethod())
>> + DC = DC->getParent();
>> + FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(DC);
>> + if (FD)
>> + FD->setUsesSEHTry(true);
>> + else
>> + Diag(TryLoc, diag::err_seh_try_outside_functions);
>>
>> return SEHTryStmt::Create(Context, IsCXXTry, TryLoc, TryBlock,
>> Handler);
>> }
>>
>> Modified: cfe/trunk/test/CodeGen/exceptions-seh-finally.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh-finally.c?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/exceptions-seh-finally.c (original)
>> +++ cfe/trunk/test/CodeGen/exceptions-seh-finally.c Thu Feb 5 12:56:03
>> 2015
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fexceptions
>> -fms-extensions -emit-llvm -o - | FileCheck %s
>> +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm
>> -o - | FileCheck %s
>>
>> void abort(void) __attribute__((noreturn));
>> void might_crash(void);
>>
>> Modified: cfe/trunk/test/CodeGen/exceptions-seh-leave.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh-leave.c?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/exceptions-seh-leave.c (original)
>> +++ cfe/trunk/test/CodeGen/exceptions-seh-leave.c Thu Feb 5 12:56:03 2015
>> @@ -1,4 +1,4 @@
>> -// RUN: not %clang_cc1 -triple x86_64-pc-win32 -fexceptions
>> -fms-extensions -emit-llvm -o - %s 2>&1 | FileCheck %s
>> +// RUN: not %clang_cc1 -triple x86_64-pc-win32 -fms-extensions
>> -emit-llvm -o - %s 2>&1 | FileCheck %s
>>
>> // This is a codegen test because we only emit the diagnostic when we
>> start
>> // generating code.
>>
>> Modified: cfe/trunk/test/CodeGen/exceptions-seh.c
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGen/exceptions-seh.c?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGen/exceptions-seh.c (original)
>> +++ cfe/trunk/test/CodeGen/exceptions-seh.c Thu Feb 5 12:56:03 2015
>> @@ -1,4 +1,4 @@
>> -// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fexceptions
>> -fms-extensions -emit-llvm -o - | FileCheck %s
>> +// RUN: %clang_cc1 %s -triple x86_64-pc-win32 -fms-extensions -emit-llvm
>> -o - | FileCheck %s
>>
>> // FIXME: Perform this outlining automatically CodeGen.
>> void try_body(int numerator, int denominator, int *myres) {
>>
>> Added: cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp?rev=228329&view=auto
>>
>> ==============================================================================
>> --- cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp (added)
>> +++ cfe/trunk/test/CodeGenCXX/exceptions-seh.cpp Thu Feb 5 12:56:03 2015
>> @@ -0,0 +1,95 @@
>> +// RUN: %clang_cc1 -std=c++11 -fblocks -fms-extensions %s
>> -triple=x86_64-windows-msvc -emit-llvm \
>> +// RUN: -o - -mconstructor-aliases -fcxx-exceptions -fexceptions
>> | \
>> +// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CXXEH
>> +// RUN: %clang_cc1 -std=c++11 -fblocks -fms-extensions %s
>> -triple=x86_64-windows-msvc -emit-llvm \
>> +// RUN: -o - -mconstructor-aliases | \
>> +// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=NOCXX
>> +
>> +extern "C" void might_throw();
>> +
>> +struct HasCleanup {
>> + HasCleanup();
>> + ~HasCleanup();
>> + int padding;
>> +};
>> +
>> +extern "C" void use_cxx() {
>> + HasCleanup x;
>> + might_throw();
>> +}
>> +
>> +// Make sure we use __CxxFrameHandler3 for C++ EH.
>> +
>> +// CXXEH-LABEL: define void @use_cxx()
>> +// CXXEH: call %struct.HasCleanup* @"\01??0HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>> %{{.*}})
>> +// CXXEH: invoke void @might_throw()
>> +// CXXEH: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
>> +//
>> +// CXXEH: [[cont]]
>> +// CXXEH: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>> %{{.*}})
>> +// CXXEH: ret void
>> +//
>> +// CXXEH: [[lpad]]
>> +// CXXEH: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>> @__CxxFrameHandler3 to i8*)
>> +// CXXEH-NEXT: cleanup
>> +// CXXEH: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>> %{{.*}})
>> +// CXXEH: br label %[[resume:[^ ]*]]
>> +//
>> +// CXXEH: [[resume]]
>> +// CXXEH: resume
>> +
>> +// NOCXX-LABEL: define void @use_cxx()
>> +// NOCXX-NOT: invoke
>> +// NOCXX: call %struct.HasCleanup* @"\01??0HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>> %{{.*}})
>> +// NOCXX-NOT: invoke
>> +// NOCXX: call void @might_throw()
>> +// NOCXX-NOT: invoke
>> +// NOCXX: call void @"\01??1HasCleanup@@QEAA at XZ"(%struct.HasCleanup*
>> %{{.*}})
>> +// NOCXX-NOT: invoke
>> +// NOCXX: ret void
>> +
>> +extern "C" void use_seh() {
>> + __try {
>> + might_throw();
>> + } __except(1) {
>> + }
>> +}
>> +
>> +// Make sure we use __C_specific_handler for SEH.
>> +
>> +// CHECK-LABEL: define void @use_seh()
>> +// CHECK: invoke void @might_throw()
>> +// CHECK: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]]
>> +//
>> +// CHECK: [[cont]]
>> +// CHECK: br label %[[ret:[^ ]*]]
>> +//
>> +// CHECK: [[lpad]]
>> +// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>> @__C_specific_handler to i8*)
>> +// CHECK-NEXT: catch i8*
>> +//
>> +// CHECK: br label %[[ret]]
>> +//
>> +// CHECK: [[ret]]
>> +// CHECK: ret void
>> +
>> +void use_seh_in_lambda() {
>> + ([]() {
>> + __try {
>> + might_throw();
>> + } __except(1) {
>> + }
>> + })();
>> + HasCleanup x;
>> + might_throw();
>> +}
>> +
>> +// CXXEH-LABEL: define void @"\01?use_seh_in_lambda@@YAXXZ"()
>> +// CXXEH: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>> @__CxxFrameHandler3 to i8*)
>> +
>> +// NOCXX-LABEL: define void @"\01?use_seh_in_lambda@@YAXXZ"()
>> +// NOCXX-NOT: invoke
>> +// NOCXX: ret void
>> +
>> +// CHECK-LABEL: define internal void
>> @"\01??R<lambda_0>@?use_seh_in_lambda@@YAXXZ at QEBAXXZ"(%class.anon* %this)
>> +// CHECK: landingpad { i8*, i32 } personality i8* bitcast (i32 (...)*
>> @__C_specific_handler to i8*)
>>
>> Modified: cfe/trunk/test/Driver/cl-eh.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-eh.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/Driver/cl-eh.cpp (original)
>> +++ cfe/trunk/test/Driver/cl-eh.cpp Thu Feb 5 12:56:03 2015
>> @@ -10,11 +10,11 @@
>>
>> // RUN: %clang_cl /c /EHs-c- -### -- %s 2>&1 | FileCheck
>> -check-prefix=EHs_c_ %s
>> // EHs_c_-NOT: "-fcxx-exceptions"
>> -// EHs_c_: "-fexceptions"
>> +// EHs_c_-NOT: "-fexceptions"
>>
>> // RUN: %clang_cl /c /EHs- /EHc- -### -- %s 2>&1 | FileCheck
>> -check-prefix=EHs_EHc_ %s
>> // EHs_EHc_-NOT: "-fcxx-exceptions"
>> -// EHs_EHc_: "-fexceptions"
>> +// EHs_EHc_-NOT: "-fexceptions"
>>
>> // RUN: %clang_cl /c /EHs- /EHs -### -- %s 2>&1 | FileCheck
>> -check-prefix=EHs_EHs %s
>> // EHs_EHs: "-fcxx-exceptions"
>>
>> Modified: cfe/trunk/test/SemaCXX/exceptions-seh.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/SemaCXX/exceptions-seh.cpp?rev=228329&r1=228328&r2=228329&view=diff
>>
>> ==============================================================================
>> --- cfe/trunk/test/SemaCXX/exceptions-seh.cpp (original)
>> +++ cfe/trunk/test/SemaCXX/exceptions-seh.cpp Thu Feb 5 12:56:03 2015
>> @@ -1,4 +1,5 @@
>> -// RUN: %clang_cc1 -triple x86_64-windows-msvc -fms-extensions
>> -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>> +// RUN: %clang_cc1 -std=c++03 -fblocks -triple x86_64-windows-msvc
>> -fms-extensions -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>> +// RUN: %clang_cc1 -std=c++11 -fblocks -triple x86_64-windows-msvc
>> -fms-extensions -fsyntax-only -fexceptions -fcxx-exceptions -verify %s
>>
>> // Basic usage should work.
>> int safe_div(int n, int d) {
>> @@ -37,6 +38,7 @@ void instantiate_bad_scope_tmpl() {
>> bad_builtin_scope_template<might_crash>();
>> }
>>
>> +#if __cplusplus < 201103L
>> // FIXME: Diagnose this case. For now we produce undef in codegen.
>> template <typename T, T FN()>
>> T func_template() {
>> @@ -46,6 +48,7 @@ void inject_builtins() {
>> func_template<void *, __exception_info>();
>> func_template<unsigned long, __exception_code>();
>> }
>> +#endif
>>
>> void use_seh_after_cxx() {
>> try { // expected-note {{conflicting 'try' here}}
>> @@ -68,3 +71,45 @@ void use_cxx_after_seh() {
>> } catch (int) {
>> }
>> }
>> +
>> +#if __cplusplus >= 201103L
>> +void use_seh_in_lambda() {
>> + ([]() {
>> + __try {
>> + might_crash();
>> + } __except(1) {
>> + }
>> + })();
>> + try {
>> + might_crash();
>> + } catch (int) {
>> + }
>> +}
>> +#endif
>> +
>> +void use_seh_in_block() {
>> + void (^b)() = ^{
>> + __try { // expected-error {{cannot use SEH '__try' in blocks,
>> captured regions, or Obj-C method decls}}
>> + might_crash();
>> + } __except(1) {
>> + }
>> + };
>> + try {
>> + b();
>> + } catch (int) {
>> + }
>> +}
>> +
>> +void (^use_seh_in_global_block)() = ^{
>> + __try { // expected-error {{cannot use SEH '__try' in blocks, captured
>> regions, or Obj-C method decls}}
>> + might_crash();
>> + } __except(1) {
>> + }
>> +};
>> +
>> +void (^use_cxx_in_global_block)() = ^{
>> + try {
>> + might_crash();
>> + } catch(int) {
>> + }
>> +};
>>
>>
>> _______________________________________________
>> cfe-commits mailing list
>> cfe-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150206/6a19340a/attachment.html>
More information about the cfe-commits
mailing list