re PR c++/79264 (ICE verify_type failed)

PR c++/79264
	* lambda.c (maybe_generic_this_capture): Deal with
	template-id-exprs.
	* semantics.c (finish_member_declaration): Assert class is being
	defined.

	PR c++/79264
	* g++.dg/cpp1y/pr61636-1.C: Augment.

From-SVN: r245065
This commit is contained in:
Nathan Sidwell 2017-01-31 15:10:41 +00:00 committed by Nathan Sidwell
parent 8eedca0df1
commit 7f357c6164
5 changed files with 37 additions and 6 deletions

View File

@ -1,3 +1,10 @@
2017-01-31 Nathan Sidwell <nathan@acm.org>
PR c++/79264
* lambda.c (maybe_generic_this_capture): Deal with template-id-exprs.
* semantics.c (finish_member_declaration): Assert class is being
defined.
2017-01-30 Alexandre Oliva <aoliva@redhat.com>
Introduce C++ support in libcc1.

View File

@ -849,13 +849,21 @@ maybe_generic_this_capture (tree object, tree fns)
interest. */
if (BASELINK_P (fns))
fns = BASELINK_FUNCTIONS (fns);
bool id_expr = TREE_CODE (fns) == TEMPLATE_ID_EXPR;
if (id_expr)
fns = TREE_OPERAND (fns, 0);
for (; fns; fns = OVL_NEXT (fns))
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (OVL_CURRENT (fns)))
{
/* Found a non-static member. Capture this. */
lambda_expr_this_capture (lam, true);
break;
}
{
tree fn = OVL_CURRENT (fns);
if ((!id_expr || TREE_CODE (fn) == TEMPLATE_DECL)
&& DECL_NONSTATIC_MEMBER_FUNCTION_P (fn))
{
/* Found a non-static member. Capture this. */
lambda_expr_this_capture (lam, true);
break;
}
}
}
}

View File

@ -2962,6 +2962,12 @@ finish_member_declaration (tree decl)
/* We should see only one DECL at a time. */
gcc_assert (DECL_CHAIN (decl) == NULL_TREE);
/* Don't add decls after definition. */
gcc_assert (TYPE_BEING_DEFINED (current_class_type)
/* We can add lambda types when late parsing default
arguments. */
|| LAMBDA_TYPE_P (TREE_TYPE (decl)));
/* Set up access control for DECL. */
TREE_PRIVATE (decl)
= (current_access_specifier == access_private_node);

View File

@ -1,3 +1,8 @@
2017-01-31 Nathan Sidwell <nathan@acm.org>
PR c++/79264
* g++.dg/cpp1y/pr61636-1.C: Augment.
2017-01-31 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.dg/memcmp-1.c (static void test_driver_memcmp): Call

View File

@ -1,4 +1,5 @@
// PR c++/61636
// PR c++/79264
// { dg-do compile { target c++14 } }
// ICE because we figure this capture too late.
@ -28,4 +29,8 @@ void A::b() {
auto lam2 = [&](auto asdf) { Baz (asdf); };
lam2 (0);
auto lam3 = [&](auto asdf) { Baz<int> (asdf); };
lam3 (0);
}