diff options
| author | Anders Carlsson <andersca@mac.com> | 2009-11-24 05:36:32 +0000 |
|---|---|---|
| committer | Anders Carlsson <andersca@mac.com> | 2009-11-24 05:36:32 +0000 |
| commit | bd97548f35be77b8104a2a05ec321183ba554126 (patch) | |
| tree | fa3e6b259bac0c10416c1562760cec5743225f08 /clang/lib | |
| parent | 65e6d131f00c6789126e9ee5bdb5c1433358f9db (diff) | |
| download | bcm5719-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.cpp | 19 |
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; } |

