diff options
author | Anders Carlsson <andersca@mac.com> | 2009-09-26 23:10:05 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-09-26 23:10:05 +0000 |
commit | 8c0315563f05a9face7209221325019e272075fb (patch) | |
tree | 076a68c5929a0b56e0d1653d5465e26955bcf04c | |
parent | aeb85374e92619b8e4ce92ac6e30756b5053a137 (diff) |
Mangle ::std::allocator as Sa.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@82880 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/CodeGen/Mangle.cpp | 30 | ||||
-rw-r--r-- | test/CodeGenCXX/mangle-subst-std.cpp | 9 |
2 files changed, 28 insertions, 11 deletions
diff --git a/lib/CodeGen/Mangle.cpp b/lib/CodeGen/Mangle.cpp index 3db736b7b4..639d719b79 100644 --- a/lib/CodeGen/Mangle.cpp +++ b/lib/CodeGen/Mangle.cpp @@ -1132,18 +1132,26 @@ bool CXXNameMangler::mangleSubstitution(uintptr_t Ptr) { bool CXXNameMangler::mangleStandardSubstitution(const NamedDecl *ND) { // <substitution> ::= St # ::std:: + if (const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND)) { + if (NS->getParent()->isTranslationUnit() && + NS->getOriginalNamespace()->getIdentifier()->isStr("std")) { + Out << "St"; + return true; + } + } + + if (const ClassTemplateDecl *TD = dyn_cast<ClassTemplateDecl>(ND)) { + if (!isStdNamespace(TD->getDeclContext())) + return false; + + // <substitution> ::= Sa # ::std::allocator + if (TD->getIdentifier()->isStr("allocator")) { + Out << "Sa"; + return true; + } + } - const NamespaceDecl *NS = dyn_cast<NamespaceDecl>(ND); - if (!NS) - return false; - if (!NS->getParent()->isTranslationUnit()) - return false; - - if (!NS->getOriginalNamespace()->getIdentifier()->isStr("std")) - return false; - - Out << "St"; - return true; + return false; } void CXXNameMangler::addSubstitution(QualType T) { diff --git a/test/CodeGenCXX/mangle-subst-std.cpp b/test/CodeGenCXX/mangle-subst-std.cpp index a5ba3ab7d0..0fd5eb1c9b 100644 --- a/test/CodeGenCXX/mangle-subst-std.cpp +++ b/test/CodeGenCXX/mangle-subst-std.cpp @@ -7,3 +7,12 @@ namespace std { // CHECK: define void @_ZNSt1AC2Ev A::A() { } }; + +namespace std { + template<typename T> struct allocator { allocator(); }; +} + +// FIXME: typename is really not allowed here, but it's kept +// as a workaround for PR5061. +// CHECK: define void @_Z1fSaIcESaIiE +void f(typename std::allocator<char>, typename std::allocator<int>) { } |