mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-28 05:36:06 +00:00
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. llvm-svn: 202789
This commit is contained in:
parent
c25fd190ef
commit
8f77453f7c
@ -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<VarTemplateSpecializationDecl>(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<Y>, B::X<Y>),
|
||||
// the X<Y> part is aliased. However, if you need to mangle
|
||||
|
8
clang/test/CodeGenCXX/mangle-ms-cxx14.cpp
Normal file
8
clang/test/CodeGenCXX/mangle-ms-cxx14.cpp
Normal file
@ -0,0 +1,8 @@
|
||||
// RUN: %clang_cc1 -std=c++1y -fms-extensions -emit-llvm %s -o - -triple=i386-pc-win32 | FileCheck %s
|
||||
|
||||
template <typename> int x = 0;
|
||||
|
||||
// CHECK: "\01??$x@X@@3HA"
|
||||
template <> int x<void>;
|
||||
// CHECK: "\01??$x@H@@3HA"
|
||||
template <> int x<int>;
|
Loading…
x
Reference in New Issue
Block a user