]> granicus.if.org Git - clang/commitdiff
Improve mangling of typename types.
authorAnders Carlsson <andersca@mac.com>
Sat, 26 Sep 2009 02:26:02 +0000 (02:26 +0000)
committerAnders Carlsson <andersca@mac.com>
Sat, 26 Sep 2009 02:26:02 +0000 (02:26 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82833 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 83dc0e64dcf35cb6a74d196d5ecf756be4b7540d..9766e585ff1e946c587c48bbd920fb94d98af689 100644 (file)
@@ -911,7 +911,22 @@ void CXXNameMangler::mangleType(const TemplateSpecializationType *T) {
 }
 
 void CXXNameMangler::mangleType(const TypenameType *T) {
-  assert(false && "can't mangle dependent typenames yet");
+  // Typename types are always nested
+  Out << 'N';
+
+  const Type *QTy = T->getQualifier()->getAsType();
+  if (const TemplateSpecializationType *TST = 
+        dyn_cast<TemplateSpecializationType>(QTy)) {
+    TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl();
+
+    mangleTemplatePrefix(TD);
+    mangleTemplateArgs(TST->getArgs(), TST->getNumArgs());
+  } else
+    assert(false && "Unhandled type!");
+
+  mangleSourceName(T->getIdentifier());
+  
+  Out << 'E';
 }
 
 void CXXNameMangler::mangleExpression(const Expr *E) {
index 306188c8de2f0841ec6dde7906bb837793263a1a..b61f1d00df8034ce4662e17fa1172c560fa63eab 100644 (file)
@@ -147,3 +147,11 @@ Debug dbg;
 // CHECK: @_ZNK5DebuglsEj
 int main(void) {  dbg << 32 ;}
 }
+
+template<typename T> struct S6 {
+  typedef int B;
+};
+
+template<typename T> void ft5(typename S6<T>::B) { }
+// CHECK: @_Z3ft5IiEvN2S6IT_E1BE
+template void ft5<int>(int);