From 5af874fb6518ed3e21c1e0f750fac86788fdafa3 Mon Sep 17 00:00:00 2001 From: Jason Merrill Date: Tue, 9 Jun 2015 11:27:01 -0400 Subject: [PATCH] re PR c++/66387 (ICE in make_decl_rtl with lambda) PR c++/66387 * semantics.c (process_outer_var_ref): Make sure the value is actually constant before returning it. * typeck.c (cp_build_array_ref): Allow subscripting non-lvalue array. From-SVN: r224287 --- gcc/cp/ChangeLog | 8 ++++++++ gcc/cp/semantics.c | 6 +++++- gcc/cp/typeck.c | 9 --------- .../g++.dg/cpp0x/lambda/lambda-const5.C | 16 ++++++++++++++++ 4 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index bf48e969712..089f693af80 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,11 @@ +2015-06-09 Jason Merrill + + PR c++/66387 + * semantics.c (process_outer_var_ref): Make sure the value is + actually constant before returning it. + * typeck.c (cp_build_array_ref): Allow subscripting non-lvalue + array. + 2015-06-09 Paolo Carlini PR c++/65815 diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index 650ef4c0583..59ec9047c26 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -3128,7 +3128,11 @@ process_outer_var_ref (tree decl, tsubst_flags_t complain) form, so wait until instantiation time. */ return decl; else if (decl_constant_var_p (decl)) - return scalar_constant_value (decl); + { + tree t = maybe_constant_value (convert_from_reference (decl)); + if (TREE_CONSTANT (t)) + return t; + } } if (parsing_nsdmi ()) diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c index 6c4b0380478..5b09b73bafa 100644 --- a/gcc/cp/typeck.c +++ b/gcc/cp/typeck.c @@ -3141,15 +3141,6 @@ cp_build_array_ref (location_t loc, tree array, tree idx, return error_mark_node; } - if (!lvalue_p (array)) - { - if (complain & tf_error) - pedwarn (loc, OPT_Wpedantic, - "ISO C++ forbids subscripting non-lvalue array"); - else - return error_mark_node; - } - /* Note in C++ it is valid to subscript a `register' array, since it is valid to take the address of something with that storage specification. */ diff --git a/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C new file mode 100644 index 00000000000..cba0370f129 --- /dev/null +++ b/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C @@ -0,0 +1,16 @@ +// PR c++/66387 +// { dg-do compile { target c++11 } } + +template +void +bar (T x) +{ + x (); +} + +void +foo () +{ + constexpr int a[1] = { 1 }; + bar ([&]{ return a[0]; }); +} -- 2.30.2