diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-07-12 16:48:17 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-07-12 16:48:17 +0000 |
commit | 6d2b60a2be21cce7ae856c72ff6a88b8828e1c61 (patch) | |
tree | e872e3dbfd042b25008fdd549366216ac6782abc /clang/lib/AST/ItaniumMangle.cpp | |
parent | 3b0a9934fa0921fd3581ec69824ac1543391b44a (diff) | |
download | bcm5719-llvm-6d2b60a2be21cce7ae856c72ff6a88b8828e1c61.tar.gz bcm5719-llvm-6d2b60a2be21cce7ae856c72ff6a88b8828e1c61.zip |
[ItaniumMangle] Correctly mangle BuiltinTemplateDecls
A BuiltinTemplateDecl has no underlying templated decl and as such they
cannot be relied upon for mangling. The ItaniumMangler had some bugs
here which lead to crashes.
This fixes PR28519.
llvm-svn: 275190
Diffstat (limited to 'clang/lib/AST/ItaniumMangle.cpp')
-rw-r--r-- | clang/lib/AST/ItaniumMangle.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 015e9d7214f..5a7c45594e0 100644 --- a/clang/lib/AST/ItaniumMangle.cpp +++ b/clang/lib/AST/ItaniumMangle.cpp @@ -910,6 +910,8 @@ void CXXNameMangler::mangleUnscopedTemplateName( assert(!AdditionalAbiTags && "template template param cannot have abi tags"); mangleTemplateParameter(TTP->getIndex()); + } else if (isa<BuiltinTemplateDecl>(ND)) { + mangleUnscopedName(ND, AdditionalAbiTags); } else { mangleUnscopedName(ND->getTemplatedDecl(), AdditionalAbiTags); } @@ -1715,7 +1717,10 @@ void CXXNameMangler::mangleTemplatePrefix(const TemplateDecl *ND, mangleTemplateParameter(TTP->getIndex()); } else { manglePrefix(getEffectiveDeclContext(ND), NoFunction); - mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr); + if (isa<BuiltinTemplateDecl>(ND)) + mangleUnqualifiedName(ND, nullptr); + else + mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr); } addSubstitution(ND); |