Hi rnk, timurrrr,

MSVC mangles nullptr template arguments identically to zero literals.

http://llvm-reviews.chandlerc.com/D1284

Files:
  lib/AST/MicrosoftMangle.cpp
  test/CodeGenCXX/mangle-ms-templates.cpp

Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -886,9 +886,14 @@
     mangle(cast<NamedDecl>(TA.getAsDecl()), "$1?");
     break;
   case TemplateArgument::Integral:
-    mangleIntegerLiteral(TA.getAsIntegral(),
-                         TA.getIntegralType()->isBooleanType());
+    mangleIntegerLiteral(TA.getAsIntegral(), /*IsBoolean=*/false);
     break;
+  // NullPtr is just a special case of an Integral argument with value 0 as of
+  // MSVC 2013
+  case TemplateArgument::NullPtr: {
+    mangleIntegerLiteral(llvm::APSInt(/*BitWidth=*/64), /*IsBoolean=*/false);
+    break;
+  }
   case TemplateArgument::Expression:
     mangleExpression(TA.getAsExpr());
     break;
@@ -901,8 +906,7 @@
       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,
Index: test/CodeGenCXX/mangle-ms-templates.cpp
===================================================================
--- test/CodeGenCXX/mangle-ms-templates.cpp
+++ test/CodeGenCXX/mangle-ms-templates.cpp
@@ -156,3 +156,8 @@
 }
 // CHECK: call {{.*}} @"\01??0?$VariadicClass@HD_N@@QAE@XZ"
 // CHECK: call {{.*}} @"\01??0?$VariadicClass@_NDH@@QAE@XZ"
+
+// PR16788
+template <decltype(__nullptr)> struct S1 {};
+void f(S1<__nullptr>) {}
+// CHECK: "\01f@@YAXU?$S1@$0A@@@@Z"
Index: lib/AST/MicrosoftMangle.cpp
===================================================================
--- lib/AST/MicrosoftMangle.cpp
+++ lib/AST/MicrosoftMangle.cpp
@@ -886,9 +886,14 @@
     mangle(cast<NamedDecl>(TA.getAsDecl()), "$1?");
     break;
   case TemplateArgument::Integral:
-    mangleIntegerLiteral(TA.getAsIntegral(),
-                         TA.getIntegralType()->isBooleanType());
+    mangleIntegerLiteral(TA.getAsIntegral(), /*IsBoolean=*/false);
     break;
+  // NullPtr is just a special case of an Integral argument with value 0 as of
+  // MSVC 2013
+  case TemplateArgument::NullPtr: {
+    mangleIntegerLiteral(llvm::APSInt(/*BitWidth=*/64), /*IsBoolean=*/false);
+    break;
+  }
   case TemplateArgument::Expression:
     mangleExpression(TA.getAsExpr());
     break;
@@ -901,8 +906,7 @@
       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,
Index: test/CodeGenCXX/mangle-ms-templates.cpp
===================================================================
--- test/CodeGenCXX/mangle-ms-templates.cpp
+++ test/CodeGenCXX/mangle-ms-templates.cpp
@@ -156,3 +156,8 @@
 }
 // CHECK: call {{.*}} @"\01??0?$VariadicClass@HD_N@@QAE@XZ"
 // CHECK: call {{.*}} @"\01??0?$VariadicClass@_NDH@@QAE@XZ"
+
+// PR16788
+template <decltype(__nullptr)> struct S1 {};
+void f(S1<__nullptr>) {}
+// CHECK: "\01f@@YAXU?$S1@$0A@@@@Z"
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits

Reply via email to