]> granicus.if.org Git - clang/commitdiff
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)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@229918 91177308-0d34-0410-b5e6-96231b3b80d8

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

index f4fee77925b69904812c8745561b3f9f0b4628c5..95fca001250b1aa37b43db14e16fb8473f69e36e 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 2cdfd1929ac275051ed5005d9719bc6fc04a61c9..630a251c201742db63b1189165d5adbd512e4331 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{}); }
+}