forked from OSchip/llvm-project
[MS ABI] A pointer-to-function cannot be caught as a pointer-to-void
Don't assume that all pointers are convertible to void pointer. Instead correctly respect [conv.ptr]p2; only allow pointer types with an object pointee type to be caught as pointer-to-void. llvm-svn: 234090
This commit is contained in:
parent
1d359d3b5b
commit
f205f5324b
|
@ -3597,9 +3597,10 @@ llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) {
|
|||
// - a standard pointer conversion (4.10) not involving conversions to
|
||||
// pointers to private or protected or ambiguous classes
|
||||
//
|
||||
// All pointers are convertible to pointer-to-void so ensure that it is in the
|
||||
// CatchableTypeArray.
|
||||
if (IsPointer)
|
||||
// C++14 [conv.ptr]p2:
|
||||
// A prvalue of type "pointer to cv T," where T is an object type, can be
|
||||
// converted to a prvalue of type "pointer to cv void".
|
||||
if (IsPointer && T->getPointeeType()->isObjectType())
|
||||
CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
|
||||
|
||||
// C++14 [except.handle]p3:
|
||||
|
|
|
@ -16,6 +16,9 @@
|
|||
// CHECK-DAG: @"_CT??_R0?AUVariadic@@@8??_OVariadic@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor14* @"\01??_R0?AUVariadic@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.Variadic*, %struct.Variadic*)* @"\01??_OVariadic@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CT??_R0?AUTemplateWithDefault@@@8??$?_OH@TemplateWithDefault@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor25* @"\01??_R0?AUTemplateWithDefault@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.TemplateWithDefault*, %struct.TemplateWithDefault*)* @"\01??$?_OH@TemplateWithDefault@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CTA2$$T" = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.2 { i32 2, [2 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0$$T@84", %eh.CatchableType* @"_CT??_R0PAX@84"] }, section ".xdata", comdat
|
||||
// CHECK-DAG: @"_CT??_R0P6AXXZ@84" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 1, i8* bitcast (%rtti.TypeDescriptor7* @"\01??_R0P6AXXZ@8" to i8*), i32 0, i32 -1, i32 0, i32 4, i8* null }, section ".xdata", comdat
|
||||
// CHECK-DAG: @_CTA1P6AXXZ = linkonce_odr unnamed_addr constant %eh.CatchableTypeArray.1 { i32 1, [1 x %eh.CatchableType*] [%eh.CatchableType* @"_CT??_R0P6AXXZ@84"] }, section ".xdata", comdat
|
||||
// CHECK-DAG: @_TI1P6AXXZ = linkonce_odr unnamed_addr constant %eh.ThrowInfo { i32 0, i8* null, i8* null, i8* bitcast (%eh.CatchableTypeArray.1* @_CTA1P6AXXZ to i8*) }, section ".xdata", comdat
|
||||
|
||||
|
||||
struct N { ~N(); };
|
||||
|
@ -104,3 +107,9 @@ void *GetExceptionInfo_test0() {
|
|||
// CHECK: ret i8* bitcast (%eh.ThrowInfo* @_TI1H to i8*)
|
||||
return std::__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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue