summaryrefslogtreecommitdiffstats
path: root/clang/lib
diff options
context:
space:
mode:
authorAnders Carlsson <andersca@mac.com>2009-11-24 05:36:32 +0000
committerAnders Carlsson <andersca@mac.com>2009-11-24 05:36:32 +0000
commitbd97548f35be77b8104a2a05ec321183ba554126 (patch)
treefa3e6b259bac0c10416c1562760cec5743225f08 /clang/lib
parent65e6d131f00c6789126e9ee5bdb5c1433358f9db (diff)
downloadbcm5719-llvm-bd97548f35be77b8104a2a05ec321183ba554126.tar.gz
bcm5719-llvm-bd97548f35be77b8104a2a05ec321183ba554126.zip
When mangling a ctor/dtor we need to take into consideration whether it's a member template.
llvm-svn: 89741
Diffstat (limited to 'clang/lib')
-rw-r--r--clang/lib/CodeGen/Mangle.cpp19
1 files changed, 17 insertions, 2 deletions
diff --git a/clang/lib/CodeGen/Mangle.cpp b/clang/lib/CodeGen/Mangle.cpp
index 6dacd35d2b5..b09b27f489a 100644
--- a/clang/lib/CodeGen/Mangle.cpp
+++ b/clang/lib/CodeGen/Mangle.cpp
@@ -29,6 +29,21 @@
using namespace clang;
namespace {
+
+static const CXXMethodDecl *getStructor(const CXXMethodDecl *MD) {
+ assert((isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) &&
+ "Passed in decl is not a ctor or dtor!");
+
+ if (const TemplateDecl *TD = MD->getPrimaryTemplate()) {
+ MD = cast<CXXMethodDecl>(TD->getTemplatedDecl());
+
+ assert((isa<CXXConstructorDecl>(MD) || isa<CXXDestructorDecl>(MD)) &&
+ "Templated decl is not a ctor or dtor!");
+ }
+
+ return MD;
+}
+
/// CXXNameMangler - Manage the mangling of a single name.
class CXXNameMangler {
MangleContext &Context;
@@ -44,10 +59,10 @@ public:
: Context(C), Out(Res), Structor(0), StructorType(0) { }
CXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res,
const CXXConstructorDecl *D, CXXCtorType Type)
- : Context(C), Out(Res), Structor(D), StructorType(Type) { }
+ : Context(C), Out(Res), Structor(getStructor(D)), StructorType(Type) { }
CXXNameMangler(MangleContext &C, llvm::SmallVectorImpl<char> &Res,
const CXXDestructorDecl *D, CXXDtorType Type)
- : Context(C), Out(Res), Structor(D), StructorType(Type) { }
+ : Context(C), Out(Res), Structor(getStructor(D)), StructorType(Type) { }
llvm::raw_svector_ostream &getStream() { return Out; }
OpenPOWER on IntegriCloud