From b95713784a3c4105ade2ded5309b30f51497e810 Mon Sep 17 00:00:00 2001 From: Nico Weber Date: Fri, 11 Oct 2019 12:27:51 +0000 Subject: [PATCH] [MS ABI]: Fix mangling function arguments for template types to be compatible with MSVC MS name mangling supports cache for first 10 distinct function arguments. The error was when non cached template type occurred twice (e.g. 11th and 12th). For such case in code there is another cache table TemplateArgStrings (for performance reasons). Then one '@' character at the end of the mangled name taken from this table was missing. For other cases the missing '@' character was added in the call to mangleSourceName(TemplateMangling) in the cache miss code, but the cache hit code didn't add it. This fixes a regression from r362560. Patch by Adam Folwarczny ! Differential Revision: https://reviews.llvm.org/D68099 llvm-svn: 374543 --- clang/lib/AST/MicrosoftMangle.cpp | 2 +- clang/test/CodeGenCXX/mangle-ms-back-references.cpp | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 382f318..f871a1b 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -846,7 +846,7 @@ void MicrosoftCXXNameMangler::mangleUnqualifiedName(const NamedDecl *ND, TemplateArgStringStorage.save(TemplateMangling.str()); } } else { - Out << Found->second; // Outputs a StringRef. + Out << Found->second << '@'; // Outputs a StringRef. } } else { Out << Found->second; // Outputs a back reference (an int). diff --git a/clang/test/CodeGenCXX/mangle-ms-back-references.cpp b/clang/test/CodeGenCXX/mangle-ms-back-references.cpp index cd4d1e2..cb95c10 100644 --- a/clang/test/CodeGenCXX/mangle-ms-back-references.cpp +++ b/clang/test/CodeGenCXX/mangle-ms-back-references.cpp @@ -66,3 +66,20 @@ namespace foo { void foo() { } // CHECK: "?foo@0@YAXXZ" } + +class T01; +class T02; +class T03; +class T04; +class T05; +class T06; +class T07; +class T08; +class T09; +class T10; +class T11; +template +class H; + +void ManyParams(T01 &, T02 &, T03 &, T04 &, T05 &, T06 &, T07 &, T08 &, T09 &, T10 &, H &, H &) {} +// CHECK: "?ManyParams@@YAXAAVT01@@AAVT02@@AAVT03@@AAVT04@@AAVT05@@AAVT06@@AAVT07@@AAVT08@@AAVT09@@AAVT10@@AAV?$H@VT11@@@@AAV?$H@VT11@@@@@Z" -- 2.7.4