From 7802fc9e6cb488fc1321ce3f7431b7aeeefdd18f Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Mon, 5 Aug 2013 21:33:59 +0000 Subject: [PATCH] [ms-cxxabi] Mangle nullptr template arguments MSVC mangles nullptr template arguments identically to zero literals. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@187741 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/AST/MicrosoftMangle.cpp | 6 ++++-- test/CodeGenCXX/mangle-ms-templates.cpp | 9 +++++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/lib/AST/MicrosoftMangle.cpp b/lib/AST/MicrosoftMangle.cpp index 64e27f1f4b..68f57a9212 100644 --- a/lib/AST/MicrosoftMangle.cpp +++ b/lib/AST/MicrosoftMangle.cpp @@ -889,6 +889,9 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, mangleIntegerLiteral(TA.getAsIntegral(), TA.getIntegralType()->isBooleanType()); break; + case TemplateArgument::NullPtr: + Out << "$0A@"; + break; case TemplateArgument::Expression: mangleExpression(TA.getAsExpr()); break; @@ -901,8 +904,7 @@ void MicrosoftCXXNameMangler::mangleTemplateArg(const TemplateDecl *TD, mangleTemplateArg(TD, *I, ArgIndex); break; case TemplateArgument::Template: - case TemplateArgument::TemplateExpansion: - case TemplateArgument::NullPtr: { + case TemplateArgument::TemplateExpansion: { // Issue a diagnostic. DiagnosticsEngine &Diags = Context.getDiags(); unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error, diff --git a/test/CodeGenCXX/mangle-ms-templates.cpp b/test/CodeGenCXX/mangle-ms-templates.cpp index 363583a65f..6e5be65824 100644 --- a/test/CodeGenCXX/mangle-ms-templates.cpp +++ b/test/CodeGenCXX/mangle-ms-templates.cpp @@ -1,5 +1,5 @@ -// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s -// RUN: %clang_cc1 -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s +// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -cxx-abi microsoft -triple=i386-pc-win32 | FileCheck %s +// RUN: %clang_cc1 -std=c++11 -emit-llvm %s -o - -cxx-abi microsoft -triple=x86_64-pc-win32 | FileCheck -check-prefix X64 %s template class Class { @@ -156,3 +156,8 @@ void variadic_class_instantiate() { } // CHECK: call {{.*}} @"\01??0?$VariadicClass@HD_N@@QAE@XZ" // CHECK: call {{.*}} @"\01??0?$VariadicClass@_NDH@@QAE@XZ" + +// PR16788 +template struct S1 {}; +void f(S1) {} +// CHECK: "\01?f@@YAXU?$S1@$0A@@@@Z" -- 2.40.0