diff options
author | David Majnemer <david.majnemer@gmail.com> | 2015-02-19 21:41:48 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2015-02-19 21:41:48 +0000 |
commit | 67a8ec6258c68a0584ded451329740350b544f84 (patch) | |
tree | a7028b08826cd2d35b4090d3977eceb43e916b91 | |
parent | cbdbf3988129b892d63c619fef576a5d7ccb5180 (diff) | |
download | bcm5719-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.cpp | 11 | ||||
-rw-r--r-- | clang/test/CodeGenCXX/mangle.cpp | 9 |
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{}); } +} |