From 18c20f5f85989cfc004566f00feff6561cc192fe Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Tue, 4 Mar 2014 05:38:05 +0000 Subject: [PATCH] MS ABI: Mangle variable templates properly We wouldn't recognize variable templates as being templates leading us to leave the template arguments off of the mangled name. This would allow two unrelated templates to map to the same mangled name. N.B. While MSVC doesn't support variable templates as of this date, this mangling is the most likely thing they will choose to use. Their demangler can successfully demangle our manglings with the template arguments shown. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@202789 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/MicrosoftMangle.cpp | 8 +++++++- test/CodeGenCXX/mangle-ms-cxx14.cpp | 8 ++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 test/CodeGenCXX/mangle-ms-cxx14.cpp diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 72ab3732e2..a610e157d9 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -562,6 +562,13 @@ isTemplate(const NamedDecl *ND, const TemplateArgumentList *&TemplateArgs) { return Spec->getSpecializedTemplate(); } + // Check if we have a variable template. + if (const VarTemplateSpecializationDecl *Spec = + dyn_cast(ND)) { + TemplateArgs = &Spec->getTemplateArgs(); + return Spec->getSpecializedTemplate(); + } + return 0; } @@ -585,7 +592,6 @@ MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, return; } - // We have a class template. // Here comes the tricky thing: if we need to mangle something like // void foo(A::X, B::X), // the X part is aliased. However, if you need to mangle diff --git a/test/CodeGenCXX/mangle-ms-cxx14.cpp b/test/CodeGenCXX/mangle-ms-cxx14.cpp new file mode 100644 index 0000000000..5bf0e967a7 --- /dev/null +++ b/test/CodeGenCXX/mangle-ms-cxx14.cpp @@ -0,0 +1,8 @@ +// RUN: %clang_cc1 -std=c++1y -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s + +template int x = 0; + +// CHECK: "\01??$x@X@@3HA" +template <> int x; +// CHECK: "\01??$x@H@@3HA" +template <> int x; -- 2.40.0