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
+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
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 ())
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. */
--- /dev/null
+// 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]; });
+}