forked from OSchip/llvm-project
MS ABI: Allow a nullptr_t exception to be caught by void * catch handler
A nullptr exception object can be caught by any pointer type catch handler. However, it is not possible to express this in the exception info for the MS ABI. As a middle ground, allow such exception objects to be caught with pointer-to-void catch handlers. llvm-svn: 232069
This commit is contained in:
parent
6ef9712296
commit
a1aea9aad4
|
@ -3490,6 +3490,17 @@ llvm::GlobalVariable *MicrosoftCXXABI::getCatchableTypeArray(QualType T) {
|
|||
if (IsPointer)
|
||||
CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
|
||||
|
||||
// C++14 [except.handle]p3:
|
||||
// A handler is a match for an exception object of type E if [...]
|
||||
// - the handler is of type cv T or const T& where T is a pointer or
|
||||
// pointer to member type and E is std::nullptr_t.
|
||||
//
|
||||
// We cannot possibly list all possible pointer types here, making this
|
||||
// implementation incompatible with the standard. However, MSVC includes an
|
||||
// entry for pointer-to-void in this case. Let's do the same.
|
||||
if (T->isNullPtrType())
|
||||
CatchableTypes.insert(getCatchableType(getContext().VoidPtrTy));
|
||||
|
||||
uint32_t NumEntries = CatchableTypes.size();
|
||||
llvm::Type *CTType =
|
||||
getImageRelativeType(getCatchableTypeType()->getPointerTo());
|
||||
|
|
|
@ -15,6 +15,7 @@
|
|||
// CHECK-DAG: @"_CT??_R0?AUDefault@@@8??_ODefault@@QAEXAAU0@@Z1" = linkonce_odr unnamed_addr constant %eh.CatchableType { i32 0, i8* bitcast (%rtti.TypeDescriptor13* @"\01??_R0?AUDefault@@@8" to i8*), i32 0, i32 -1, i32 0, i32 1, i8* bitcast (void (%struct.Default*, %struct.Default*)* @"\01??_ODefault@@QAEXAAU0@@Z" to i8*) }, section ".xdata", comdat
|
||||
// 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
|
||||
|
||||
|
||||
struct N { ~N(); };
|
||||
|
@ -87,3 +88,7 @@ struct TemplateWithDefault {
|
|||
void j(TemplateWithDefault &twd) {
|
||||
throw twd;
|
||||
}
|
||||
|
||||
void h() {
|
||||
throw nullptr;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue