diff options
author | David Majnemer <david.majnemer@gmail.com> | 2014-07-30 08:20:03 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2014-07-30 08:20:03 +0000 |
commit | 8d5f9ab2cc2a76d490ffc6317d9552b05901ff63 (patch) | |
tree | be791e083c00be93430821e3122644b58db3a29e /clang/lib/AST/MicrosoftMangle.cpp | |
parent | 5c72938c39f97672f0557069cfcce9dd95446477 (diff) | |
download | bcm5719-llvm-8d5f9ab2cc2a76d490ffc6317d9552b05901ff63.tar.gz bcm5719-llvm-8d5f9ab2cc2a76d490ffc6317d9552b05901ff63.zip |
MS ABI: Mangle alias templates used as template-template arguments
A templated using declaration may be used as a template-template
argument.
Unfortunately, the VS "14" chooses '?' as the sole marker for the
argument. This is problematic because it presupposes the possibility of
using more than one template-aliases as arguments to the same template.
This fixes PR20047.
llvm-svn: 214290
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index e6a6d09b484..0c80ff814c7 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1179,11 +1179,21 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, } break; } - case TemplateArgument::Template: - mangleType(cast<TagDecl>( - TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl())); + case TemplateArgument::Template: { + const NamedDecl *ND = + TA.getAsTemplate().getAsTemplateDecl()->getTemplatedDecl(); + if (const auto *TD = dyn_cast<TagDecl>(ND)) { + mangleType(TD); + } else if (isa<TypeAliasDecl>(ND)) { + // FIXME: The mangling, while compatible with VS "14", is horribly + // broken. Update this when they release their next compiler. + Out << '?'; + } else { + llvm_unreachable("unexpected template template NamedDecl!"); + } break; } + } } void MicrosoftCXXNameMangler::mangleQualifiers(Qualifiers Quals, |