<div dir="ltr">Thanks, fixed in r229822.</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Feb 18, 2015 at 9:34 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">I think this left behind a nullptr argument being passed to mangleUnresolvedPrefix here<div><br></div><div><div>  case TemplateName::DependentTemplate: {</div><div>    const DependentTemplateName *Dependent = TN.getAsDependentTemplateName();</div><div>    assert(Dependent->isIdentifier());</div><div><br></div><div>    // <class-enum-type> ::= <name></div><div>    // <name> ::= <nested-name></div><div>    mangleUnresolvedPrefix(Dependent->getQualifier(), nullptr);</div><div>    mangleSourceName(Dependent->getIdentifier());</div><div>    break;</div><div>  }</div></div></div><div class="gmail_extra"><div><div class="h5"><br><div class="gmail_quote">On Wed, Feb 18, 2015 at 6:16 PM, David Majnemer <span dir="ltr"><<a href="mailto:david.majnemer@gmail.com" target="_blank">david.majnemer@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: majnemer<br>
Date: Wed Feb 18 20:16:16 2015<br>
New Revision: 229809<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=229809&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=229809&view=rev</a><br>
Log:<br>
Itanium ABI: Properly qualify the destructor-name<br>
<br>
We didn't have enough qualificaiton before the scope specifier and we<br>
had too much qualification in the destructor name itself.<br>
<br>
Modified:<br>
    cfe/trunk/lib/AST/ItaniumMangle.cpp<br>
    cfe/trunk/test/CodeGenCXX/mangle.cpp<br>
<br>
Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=229809&r1=229808&r2=229809&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=229809&r1=229808&r2=229809&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/lib/AST/ItaniumMangle.cpp (original)<br>
+++ cfe/trunk/lib/AST/ItaniumMangle.cpp Wed Feb 18 20:16:16 2015<br>
@@ -327,10 +327,8 @@ private:<br>
   void addSubstitution(uintptr_t Ptr);<br>
<br>
   void mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,<br>
-                              NamedDecl *firstQualifierLookup,<br>
                               bool recursive = false);<br>
   void mangleUnresolvedName(NestedNameSpecifier *qualifier,<br>
-                            NamedDecl *firstQualifierLookup,<br>
                             DeclarationName name,<br>
                             unsigned KnownArity = UnknownArity);<br>
<br>
@@ -360,7 +358,8 @@ private:<br>
   void manglePrefix(QualType type);<br>
   void mangleTemplatePrefix(const TemplateDecl *ND, bool NoFunction=false);<br>
   void mangleTemplatePrefix(TemplateName Template);<br>
-  void mangleDestructorName(QualType DestroyedType);<br>
+  bool mangleUnresolvedTypeOrSimpleId(QualType DestroyedType,<br>
+                                      StringRef Prefix = "");<br>
   void mangleOperatorName(DeclarationName Name, unsigned Arity);<br>
   void mangleOperatorName(OverloadedOperatorKind OO, unsigned Arity);<br>
   void mangleQualifiers(Qualifiers Quals);<br>
