Commit de164412 by Marek Polacek Committed by Marek Polacek

PR c++/90548 - ICE with generic lambda and empty pack.

	* pt.c (tsubst_copy_and_build): Handle pack expansion properly.

	* g++.dg/cpp1y/lambda-generic-90548.C: New test.

From-SVN: r271705
parent 99763671
2019-05-28 Marek Polacek <polacek@redhat.com>
PR c++/90548 - ICE with generic lambda and empty pack.
* pt.c (tsubst_copy_and_build): Handle pack expansion properly.
2019-05-28 Nathan Sidwell <nathan@acm.org> 2019-05-28 Nathan Sidwell <nathan@acm.org>
* cp-tree.h (make_anon_name): Drop declaration. * cp-tree.h (make_anon_name): Drop declaration.
......
...@@ -18861,6 +18861,9 @@ tsubst_copy_and_build (tree t, ...@@ -18861,6 +18861,9 @@ tsubst_copy_and_build (tree t,
the thunk template for a generic lambda. */ the thunk template for a generic lambda. */
if (CALL_FROM_THUNK_P (t)) if (CALL_FROM_THUNK_P (t))
{ {
/* Now that we've expanded any packs, the number of call args
might be different. */
unsigned int cargs = call_args->length ();
tree thisarg = NULL_TREE; tree thisarg = NULL_TREE;
if (TREE_CODE (function) == COMPONENT_REF) if (TREE_CODE (function) == COMPONENT_REF)
{ {
...@@ -18874,7 +18877,7 @@ tsubst_copy_and_build (tree t, ...@@ -18874,7 +18877,7 @@ tsubst_copy_and_build (tree t,
/* We aren't going to do normal overload resolution, so force the /* We aren't going to do normal overload resolution, so force the
template-id to resolve. */ template-id to resolve. */
function = resolve_nondeduced_context (function, complain); function = resolve_nondeduced_context (function, complain);
for (unsigned i = 0; i < nargs; ++i) for (unsigned i = 0; i < cargs; ++i)
{ {
/* In a thunk, pass through args directly, without any /* In a thunk, pass through args directly, without any
conversions. */ conversions. */
...@@ -18885,12 +18888,18 @@ tsubst_copy_and_build (tree t, ...@@ -18885,12 +18888,18 @@ tsubst_copy_and_build (tree t,
} }
if (thisarg) if (thisarg)
{ {
/* Shift the other args over to make room. */ /* If there are no other args, just push 'this'. */
tree last = (*call_args)[nargs - 1]; if (cargs == 0)
vec_safe_push (call_args, last); vec_safe_push (call_args, thisarg);
for (int i = nargs-1; i > 0; --i) else
(*call_args)[i] = (*call_args)[i-1]; {
(*call_args)[0] = thisarg; /* Otherwise, shift the other args over to make room. */
tree last = (*call_args)[cargs - 1];
vec_safe_push (call_args, last);
for (int i = cargs - 1; i > 0; --i)
(*call_args)[i] = (*call_args)[i - 1];
(*call_args)[0] = thisarg;
}
} }
ret = build_call_a (function, call_args->length (), ret = build_call_a (function, call_args->length (),
call_args->address ()); call_args->address ());
......
2019-05-28 Marek Polacek <polacek@redhat.com>
PR c++/90548 - ICE with generic lambda and empty pack.
* g++.dg/cpp1y/lambda-generic-90548.C: New test.
2019-05-28 Alejandro Martinez <alejandro.martinezvicente@arm.com> 2019-05-28 Alejandro Martinez <alejandro.martinezvicente@arm.com>
* gcc.target/aarch64/sve/mask_load_slp_1.c: New test for SLP * gcc.target/aarch64/sve/mask_load_slp_1.c: New test for SLP
......
// PR c++/90548
// { dg-do compile { target c++14 } }
struct S { S (void ()); };
S foo([] (auto...) { });
S foo2{[] (auto...) {}};
S foo3 = {[] (auto...) {}};
struct W { W(void (int)); };
W bar([](auto...) { });
W bar2{[](auto...) { }};
W bar3 = {[](auto...) { }};
struct T { T(void (int, int)); };
T qux([](auto...) { });
T qux2{[](auto...) { }};
T qux3 = {[](auto...) { }};
struct R { R(void (int, int, int, int, int, int, int, int, int, int)); };
R baz([](auto...) { });
R baz2{[](auto...) { }};
R baz3 = {[](auto...) { }};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment