Itanium ABI: Pack expansions change the arity of expressions to unknown
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 19 Feb 2015 21:41:48 +0000 (21:41 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 19 Feb 2015 21:41:48 +0000 (21:41 +0000)
llvm-svn: 229918

clang/lib/AST/ItaniumMangle.cpp
clang/test/CodeGenCXX/mangle.cpp

index f4fee77..95fca00 100644 (file)
@@ -2796,9 +2796,14 @@ recurse:
       Out << "cl";
     }
 
-    mangleExpression(CE->getCallee(), CE->getNumArgs());
-    for (unsigned I = 0, N = CE->getNumArgs(); I != N; ++I)
-      mangleExpression(CE->getArg(I));
+    unsigned CallArity = CE->getNumArgs();
+    for (const Expr *Arg : CE->arguments())
+      if (isa<PackExpansionExpr>(Arg))
+        CallArity = UnknownArity;
+
+    mangleExpression(CE->getCallee(), CallArity);
+    for (const Expr *Arg : CE->arguments())
+      mangleExpression(Arg);
     Out << 'E';
     break;
   }
index 2cdfd19..630a251 100644 (file)
@@ -1062,3 +1062,12 @@ namespace test51 {
   // CHECK-LABEL: @_ZN6test514fun7INS_1EEEEDTcldtcvS1__Esr1EEdnT_EEv
   template void fun8<X>();
 }
+
+namespace test52 {
+struct X {};
+void operator+(X);
+template <typename... T>
+auto f4(T... x) -> decltype(operator+(x...));
+// CHECK-LABEL: @_ZN6test522f4IJNS_1XEEEEDTclonplspfp_EEDpT_
+void use() { f4(X{}); }
+}