forked from OSchip/llvm-project
[MS] Fix function type mangling of default ctor closures
Use the canonical decl in pointer comparisons with the default constructor closure decl. Otherwise we don't produce the correct "@@QAEXXZ" mangling, which essentially means "void(void) thiscall public instance method". llvm-svn: 291448
This commit is contained in:
parent
940c06188e
commit
290feb9c19
|
@ -109,13 +109,13 @@ static const DeclContext *getEffectiveParentContext(const DeclContext *DC) {
|
|||
|
||||
static const FunctionDecl *getStructor(const NamedDecl *ND) {
|
||||
if (const auto *FTD = dyn_cast<FunctionTemplateDecl>(ND))
|
||||
return FTD->getTemplatedDecl();
|
||||
return FTD->getTemplatedDecl()->getCanonicalDecl();
|
||||
|
||||
const auto *FD = cast<FunctionDecl>(ND);
|
||||
if (const auto *FTD = FD->getPrimaryTemplate())
|
||||
return FTD->getTemplatedDecl();
|
||||
return FTD->getTemplatedDecl()->getCanonicalDecl();
|
||||
|
||||
return FD;
|
||||
return FD->getCanonicalDecl();
|
||||
}
|
||||
|
||||
/// MicrosoftMangleContextImpl - Overrides the default MangleContext for the
|
||||
|
@ -312,6 +312,10 @@ public:
|
|||
void mangleNestedName(const NamedDecl *ND);
|
||||
|
||||
private:
|
||||
bool isStructorDecl(const NamedDecl *ND) const {
|
||||
return ND == Structor || getStructor(ND) == Structor;
|
||||
}
|
||||
|
||||
void mangleUnqualifiedName(const NamedDecl *ND) {
|
||||
mangleUnqualifiedName(ND, ND->getDeclName());
|
||||
}
|
||||
|
@ -912,7 +916,7 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,
|
|||
return;
|
||||
|
||||
case DeclarationName::CXXDestructorName:
|
||||
if (ND == Structor)
|
||||
if (isStructorDecl(ND))
|
||||
// If the named decl is the C++ destructor we're mangling,
|
||||
// use the type we were given.
|
||||
mangleCXXDtorType(static_cast<CXXDtorType>(StructorType));
|
||||
|
@ -1862,7 +1866,7 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
|
|||
IsStructor = true;
|
||||
IsCtorClosure = (StructorType == Ctor_CopyingClosure ||
|
||||
StructorType == Ctor_DefaultClosure) &&
|
||||
getStructor(MD) == Structor;
|
||||
isStructorDecl(MD);
|
||||
if (IsCtorClosure)
|
||||
CC = getASTContext().getDefaultCallingConvention(
|
||||
/*IsVariadic=*/false, /*IsCXXMethod=*/true);
|
||||
|
@ -1883,7 +1887,7 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
|
|||
// <return-type> ::= <type>
|
||||
// ::= @ # structors (they have no declared return type)
|
||||
if (IsStructor) {
|
||||
if (isa<CXXDestructorDecl>(D) && D == Structor &&
|
||||
if (isa<CXXDestructorDecl>(D) && isStructorDecl(D) &&
|
||||
StructorType == Dtor_Deleting) {
|
||||
// The scalar deleting destructor takes an extra int argument.
|
||||
// However, the FunctionType generated has 0 arguments.
|
||||
|
|
|
@ -498,6 +498,12 @@ struct CtorWithClosure {
|
|||
// M32-DAG: ret void
|
||||
};
|
||||
|
||||
struct CtorWithClosureOutOfLine {
|
||||
__declspec(dllexport) CtorWithClosureOutOfLine(...);
|
||||
};
|
||||
CtorWithClosureOutOfLine::CtorWithClosureOutOfLine(...) {}
|
||||
// M32-DAG: define weak_odr dllexport x86_thiscallcc void @"\01??_FCtorWithClosureOutOfLine@@QAEXXZ"({{.*}}) {{#[0-9]+}} comdat
|
||||
|
||||
#define DELETE_IMPLICIT_MEMBERS(ClassName) \
|
||||
ClassName(ClassName &&) = delete; \
|
||||
ClassName(ClassName &) = delete; \
|
||||
|
|
Loading…
Reference in New Issue