summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDouglas Gregor <dgregor@apple.com>2010-02-05 20:45:00 +0000
committerDouglas Gregor <dgregor@apple.com>2010-02-05 20:45:00 +0000
commita16b0cae9a23c1710916b3f47c5c5fe6bfb5ec0a (patch)
tree25a3ea0c5606204388ef31bbce9a59157d27b550
parent6a93195783df1a708d3f76b0a5c2edf129ba1bd3 (diff)
downloadbcm5719-llvm-a16b0cae9a23c1710916b3f47c5c5fe6bfb5ec0a.tar.gz
bcm5719-llvm-a16b0cae9a23c1710916b3f47c5c5fe6bfb5ec0a.zip
Implement name mangling for template template parameters
llvm-svn: 95427
-rw-r--r--clang/lib/CodeGen/Mangle.cpp17
-rw-r--r--clang/test/CodeGenCXX/mangle.cpp7
2 files changed, 22 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp
index cb304960ce7..3f541ae87ae 100644
--- a/clang/lib/CodeGen/Mangle.cpp
+++ b/clang/lib/CodeGen/Mangle.cpp
@@ -400,6 +400,13 @@ void CXXNameMangler::mangleUnscopedTemplateName(const TemplateDecl *ND) {
if (mangleSubstitution(ND))
return;
+ // <template-template-param> ::= <template-param>
+ if (const TemplateTemplateParmDecl *TTP
+ = dyn_cast<TemplateTemplateParmDecl>(ND)) {
+ mangleTemplateParameter(TTP->getIndex());
+ return;
+ }
+
mangleUnscopedName(ND->getTemplatedDecl());
addSubstitution(ND);
}
@@ -674,15 +681,21 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND) {
// <template-prefix> ::= <prefix> <template unqualified-name>
// ::= <template-param>
// ::= <substitution>
+ // <template-template-param> ::= <template-param>
+ // <substitution>
if (mangleSubstitution(ND))
return;
- // FIXME: <template-param>
+ // <template-template-param> ::= <template-param>
+ if (const TemplateTemplateParmDecl *TTP
+ = dyn_cast<TemplateTemplateParmDecl>(ND)) {
+ mangleTemplateParameter(TTP->getIndex());
+ return;
+ }
manglePrefix(ND->getDeclContext());
mangleUnqualifiedName(ND->getTemplatedDecl());
-
addSubstitution(ND);
}
diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp
index a1dc67bee43..8f45175ae89 100644
--- a/clang/test/CodeGenCXX/mangle.cpp
+++ b/clang/test/CodeGenCXX/mangle.cpp
@@ -365,3 +365,10 @@ namespace test0 {
}
// CHECK: define linkonce_odr void @_ZN5test01jINS_1AEEEvRAszmecvT__E6buffer_c(
}
+
+namespace test1 {
+ template<typename T> struct X { };
+ template<template<class> class Y, typename T> void f(Y<T>) { }
+ // CHECK: define void @_ZN5test11fINS_1XEiEEvT_IT0_E
+ template void f(X<int>);
+}
OpenPOWER on IntegriCloud