diff options
author | Douglas Gregor <dgregor@apple.com> | 2010-02-05 20:45:00 +0000 |
---|---|---|
committer | Douglas Gregor <dgregor@apple.com> | 2010-02-05 20:45:00 +0000 |
commit | a16b0cae9a23c1710916b3f47c5c5fe6bfb5ec0a (patch) | |
tree | 25a3ea0c5606204388ef31bbce9a59157d27b550 | |
parent | 6a93195783df1a708d3f76b0a5c2edf129ba1bd3 (diff) | |
download | bcm5719-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.cpp | 17 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle.cpp | 7 |
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>); +} |