From 6d2b60a2be21cce7ae856c72ff6a88b8828e1c61 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 12 Jul 2016 16:48:17 +0000 Subject: [PATCH] [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 --- clang/lib/AST/ItaniumMangle.cpp | 7 ++++++- clang/test/CodeGenCXX/mangle-template.cpp | 11 +++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp index 015e9d7214f4..5a7c45594e08 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(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(ND)) + mangleUnqualifiedName(ND, nullptr); + else + mangleUnqualifiedName(ND->getTemplatedDecl(), nullptr); } addSubstitution(ND); diff --git a/clang/test/CodeGenCXX/mangle-template.cpp b/clang/test/CodeGenCXX/mangle-template.cpp index 7fa300ae237b..60481b3328f6 100644 --- a/clang/test/CodeGenCXX/mangle-template.cpp +++ b/clang/test/CodeGenCXX/mangle-template.cpp @@ -201,3 +201,14 @@ namespace test14 { int call(bool b) { return inl(b); } } + +namespace std { +template struct integer_sequence {}; +} + +namespace test15 { +template +__make_integer_seq make() {} +template __make_integer_seq make<5>(); +// CHECK: define weak_odr void @_ZN6test154makeILi5EEE18__make_integer_seqISt16integer_sequenceiXT_EEv( +}