diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp')
| -rw-r--r-- | contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp | 18 | 
1 files changed, 11 insertions, 7 deletions
| diff --git a/contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp b/contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp index 911b8b471a05..76c368d7f04c 100644 --- a/contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp +++ b/contrib/llvm/tools/clang/lib/AST/MicrosoftMangle.cpp @@ -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());    } @@ -898,7 +902,7 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND,        llvm_unreachable("Can't mangle Objective-C selector names here!");      case DeclarationName::CXXConstructorName: -      if (Structor == getStructor(ND)) { +      if (isStructorDecl(ND)) {          if (StructorType == Ctor_CopyingClosure) {            Out << "?_O";            return; @@ -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. | 
