diff options
author | Nico Weber <nicolasweber@gmx.de> | 2018-09-08 20:58:39 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2018-09-08 20:58:39 +0000 |
commit | e2dd15785b281d842c35a4854c1bee28ebf70594 (patch) | |
tree | 6c1d5546bbc25e18828f4a8193f763a05eeda0bd /clang/lib/AST/MicrosoftMangle.cpp | |
parent | 2e00b98027b51ee5bfb88a4daea8b78bf9a01e62 (diff) | |
download | bcm5719-llvm-e2dd15785b281d842c35a4854c1bee28ebf70594.tar.gz bcm5719-llvm-e2dd15785b281d842c35a4854c1bee28ebf70594.zip |
ms: Insert $$Z in mangling between directly consecutive parameter packs.
Fixes PR38783.
Differential Revision: https://reviews.llvm.org/D51784
llvm-svn: 341755
Diffstat (limited to 'clang/lib/AST/MicrosoftMangle.cpp')
-rw-r--r-- | clang/lib/AST/MicrosoftMangle.cpp | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 348f05d3682..6f1a1f4fed6 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -1384,9 +1384,16 @@ void MicrosoftCXXNameMangler::mangleTemplateArgs( assert(TPL->size() == TemplateArgs.size() && "size mismatch between args and parms!"); - unsigned Idx = 0; - for (const TemplateArgument &TA : TemplateArgs.asArray()) - mangleTemplateArg(TD, TA, TPL->getParam(Idx++)); + for (size_t i = 0; i < TemplateArgs.size(); ++i) { + const TemplateArgument &TA = TemplateArgs[i]; + + // Separate consecutive packs by $$Z. + if (i > 0 && TA.getKind() == TemplateArgument::Pack && + TemplateArgs[i - 1].getKind() == TemplateArgument::Pack) + Out << "$$Z"; + + mangleTemplateArg(TD, TA, TPL->getParam(i)); + } } void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, |