Commit 7f357c61 by Nathan Sidwell Committed by Nathan Sidwell

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
parent 8eedca0d
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> 2017-01-30 Alexandre Oliva <aoliva@redhat.com>
Introduce C++ support in libcc1. Introduce C++ support in libcc1.
......
...@@ -849,14 +849,22 @@ maybe_generic_this_capture (tree object, tree fns) ...@@ -849,14 +849,22 @@ maybe_generic_this_capture (tree object, tree fns)
interest. */ interest. */
if (BASELINK_P (fns)) if (BASELINK_P (fns))
fns = BASELINK_FUNCTIONS (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)) for (; fns; fns = OVL_NEXT (fns))
if (DECL_NONSTATIC_MEMBER_FUNCTION_P (OVL_CURRENT (fns))) {
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. */ /* Found a non-static member. Capture this. */
lambda_expr_this_capture (lam, true); lambda_expr_this_capture (lam, true);
break; break;
} }
} }
}
} }
/* Returns the innermost non-lambda function. */ /* Returns the innermost non-lambda function. */
......
...@@ -2962,6 +2962,12 @@ finish_member_declaration (tree decl) ...@@ -2962,6 +2962,12 @@ finish_member_declaration (tree decl)
/* We should see only one DECL at a time. */ /* We should see only one DECL at a time. */
gcc_assert (DECL_CHAIN (decl) == NULL_TREE); 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. */ /* Set up access control for DECL. */
TREE_PRIVATE (decl) TREE_PRIVATE (decl)
= (current_access_specifier == access_private_node); = (current_access_specifier == access_private_node);
......
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> 2017-01-31 Christophe Lyon <christophe.lyon@linaro.org>
* gcc.dg/memcmp-1.c (static void test_driver_memcmp): Call * gcc.dg/memcmp-1.c (static void test_driver_memcmp): Call
......
// PR c++/61636 // PR c++/61636
// PR c++/79264
// { dg-do compile { target c++14 } } // { dg-do compile { target c++14 } }
// ICE because we figure this capture too late. // ICE because we figure this capture too late.
...@@ -28,4 +29,8 @@ void A::b() { ...@@ -28,4 +29,8 @@ void A::b() {
auto lam2 = [&](auto asdf) { Baz (asdf); }; auto lam2 = [&](auto asdf) { Baz (asdf); };
lam2 (0); lam2 (0);
auto lam3 = [&](auto asdf) { Baz<int> (asdf); };
lam3 (0);
} }
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