Author: majnemer Date: Fri Oct 24 15:22:57 2014 New Revision: 220588 URL: http://llvm.org/viewvc/llvm-project?rev=220588&view=rev Log: Itanium ABI: Template template parameters are usable as substitutions
Template template parameters weren't added to the list of substitutions. This would make the substitution map contain inaccurate mappings, leading to Clang violating the Itanium ABI and breaking compatibility with GCC. This fixes PR21351. Differential Revision: http://reviews.llvm.org/D5959 Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp cfe/trunk/test/CodeGenCXX/mangle.cpp Modified: cfe/trunk/lib/AST/ItaniumMangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/AST/ItaniumMangle.cpp?rev=220588&r1=220587&r2=220588&view=diff ============================================================================== --- cfe/trunk/lib/AST/ItaniumMangle.cpp (original) +++ cfe/trunk/lib/AST/ItaniumMangle.cpp Fri Oct 24 15:22:57 2014 @@ -637,13 +637,11 @@ void CXXNameMangler::mangleUnscopedTempl return; // <template-template-param> ::= <template-param> - if (const TemplateTemplateParmDecl *TTP - = dyn_cast<TemplateTemplateParmDecl>(ND)) { + if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) mangleTemplateParameter(TTP->getIndex()); - return; - } + else + mangleUnscopedName(ND->getTemplatedDecl()); - mangleUnscopedName(ND->getTemplatedDecl()); addSubstitution(ND); } @@ -1563,14 +1561,13 @@ void CXXNameMangler::mangleTemplatePrefi return; // <template-template-param> ::= <template-param> - if (const TemplateTemplateParmDecl *TTP - = dyn_cast<TemplateTemplateParmDecl>(ND)) { + if (const auto *TTP = dyn_cast<TemplateTemplateParmDecl>(ND)) { mangleTemplateParameter(TTP->getIndex()); - return; + } else { + manglePrefix(getEffectiveDeclContext(ND), NoFunction); + mangleUnqualifiedName(ND->getTemplatedDecl()); } - manglePrefix(getEffectiveDeclContext(ND), NoFunction); - mangleUnqualifiedName(ND->getTemplatedDecl()); addSubstitution(ND); } Modified: cfe/trunk/test/CodeGenCXX/mangle.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/mangle.cpp?rev=220588&r1=220587&r2=220588&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/mangle.cpp (original) +++ cfe/trunk/test/CodeGenCXX/mangle.cpp Fri Oct 24 15:22:57 2014 @@ -991,3 +991,25 @@ namespace test48 { template void f<S>(S::u *); // CHECK-LABEL: define weak_odr void @_ZN6test481fINS_1SEEEvPTuNT_1uE(%"union.test48::S::u"*) } + +namespace test49 { + template <int> + struct S {}; + + template <template <int> class T> + T<3> fin(T<3>); + + auto v = fin<S>; + // CHECK-LABEL: declare void @_ZN6test493finINS_1SEEET_ILi3EES3_() +} + +namespace test50 { + template <int> + struct S {}; + + template <template <int> class T> + T<3> fin(T<4>); + + auto v = fin<S>; + // CHECK-LABEL: declare void @_ZN6test503finINS_1SEEET_ILi3EES2_ILi4EE() +} _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
