It passes for me locally in debug but not release. On Thu, Feb 5, 2015 at 9:04 PM, Nico Weber <[email protected]> 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 <[email protected]> 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@XZ"(%struct.HasCleanup* >> %{{.*}}) >> +// CXXEH: invoke void @might_throw() >> +// CXXEH: to label %[[cont:[^ ]*]] unwind label %[[lpad:[^ ]*]] >> +// >> +// CXXEH: [[cont]] >> +// CXXEH: call void @"\01??1HasCleanup@@QEAA@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@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@XZ"(%struct.HasCleanup* >> %{{.*}}) >> +// NOCXX-NOT: invoke >> +// NOCXX: call void @might_throw() >> +// NOCXX-NOT: invoke >> +// NOCXX: call void @"\01??1HasCleanup@@QEAA@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@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 >> [email protected] >> http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits >> > > > _______________________________________________ > cfe-commits mailing list > [email protected] > http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits > >
_______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
