]> granicus.if.org Git - clang/commitdiff
MicrosoftMangle: Fix mangling of integral constant non-type template arguments in...
authorCharles Davis <cdavis@mines.edu>
Sat, 23 Jun 2012 00:27:49 +0000 (00:27 +0000)
committerCharles Davis <cdavis@mines.edu>
Sat, 23 Jun 2012 00:27:49 +0000 (00:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159056 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 29319ff417ffd92c0e32032716e8e475ee119d20..d2be5e53939c54755908e24e6a9bcdcd0ba9213f 100644 (file)
@@ -744,7 +744,16 @@ MicrosoftCXXNameMangler::mangleTemplateArgs(
     case TemplateArgument::Integral:
       mangleIntegerLiteral(TA.getIntegralType(), TA.getAsIntegral());
       break;
-    default: {
+    case TemplateArgument::Expression: {
+      // See if this is a constant expression.
+      Expr *TAE = TA.getAsExpr();
+      llvm::APSInt Value;
+      if (TAE->isIntegerConstantExpr(Value, Context.getASTContext())) {
+        mangleIntegerLiteral(TAE->getType(), Value);
+        break;
+      }
+      /* fallthrough */
+    } default: {
       // Issue a diagnostic.
       DiagnosticsEngine &Diags = Context.getDiags();
       unsigned DiagID = Diags.getCustomDiagID(DiagnosticsEngine::Error,
index 0a011b327e0ee6a95a5c04b79eb48eaf10f7c744..977ef353dabc652aae7862c9d46d6104ca996e01 100644 (file)
@@ -23,6 +23,13 @@ class IntTemplate {
   IntTemplate() {}
 };
 
+template<>
+class BoolTemplate<true> {
+ public:
+  BoolTemplate() {}
+  template<class T> void Foo(T arg) {}
+};
+
 void template_mangling() {
   Class<Typename> c1;
   c1.method();
@@ -36,7 +43,10 @@ void template_mangling() {
 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$0A@@@QAE@XZ"
 
   BoolTemplate<true> _true;
+  // PR13158
+  _true.Foo(1);
 // CHECK: call {{.*}} @"\01??0?$BoolTemplate@$00@@QAE@XZ"
+// CHECK: call {{.*}} @"\01??$Foo@H@?$BoolTemplate@$00@@QAEXH@Z"
 
   IntTemplate<5> five;
 // CHECK: call {{.*}} @"\01??0?$IntTemplate@$04@@QAE@XZ"