From: Nathan Sidwell Date: Tue, 31 Jan 2017 15:10:41 +0000 (+0000) Subject: re PR c++/79264 (ICE verify_type failed) X-Git-Tag: upstream/12.2.0~41438 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7f357c61640fc1558985eeca7a66cbe2c0f1ba0f;p=platform%2Fupstream%2Fgcc.git 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 --- diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 18732c9..ea1435d 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2017-01-31 Nathan Sidwell + + 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 Introduce C++ support in libcc1. diff --git a/gcc/cp/lambda.c b/gcc/cp/lambda.c index 538c806..46ab30f 100644 --- a/gcc/cp/lambda.c +++ b/gcc/cp/lambda.c @@ -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; + } + } } } diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index bd91e18..e4f2a6a 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76835d4..675c190 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-01-31 Nathan Sidwell + + PR c++/79264 + * g++.dg/cpp1y/pr61636-1.C: Augment. + 2017-01-31 Christophe Lyon * gcc.dg/memcmp-1.c (static void test_driver_memcmp): Call diff --git a/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C b/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C index 9426d5f..5cc8ca1 100644 --- a/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C +++ b/gcc/testsuite/g++.dg/cpp1y/pr61636-1.C @@ -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 (asdf); }; + + lam3 (0); }