summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2015-02-19 21:41:48 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2015-02-19 21:41:48 +0000
commit67a8ec6258c68a0584ded451329740350b544f84 (patch)
treea7028b08826cd2d35b4090d3977eceb43e916b91
parentcbdbf3988129b892d63c619fef576a5d7ccb5180 (diff)
downloadbcm5719-llvm-67a8ec6258c68a0584ded451329740350b544f84.tar.gz
bcm5719-llvm-67a8ec6258c68a0584ded451329740350b544f84.zip
Itanium ABI: Pack expansions change the arity of expressions to unknown
llvm-svn: 229918
-rw-r--r--clang/lib/AST/ItaniumMangle.cpp11
-rw-r--r--clang/test/CodeGenCXX/mangle.cpp9
2 files changed, 17 insertions, 3 deletions
diff --git a/clang/lib/AST/ItaniumMangle.cpp b/clang/lib/AST/ItaniumMangle.cpp
index f4fee77925b..95fca001250 100644
--- a/clang/lib/AST/ItaniumMangle.cpp
+++ b/clang/lib/AST/ItaniumMangle.cpp
@@ -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;
}
diff --git a/clang/test/CodeGenCXX/mangle.cpp b/clang/test/CodeGenCXX/mangle.cpp
index 2cdfd1929ac..630a251c201 100644
--- a/clang/test/CodeGenCXX/mangle.cpp
+++ b/clang/test/CodeGenCXX/mangle.cpp
@@ -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{}); }
+}
OpenPOWER on IntegriCloud