]> granicus.if.org Git - clang/commitdiff
Look for substitutions when mangling TypenameTypes.
authorAnders Carlsson <andersca@mac.com>
Sun, 27 Sep 2009 01:06:07 +0000 (01:06 +0000)
committerAnders Carlsson <andersca@mac.com>
Sun, 27 Sep 2009 01:06:07 +0000 (01:06 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82885 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/Mangle.cpp
test/CodeGenCXX/mangle-subst.cpp

index 447255c668f081ff6dcfee6a5e47f14bf3eb351a..660a36bce0e6d31c3490eae1e108a9a24d730b0b 100644 (file)
@@ -920,10 +920,13 @@ void CXXNameMangler::mangleType(const TypenameType *T) {
   const Type *QTy = T->getQualifier()->getAsType();
   if (const TemplateSpecializationType *TST = 
         dyn_cast<TemplateSpecializationType>(QTy)) {
-    TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
+    if (!mangleSubstitution(QualType(TST, 0))) {
+      TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
 
-    mangleTemplatePrefix(TD);
-    mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());
+      mangleTemplatePrefix(TD);
+      mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());
+      addSubstitution(QualType(TST, 0));
+    }
   } else if (const TemplateTypeParmType *TTPT = 
               dyn_cast<TemplateTypeParmType>(QTy)) {
     // We use the QualType mangle type variant here because it handles
index 2ff375e711c6f510c60b6459a5ff79577ac3bd41..cda6df58ea2dc98fa8b0762e57d7ec467fd32a84 100644 (file)
@@ -31,3 +31,18 @@ struct C {
 
 // CHECK: define void @_Z1fN1C1DERS_PS_S1_(
 void f(C::D, C&, C*, C&) { }
+
+template<typename T>
+struct V {
+  typedef int U;
+};
+
+template <typename T> void f1(typename V<T>::U, V<T>) { }
+
+// CHECK: @_Z2f1IiEvN1VIT_E1UES2_
+template void f1<int>(int, V<int>);
+
+template <typename T> void f2(V<T>, typename V<T>::U) { }
+
+// CHECK: @_Z2f2IiEv1VIT_ENS2_1UE
+template void f2<int>(V<int>, int);