Index: cfe/trunk/lib/AST/ItaniumMangle.cpp =================================================================== --- cfe/trunk/lib/AST/ItaniumMangle.cpp +++ cfe/trunk/lib/AST/ItaniumMangle.cpp @@ -637,13 +637,11 @@ return; // ::= - if (const TemplateTemplateParmDecl *TTP - = dyn_cast(ND)) { + if (const auto *TTP = dyn_cast(ND)) mangleTemplateParameter(TTP->getIndex()); - return; - } + else + mangleUnscopedName(ND->getTemplatedDecl()); - mangleUnscopedName(ND->getTemplatedDecl()); addSubstitution(ND); } @@ -1563,14 +1561,13 @@ return; // ::= - if (const TemplateTemplateParmDecl *TTP - = dyn_cast(ND)) { + if (const auto *TTP = dyn_cast(ND)) { mangleTemplateParameter(TTP->getIndex()); - return; + } else { + manglePrefix(getEffectiveDeclContext(ND), NoFunction); + mangleUnqualifiedName(ND->getTemplatedDecl()); } - manglePrefix(getEffectiveDeclContext(ND), NoFunction); - mangleUnqualifiedName(ND->getTemplatedDecl()); addSubstitution(ND); } Index: cfe/trunk/test/CodeGenCXX/mangle.cpp =================================================================== --- cfe/trunk/test/CodeGenCXX/mangle.cpp +++ cfe/trunk/test/CodeGenCXX/mangle.cpp @@ -991,3 +991,25 @@ template void f(S::u *); // CHECK-LABEL: define weak_odr void @_ZN6test481fINS_1SEEEvPTuNT_1uE(%"union.test48::S::u"*) } + +namespace test49 { + template + struct S {}; + + template