Author: majnemer Date: Mon Jan 25 19:12:17 2016 New Revision: 258762 URL: http://llvm.org/viewvc/llvm-project?rev=258762&view=rev Log: [MS Compat] Don't crash if __GetExceptionInfo is in global scope
__GetExceptionInfo triggered Sema::LazilyCreateBuiltin which tries to create a non-templated function decl. This is unnecessary and ill-advised, there is no need for us to create a declaration for such a builtin. This fixes PR26298. Modified: cfe/trunk/lib/AST/Decl.cpp cfe/trunk/lib/Sema/SemaDecl.cpp cfe/trunk/test/CodeGenCXX/microsoft-abi-throw.cpp Modified: cfe/trunk/lib/AST/Decl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/Decl.cpp?rev=258762&r1=258761&r2=258762&view=diff ============================================================================== --- cfe/trunk/lib/AST/Decl.cpp (original) +++ cfe/trunk/lib/AST/Decl.cpp Mon Jan 25 19:12:17 2016 @@ -2708,8 +2708,7 @@ unsigned FunctionDecl::getBuiltinID() co // declaration, for instance "extern "C" { namespace std { decl } }". if (!LinkageDecl) { if (BuiltinID == Builtin::BI__GetExceptionInfo && - Context.getTargetInfo().getCXXABI().isMicrosoft() && - isInStdNamespace()) + Context.getTargetInfo().getCXXABI().isMicrosoft()) return Builtin::BI__GetExceptionInfo; return 0; } Modified: cfe/trunk/lib/Sema/SemaDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaDecl.cpp?rev=258762&r1=258761&r2=258762&view=diff ============================================================================== --- cfe/trunk/lib/Sema/SemaDecl.cpp (original) +++ cfe/trunk/lib/Sema/SemaDecl.cpp Mon Jan 25 19:12:17 2016 @@ -1748,6 +1748,9 @@ NamedDecl *Sema::LazilyCreateBuiltin(Ide << Context.BuiltinInfo.getName(ID); } + if (R.isNull()) + return nullptr; + DeclContext *Parent = Context.getTranslationUnitDecl(); if (getLangOpts().CPlusPlus) { LinkageSpecDecl *CLinkageDecl = Modified: cfe/trunk/test/CodeGenCXX/microsoft-abi-throw.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/microsoft-abi-throw.cpp?rev=258762&r1=258761&r2=258762&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/microsoft-abi-throw.cpp (original) +++ cfe/trunk/test/CodeGenCXX/microsoft-abi-throw.cpp Mon Jan 25 19:12:17 2016 @@ -1,4 +1,5 @@ // RUN: %clang_cc1 -emit-llvm -o - -triple=i386-pc-win32 -std=c++11 %s -fcxx-exceptions -fms-extensions | FileCheck %s +// RUN: %clang_cc1 -emit-llvm -o - -triple=i386-pc-win32 -std=c++11 %s -fcxx-exceptions -fms-extensions -DSTD | FileCheck %s // CHECK-DAG: @"\01??_R0?AUY@@@8" = linkonce_odr global %rtti.TypeDescriptor7 { i8** @"\01??_7type_info@@6B@", i8* null, [8 x i8] c".?AUY@@\00" }, comdat // CHECK-DAG: @"_CT??_R0?AUY@@@8??0Y@@QAE@ABU0@@Z8" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 4, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0?AUY@@@8" to i8*), i32 0, i32 -1, i32 0, i32 8, i8* bitcast (%struct.Y* (%struct.Y*, %struct.Y*, i32)* @"\01??0Y@@QAE@ABU0@@Z" to i8*) }, section ".xdata", comdat @@ -97,19 +98,25 @@ void h() { throw nullptr; } +#ifdef STD namespace std { template <typename T> void *__GetExceptionInfo(T); } +#else +template <typename T> +void *__GetExceptionInfo(T); +#endif +using namespace std; void *GetExceptionInfo_test0() { // CHECK-LABEL: @"\01?GetExceptionInfo_test0@@YAPAXXZ" // CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1H to i8*) - return std::__GetExceptionInfo(0); + return __GetExceptionInfo(0); } void *GetExceptionInfo_test1() { // CHECK-LABEL: @"\01?GetExceptionInfo_test1@@YAPAXXZ" // CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1P6AXXZ to i8*) - return std::__GetExceptionInfo<void (*)()>(&h); + return __GetExceptionInfo<void (*)()>(&h); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits