re PR c++/66387 (ICE in make_decl_rtl with lambda)
authorJason Merrill <jason@redhat.com>
Tue, 9 Jun 2015 15:27:01 +0000 (11:27 -0400)
committerJason Merrill <jason@gcc.gnu.org>
Tue, 9 Jun 2015 15:27:01 +0000 (11:27 -0400)
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
gcc/cp/semantics.c
gcc/cp/typeck.c
gcc/testsuite/g++.dg/cpp0x/lambda/lambda-const5.C [new file with mode: 0644]

index bf48e969712b26d4bb285c16c17931b8ffe7bfb1..089f693af80fa2e72e0c6022ca6b2d39b3b73f52 100644 (file)
@@ -1,3 +1,11 @@
+2015-06-09  Jason Merrill  <jason@redhat.com>
+
+       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  <paolo.carlini@oracle.com>
 
        PR c++/65815
index 650ef4c0583374f0ada390cb917ffebc915d22f9..59ec9047c26cc9a141306a823dc5fba5f2dd2c84 100644 (file)
@@ -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 ())
index 6c4b038047817ba6f63e41c97ccd1aa9e0539bb9..5b09b73bafa29120ce697cd22b64159f91005457 100644 (file)
@@ -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 (file)
index 0000000..cba0370
--- /dev/null
@@ -0,0 +1,16 @@
+// PR c++/66387
+// { dg-do compile { target c++11 } }
+
+template <typename T>
+void
+bar (T x)
+{
+  x ();
+}
+
+void
+foo ()
+{
+  constexpr int a[1] = { 1 };
+  bar ([&]{ return a[0]; });
+}