@@ -799,7 +798,6 @@ void CXXNameMangler::manglePrefix(QualTy<br>
 /// \param recursive - true if this is being called recursively,<br>
 ///   i.e. if there is more prefix "to the right".<br>
 void CXXNameMangler::mangleUnresolvedPrefix(NestedNameSpecifier *qualifier,<br>
-                                            NamedDecl *firstQualifierLookup,<br>
                                             bool recursive) {<br>
<br>
   // x, ::x<br>
@@ -832,7 +830,7 @@ void CXXNameMangler::mangleUnresolvedPre<br>
<br>
   case NestedNameSpecifier::Namespace:<br>
     if (qualifier->getPrefix())<br>
-      mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup,<br>
+      mangleUnresolvedPrefix(qualifier->getPrefix(),<br>
                              /*recursive*/ true);<br>
     else<br>
       Out << "sr";<br>
@@ -840,7 +838,7 @@ void CXXNameMangler::mangleUnresolvedPre<br>
     break;<br>
   case NestedNameSpecifier::NamespaceAlias:<br>
     if (qualifier->getPrefix())<br>
-      mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup,<br>
+      mangleUnresolvedPrefix(qualifier->getPrefix(),<br>
                              /*recursive*/ true);<br>
     else<br>
       Out << "sr";<br>
@@ -857,193 +855,26 @@ void CXXNameMangler::mangleUnresolvedPre<br>
     //   - a template template parameter with arguments<br>
     // In all of these cases, we should have no prefix.<br>
     if (qualifier->getPrefix()) {<br>
-      mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup,<br>
+      mangleUnresolvedPrefix(qualifier->getPrefix(),<br>
                              /*recursive*/ true);<br>
     } else {<br>
       // Otherwise, all the cases want this.<br>
       Out << "sr";<br>
     }<br>
<br>
-    // Only certain other types are valid as prefixes;  enumerate them.<br>
-    switch (type->getTypeClass()) {<br>
-    case Type::Builtin:<br>
-    case Type::Complex:<br>
-    case Type::Adjusted:<br>
-    case Type::Decayed:<br>
-    case Type::Pointer:<br>
-    case Type::BlockPointer:<br>
-    case Type::LValueReference:<br>
-    case Type::RValueReference:<br>
-    case Type::MemberPointer:<br>
-    case Type::ConstantArray:<br>
-    case Type::IncompleteArray:<br>
-    case Type::VariableArray:<br>
-    case Type::DependentSizedArray:<br>
-    case Type::DependentSizedExtVector:<br>
-    case Type::Vector:<br>
-    case Type::ExtVector:<br>
-    case Type::FunctionProto:<br>
-    case Type::FunctionNoProto:<br>
-    case Type::Enum:<br>
-    case Type::Paren:<br>
-    case Type::Elaborated:<br>
-    case Type::Attributed:<br>
-    case Type::Auto:<br>
-    case Type::PackExpansion:<br>
-    case Type::ObjCObject:<br>
-    case Type::ObjCInterface:<br>
-    case Type::ObjCObjectPointer:<br>
-    case Type::Atomic:<br>
-      llvm_unreachable("type is illegal as a nested name specifier");<br>
-<br>
-    case Type::SubstTemplateTypeParmPack:<br>
-      // FIXME: not clear how to mangle this!<br>
-      // template <class T...> class A {<br>
-      //   template <class U...> void foo(decltype(T::foo(U())) x...);<br>
-      // };<br>
-      Out << "_SUBSTPACK_";<br>
-      break;<br>
-<br>
-    // <unresolved-type> ::= <template-param><br>
-    //                   ::= <decltype><br>
-    //                   ::= <template-template-param> <template-args><br>
-    // (this last is not official yet)<br>
-    case Type::TypeOfExpr:<br>
-    case Type::TypeOf:<br>
-    case Type::Decltype:<br>
-    case Type::TemplateTypeParm:<br>
-    case Type::UnaryTransform:<br>
-    case Type::SubstTemplateTypeParm:<br>
-    unresolvedType:<br>
-      assert(!qualifier->getPrefix());<br>
-<br>
-      // We only get here recursively if we're followed by identifiers.<br>
-      if (recursive) Out << 'N';<br>
-<br>
-      // This seems to do everything we want.  It's not really<br>
-      // sanctioned for a substituted template parameter, though.<br>
-      mangleType(QualType(type, 0));<br>
-<br>
-      // We never want to print 'E' directly after an unresolved-type,<br>
-      // so we return directly.<br>
+    if (mangleUnresolvedTypeOrSimpleId(QualType(type, 0), recursive ? "N" : ""))<br>
       return;<br>
<br>
-    case Type::Typedef:<br>
-      mangleSourceName(cast<TypedefType>(type)->getDecl()->getIdentifier());<br>
-      break;<br>
-<br>
-    case Type::UnresolvedUsing:<br>
-      mangleSourceName(cast<UnresolvedUsingType>(type)->getDecl()<br>
-                         ->getIdentifier());<br>
-      break;<br>
-<br>
-    case Type::Record:<br>
-      mangleSourceName(cast<RecordType>(type)->getDecl()->getIdentifier());<br>
-      break;<br>
-<br>
-    case Type::TemplateSpecialization: {<br>
-      const TemplateSpecializationType *tst<br>
-        = cast<TemplateSpecializationType>(type);<br>
-      TemplateName name = tst->getTemplateName();<br>
-      switch (name.getKind()) {<br>
-      case TemplateName::Template:<br>
-      case TemplateName::QualifiedTemplate: {<br>
-        TemplateDecl *temp = name.getAsTemplateDecl();<br>
-<br>
-        // If the base is a template template parameter, this is an<br>
-        // unresolved type.<br>
-        assert(temp && "no template for template specialization type");<br>
-        if (isa<TemplateTemplateParmDecl>(temp)) goto unresolvedType;<br>
-<br>
-        mangleSourceName(temp->getIdentifier());<br>
-        break;<br>
-      }<br>
-<br>
-      case TemplateName::OverloadedTemplate:<br>
-      case TemplateName::DependentTemplate:<br>
-        llvm_unreachable("invalid base for a template specialization type");<br>
-<br>
-      case TemplateName::SubstTemplateTemplateParm: {<br>
-        SubstTemplateTemplateParmStorage *subst<br>
-          = name.getAsSubstTemplateTemplateParm();<br>
-        mangleExistingSubstitution(subst->getReplacement());<br>
-        break;<br>
-      }<br>
-<br>
-      case TemplateName::SubstTemplateTemplateParmPack: {<br>
-        // FIXME: not clear how to mangle this!<br>
-        // template <template <class U> class T...> class A {<br>
-        //   template <class U...> void foo(decltype(T<U>::foo) x...);<br>
-        // };<br>
-        Out << "_SUBSTPACK_";<br>
-        break;<br>
-      }<br>
-      }<br>
-<br>
-      mangleTemplateArgs(tst->getArgs(), tst->getNumArgs());<br>
-      break;<br>
-    }<br>
-<br>
-    case Type::InjectedClassName:<br>
-      mangleSourceName(cast<InjectedClassNameType>(type)->getDecl()<br>
-                         ->getIdentifier());<br>
-      break;<br>
-<br>
-    case Type::DependentName:<br>
-      mangleSourceName(cast<DependentNameType>(type)->getIdentifier());<br>
-      break;<br>
-<br>
-    case Type::DependentTemplateSpecialization: {<br>
-      const DependentTemplateSpecializationType *tst<br>
-        = cast<DependentTemplateSpecializationType>(type);<br>
-      mangleSourceName(tst->getIdentifier());<br>
-      mangleTemplateArgs(tst->getArgs(), tst->getNumArgs());<br>
-      break;<br>
-    }<br>
-    }<br>
     break;<br>
   }<br>
<br>
   case NestedNameSpecifier::Identifier:<br>
     // Member expressions can have these without prefixes.<br>
-    if (qualifier->getPrefix()) {<br>
-      mangleUnresolvedPrefix(qualifier->getPrefix(), firstQualifierLookup,<br>
+    if (qualifier->getPrefix())<br>
+      mangleUnresolvedPrefix(qualifier->getPrefix(),<br>
                              /*recursive*/ true);<br>
-    } else if (firstQualifierLookup) {<br>
-<br>
-      // Try to make a proper qualifier out of the lookup result, and<br>
-      // then just recurse on that.<br>
-      NestedNameSpecifier *newQualifier;<br>
-      if (TypeDecl *typeDecl = dyn_cast<TypeDecl>(firstQualifierLookup)) {<br>
-        QualType type = getASTContext().getTypeDeclType(typeDecl);<br>
-<br>
-        // Pretend we had a different nested name specifier.<br>
-        newQualifier = NestedNameSpecifier::Create(getASTContext(),<br>
-                                                   /*prefix*/ nullptr,<br>
-                                                   /*template*/ false,<br>
-                                                   type.getTypePtr());<br>
-      } else if (NamespaceDecl *nspace =<br>
-                   dyn_cast<NamespaceDecl>(firstQualifierLookup)) {<br>
-        newQualifier = NestedNameSpecifier::Create(getASTContext(),<br>
-                                                   /*prefix*/ nullptr,<br>
-                                                   nspace);<br>
-      } else if (NamespaceAliasDecl *alias =<br>
-                   dyn_cast<NamespaceAliasDecl>(firstQualifierLookup)) {<br>
-        newQualifier = NestedNameSpecifier::Create(getASTContext(),<br>
-                                                   /*prefix*/ nullptr,<br>
-                                                   alias);<br>
-      } else {<br>
-        // No sensible mangling to do here.<br>
-        newQualifier = nullptr;<br>
-      }<br>
-<br>
-      if (newQualifier)<br>
-        return mangleUnresolvedPrefix(newQualifier, /*lookup*/ nullptr,<br>
-                                      recursive);<br>
-<br>
-    } else {<br>
+    else<br>
       Out << "sr";<br>
-    }<br>
<br>
     mangleSourceName(qualifier->getAsIdentifier());<br>
     break;<br>
@@ -1058,10 +889,9 @@ void CXXNameMangler::mangleUnresolvedPre<br>
 /// Mangle an unresolved-name, which is generally used for names which<br>
 /// weren't resolved to specific entities.<br>
 void CXXNameMangler::mangleUnresolvedName(NestedNameSpecifier *qualifier,<br>
-                                          NamedDecl *firstQualifierLookup,<br>
                                           DeclarationName name,<br>
                                           unsigned knownArity) {<br>
-  if (qualifier) mangleUnresolvedPrefix(qualifier, firstQualifierLookup);<br>
+  if (qualifier) mangleUnresolvedPrefix(qualifier);<br>
   switch (name.getNameKind()) {<br>
     // <base-unresolved-name> ::= <simple-id><br>
     case DeclarationName::Identifier:<br>
@@ -1070,7 +900,7 @@ void CXXNameMangler::mangleUnresolvedNam<br>
     // <base-unresolved-name> ::= dn <destructor-name><br>
     case DeclarationName::CXXDestructorName:<br>
       Out << "dn";<br>
-      mangleDestructorName(name.getCXXNameType());<br>
+      mangleUnresolvedTypeOrSimpleId(name.getCXXNameType());<br>
       break;<br>
     // <base-unresolved-name> ::= on <operator-name><br>
     case DeclarationName::CXXConversionFunctionName:<br>
@@ -1648,29 +1478,149 @@ void CXXNameMangler::mangleType(Template<br>
   addSubstitution(TN);<br>
 }<br>
<br>
-void CXXNameMangler::mangleDestructorName(QualType DestroyedType) {<br>
-  // <destructor-name> ::= <unresolved-type><br>
-  //                   ::= <simple-id><br>
-  if (const auto *TST = DestroyedType->getAs<TemplateSpecializationType>()) {<br>
+bool CXXNameMangler::mangleUnresolvedTypeOrSimpleId(QualType Ty,<br>
+                                                    StringRef Prefix) {<br>
+  // Only certain other types are valid as prefixes;  enumerate them.<br>
+  switch (Ty->getTypeClass()) {<br>
+  case Type::Builtin:<br>
+  case Type::Complex:<br>
+  case Type::Adjusted:<br>
+  case Type::Decayed:<br>
+  case Type::Pointer:<br>
+  case Type::BlockPointer:<br>
+  case Type::LValueReference:<br>
+  case Type::RValueReference:<br>
+  case Type::MemberPointer:<br>
+  case Type::ConstantArray:<br>
+  case Type::IncompleteArray:<br>
+  case Type::VariableArray:<br>
+  case Type::DependentSizedArray:<br>
+  case Type::DependentSizedExtVector:<br>
+  case Type::Vector:<br>
+  case Type::ExtVector:<br>
+  case Type::FunctionProto:<br>
+  case Type::FunctionNoProto:<br>
+  case Type::Paren:<br>
+  case Type::Attributed:<br>
+  case Type::Auto:<br>
+  case Type::PackExpansion:<br>
+  case Type::ObjCObject:<br>
+  case Type::ObjCInterface:<br>
+  case Type::ObjCObjectPointer:<br>
+  case Type::Atomic:<br>
+    llvm_unreachable("type is illegal as a nested name specifier");<br>
+<br>
+  case Type::SubstTemplateTypeParmPack:<br>
+    // FIXME: not clear how to mangle this!<br>
+    // template <class T...> class A {<br>
+    //   template <class U...> void foo(decltype(T::foo(U())) x...);<br>
+    // };<br>
+    Out << "_SUBSTPACK_";<br>
+    break;<br>
+<br>
+  // <unresolved-type> ::= <template-param><br>
+  //                   ::= <decltype><br>
+  //                   ::= <template-template-param> <template-args><br>
+  // (this last is not official yet)<br>
+  case Type::TypeOfExpr:<br>
+  case Type::TypeOf:<br>
+  case Type::Decltype:<br>
+  case Type::TemplateTypeParm:<br>
+  case Type::UnaryTransform:<br>
+  case Type::SubstTemplateTypeParm:<br>
+  unresolvedType:<br>
+    // Some callers want a prefix before the mangled type.<br>
+    Out << Prefix;<br>
+<br>
+    // This seems to do everything we want.  It's not really<br>
+    // sanctioned for a substituted template parameter, though.<br>
+    mangleType(Ty);<br>
+<br>
+    // We never want to print 'E' directly after an unresolved-type,<br>
+    // so we return directly.<br>
+    return true;<br>
+<br>
+  case Type::Typedef:<br>
+    mangleSourceName(cast<TypedefType>(Ty)->getDecl()->getIdentifier());<br>
+    break;<br>
+<br>
+  case Type::UnresolvedUsing:<br>
+    mangleSourceName(<br>
+        cast<UnresolvedUsingType>(Ty)->getDecl()->getIdentifier());<br>
+    break;<br>
+<br>
+  case Type::Enum:<br>
+  case Type::Record:<br>
+    mangleSourceName(cast<TagType>(Ty)->getDecl()->getIdentifier());<br>
+    break;<br>
+<br>
+  case Type::TemplateSpecialization: {<br>
+    const TemplateSpecializationType *TST =<br>
+        cast<TemplateSpecializationType>(Ty);<br>
     TemplateName TN = TST->getTemplateName();<br>
-    const auto *TD = TN.getAsTemplateDecl();<br>
-    if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(TD)) {<br>
-      // Proposed to cxx-abi-dev on 2015-02-17.<br>
-      mangleTemplateParameter(TTP->getIndex());<br>
-    } else {<br>
-      mangleUnscopedName(TD->getTemplatedDecl());<br>
+    switch (TN.getKind()) {<br>
+    case TemplateName::Template:<br>
+    case TemplateName::QualifiedTemplate: {<br>
+      TemplateDecl *TD = TN.getAsTemplateDecl();<br>
+<br>
+      // If the base is a template template parameter, this is an<br>
+      // unresolved type.<br>
+      assert(TD && "no template for template specialization type");<br>
+      if (isa<TemplateTemplateParmDecl>(TD))<br>
+        goto unresolvedType;<br>
+<br>
+      mangleSourceName(TD->getIdentifier());<br>
+      break;<br>
+    }<br>
+<br>
+    case TemplateName::OverloadedTemplate:<br>
+    case TemplateName::DependentTemplate:<br>
+      llvm_unreachable("invalid base for a template specialization type");<br>
+<br>
+    case TemplateName::SubstTemplateTemplateParm: {<br>
+      SubstTemplateTemplateParmStorage *subst =<br>
+          TN.getAsSubstTemplateTemplateParm();<br>
+      mangleExistingSubstitution(subst->getReplacement());<br>
+      break;<br>
     }<br>
+<br>
+    case TemplateName::SubstTemplateTemplateParmPack: {<br>
+      // FIXME: not clear how to mangle this!<br>
+      // template <template <class U> class T...> class A {<br>
+      //   template <class U...> void foo(decltype(T<U>::foo) x...);<br>
+      // };<br>
+      Out << "_SUBSTPACK_";<br>
+      break;<br>
+    }<br>
+    }<br>
+<br>
     mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());<br>
-  } else if (const auto *DTST =<br>
-                 DestroyedType->getAs<DependentTemplateSpecializationType>()) {<br>
-    const IdentifierInfo *II = DTST->getIdentifier();<br>
-    mangleSourceName(II);<br>
+    break;<br>
+  }<br>
+<br>
+  case Type::InjectedClassName:<br>
+    mangleSourceName(<br>
+        cast<InjectedClassNameType>(Ty)->getDecl()->getIdentifier());<br>
+    break;<br>
+<br>
+  case Type::DependentName:<br>
+    mangleSourceName(cast<DependentNameType>(Ty)->getIdentifier());<br>
+    break;<br>
+<br>
+  case Type::DependentTemplateSpecialization: {<br>
+    const DependentTemplateSpecializationType *DTST =<br>
+        cast<DependentTemplateSpecializationType>(Ty);<br>
+    mangleSourceName(DTST->getIdentifier());<br>
     mangleTemplateArgs(DTST->getArgs(), DTST->getNumArgs());<br>
-  } else {<br>
-    // We use the QualType mangle type variant here because it handles<br>
-    // substitutions.<br>
-    mangleType(DestroyedType);<br>
+    break;<br>
   }<br>
+<br>
+  case Type::Elaborated:<br>
+    return mangleUnresolvedTypeOrSimpleId(<br>
+        cast<ElaboratedType>(Ty)->getNamedType(), Prefix);<br>
+  }<br>
+<br>
+  return false;<br>
 }<br>
<br>
 void CXXNameMangler::mangleOperatorName(DeclarationName Name, unsigned Arity) {<br>
@@ -2636,7 +2586,7 @@ void CXXNameMangler::mangleMemberExpr(co<br>
   //              ::= pt <expression> <unresolved-name><br>
   if (base)<br>
     mangleMemberExprBase(base, isArrow);<br>
-  mangleUnresolvedName(qualifier, firstQualifierLookup, member, arity);<br>
+  mangleUnresolvedName(qualifier, member, arity);<br>
 }<br>
<br>
 /// Look at the callee of the given call expression and determine if<br>
@@ -2894,12 +2844,26 @@ recurse:<br>
     const auto *PDE = cast<CXXPseudoDestructorExpr>(E);<br>
     if (const Expr *Base = PDE->getBase())<br>
       mangleMemberExprBase(Base, PDE->isArrow());<br>
-    if (NestedNameSpecifier *Qualifier = PDE->getQualifier())<br>
-      mangleUnresolvedPrefix(Qualifier, /*FirstQualifierLookup=*/nullptr);<br>
+    NestedNameSpecifier *Qualifier = PDE->getQualifier();<br>
+    QualType ScopeType;<br>
+    if (TypeSourceInfo *ScopeInfo = PDE->getScopeTypeInfo()) {<br>
+      if (Qualifier) {<br>
+        mangleUnresolvedPrefix(Qualifier,<br>
+                               /*Recursive=*/true);<br>
+        mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType());<br>
+        Out << 'E';<br>
+      } else {<br>
+        Out << "sr";<br>
+        if (!mangleUnresolvedTypeOrSimpleId(ScopeInfo->getType()))<br>
+          Out << 'E';<br>
+      }<br>
+    } else if (Qualifier) {<br>
+      mangleUnresolvedPrefix(Qualifier);<br>
+    }<br>
     // <base-unresolved-name> ::= dn <destructor-name><br>
     Out << "dn";<br>
     QualType DestroyedType = PDE->getDestroyedType();<br>
-    mangleDestructorName(DestroyedType);<br>
+    mangleUnresolvedTypeOrSimpleId(DestroyedType);<br>
     break;<br>
   }<br>
<br>
@@ -2934,7 +2898,7 @@ recurse:<br>
<br>
   case Expr::UnresolvedLookupExprClass: {<br>
     const UnresolvedLookupExpr *ULE = cast<UnresolvedLookupExpr>(E);<br>
-    mangleUnresolvedName(ULE->getQualifier(), nullptr, ULE->getName(), Arity);<br>
+    mangleUnresolvedName(ULE->getQualifier(), ULE->getName(), Arity);<br>
<br>
     // All the <unresolved-name> productions end in a<br>
     // base-unresolved-name, where <template-args> are just tacked<br>
@@ -3248,8 +3212,7 @@ recurse:<br>
<br>
   case Expr::DependentScopeDeclRefExprClass: {<br>
     const DependentScopeDeclRefExpr *DRE = cast<DependentScopeDeclRefExpr>(E);<br>
-    mangleUnresolvedName(DRE->getQualifier(), nullptr, DRE->getDeclName(),<br>
-                         Arity);<br>
+    mangleUnresolvedName(DRE->getQualifier(), DRE->getDeclName(), Arity);<br>
<br>
     // All the <unresolved-name> productions end in a<br>
     // base-unresolved-name, where <template-args> are just tacked<br>
<br>
Modified: cfe/trunk/test/CodeGenCXX/mangle.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle.cpp?rev=229809&r1=229808&r2=229809&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle.cpp?rev=229809&r1=229808&r2=229809&view=diff</a><br>
==============================================================================<br>
--- cfe/trunk/test/CodeGenCXX/mangle.cpp (original)<br>
+++ cfe/trunk/test/CodeGenCXX/mangle.cpp Wed Feb 18 20:16:16 2015<br>
@@ -1024,6 +1024,12 @@ namespace test51 {<br>
   template void fun<S1<int> >();<br>
   // CHECK-LABEL: @_ZN6test513funI2S1IiEEEDTcldtcvT__EdnS3_EEv<br>
<br>
+  enum E {};<br>
+  template <typename T><br>
+  struct X {<br>
+    struct Y {};<br>
+  };<br>
+<br>
   template <typename T><br>
   decltype(S1<T>().~S1<T>()) fun1() {};<br>
   template <typename U, typename T><br>
@@ -1036,6 +1042,10 @@ namespace test51 {<br>
   decltype(S1<int>().~S1<T>()) fun5(){};<br>
   template <template <typename T> class U><br>
   decltype(S1<int>().~U<int>()) fun6(){};<br>
+  template <typename T><br>
+  decltype(E().E::~T()) fun7() {}<br>
+  template <template <typename> class U><br>
+  decltype(X<int>::Y().U<int>::Y::~Y()) fun8() {}<br>
   template void fun1<int>();<br>
   // CHECK-LABEL: @_ZN6test514fun1IiEEDTcldtcv2S1IT_E_Edn2S1IS2_EEEv<br>
   template void fun2<S1<int>, int>();<br>
@@ -1045,6 +1055,10 @@ namespace test51 {<br>
   template void fun4<int>();<br>
   // CHECK-LABEL: @_ZN6test514fun4IiEEDTcmcldtcv2S1IT_E_Edn2S1IS2_EEcldtcvS3__Edn2S1IS2_EEEv<br>
   template void fun5<int>();<br>
-  // CHECK-LABEL: @_ZN6test514fun6I2S1EEDTcldtcvS1_IiE_EdnT_IiEEEv<br>
+  // CHECK-LABEL: @_ZN6test514fun5IiEEDTcldtcv2S1IiE_Edn2S1IT_EEEv<br>
   template void fun6<S1>();<br>
+  // CHECK-LABEL: @_ZN6test514fun6I2S1EEDTcldtcvS1_IiE_EdnT_IiEEEv<br>
+  template void fun7<E>();<br>
+  // CHECK-LABEL: @_ZN6test514fun7INS_1EEEEDTcldtcvS1__Esr1EEdnT_EEv<br>
+  template void fun8<X>();<br>
 }<br>
<br>
<br>
_______________________________________________<br>
cfe-commits mailing list<br>
<a href="mailto:cfe-commits@cs.uiuc.edu" target="_blank">cfe-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div></div></div><span class="HOEnZb"><font color="#888888">-- <br><div>~Craig</div>
</font></span></div>
</blockquote></div><br></div>