forked from OSchip/llvm-project
[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. llvm-svn: 258762
This commit is contained in:
parent
ff33e3636d
commit
145abde152
|
@ -2708,8 +2708,7 @@ unsigned FunctionDecl::getBuiltinID() const {
|
||||||
// declaration, for instance "extern "C" { namespace std { decl } }".
|
// declaration, for instance "extern "C" { namespace std { decl } }".
|
||||||
if (!LinkageDecl) {
|
if (!LinkageDecl) {
|
||||||
if (BuiltinID == Builtin::BI__GetExceptionInfo &&
|
if (BuiltinID == Builtin::BI__GetExceptionInfo &&
|
||||||
Context.getTargetInfo().getCXXABI().isMicrosoft() &&
|
Context.getTargetInfo().getCXXABI().isMicrosoft())
|
||||||
isInStdNamespace())
|
|
||||||
return Builtin::BI__GetExceptionInfo;
|
return Builtin::BI__GetExceptionInfo;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1748,6 +1748,9 @@ NamedDecl *Sema::LazilyCreateBuiltin(IdentifierInfo *II, unsigned ID,
|
||||||
<< Context.BuiltinInfo.getName(ID);
|
<< Context.BuiltinInfo.getName(ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (R.isNull())
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
DeclContext *Parent = Context.getTranslationUnitDecl();
|
DeclContext *Parent = Context.getTranslationUnitDecl();
|
||||||
if (getLangOpts().CPlusPlus) {
|
if (getLangOpts().CPlusPlus) {
|
||||||
LinkageSpecDecl *CLinkageDecl =
|
LinkageSpecDecl *CLinkageDecl =
|
||||||
|
|
|
@ -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 | 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: @"\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
|
// 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;
|
throw nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef STD
|
||||||
namespace std {
|
namespace std {
|
||||||
template <typename T>
|
template <typename T>
|
||||||
void *__GetExceptionInfo(T);
|
void *__GetExceptionInfo(T);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
template <typename T>
|
||||||
|
void *__GetExceptionInfo(T);
|
||||||
|
#endif
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
void *GetExceptionInfo_test0() {
|
void *GetExceptionInfo_test0() {
|
||||||
// CHECK-LABEL: @"\01?GetExceptionInfo_test0@@YAPAXXZ"
|
// CHECK-LABEL: @"\01?GetExceptionInfo_test0@@YAPAXXZ"
|
||||||
// CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1H to i8*)
|
// CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1H to i8*)
|
||||||
return std::__GetExceptionInfo(0);
|
return __GetExceptionInfo(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *GetExceptionInfo_test1() {
|
void *GetExceptionInfo_test1() {
|
||||||
// CHECK-LABEL: @"\01?GetExceptionInfo_test1@@YAPAXXZ"
|
// CHECK-LABEL: @"\01?GetExceptionInfo_test1@@YAPAXXZ"
|
||||||
// CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1P6AXXZ to i8*)
|
// CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1P6AXXZ to i8*)
|
||||||
return std::__GetExceptionInfo<void (*)()>(&h);
|
return __GetExceptionInfo<void (*)()>(&h);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue