aboutsummaryrefslogtreecommitdiff
path: root/gcc/cp
diff options
context:
space:
mode:
authorJason Merrill <jason@redhat.com>2011-05-06 17:57:41 -0400
committerJason Merrill <jason@gcc.gnu.org>2011-05-06 17:57:41 -0400
commitc80e3e0267b3b415090d49a73747486f3313138b (patch)
tree523ded34c464561c71a40891051869504f7dc0f8 /gcc/cp
parentd8f426ecc93d65cb9c8c7698116b6bad194fbdb9 (diff)
downloadgcc-c80e3e0267b3b415090d49a73747486f3313138b.zip
gcc-c80e3e0267b3b415090d49a73747486f3313138b.tar.gz
gcc-c80e3e0267b3b415090d49a73747486f3313138b.tar.bz2
re PR c++/48911 ([C++0x] Error for valid array subscript)
PR c++/48911 * semantics.c (cxx_eval_array_reference): Handle implicit initializers. From-SVN: r173510
Diffstat (limited to 'gcc/cp')
-rw-r--r--gcc/cp/ChangeLog6
-rw-r--r--gcc/cp/semantics.c14
2 files changed, 19 insertions, 1 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index f19c0c1..3bc6a14 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -1,3 +1,9 @@
+2011-05-06 Jason Merrill <jason@redhat.com>
+
+ PR c++/48911
+ * semantics.c (cxx_eval_array_reference): Handle implicit
+ initializers.
+
2011-05-06 Nathan Froyd <froydnj@codesourcery.com>
* cp-tree.h (type_of_this_parm, class_of_this_parm): New functions.
diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c
index a2b24d3..ca069f5 100644
--- a/gcc/cp/semantics.c
+++ b/gcc/cp/semantics.c
@@ -6323,6 +6323,7 @@ cxx_eval_array_reference (const constexpr_call *call, tree t,
non_constant_p);
tree index, oldidx;
HOST_WIDE_INT i;
+ tree elem_type;
unsigned len, elem_nchars = 1;
if (*non_constant_p)
return t;
@@ -6335,16 +6336,27 @@ cxx_eval_array_reference (const constexpr_call *call, tree t,
return t;
else if (addr)
return build4 (ARRAY_REF, TREE_TYPE (t), ary, index, NULL, NULL);
+ elem_type = TREE_TYPE (TREE_TYPE (ary));
if (TREE_CODE (ary) == CONSTRUCTOR)
len = CONSTRUCTOR_NELTS (ary);
else
{
- elem_nchars = (TYPE_PRECISION (TREE_TYPE (TREE_TYPE (ary)))
+ elem_nchars = (TYPE_PRECISION (elem_type)
/ TYPE_PRECISION (char_type_node));
len = (unsigned) TREE_STRING_LENGTH (ary) / elem_nchars;
}
if (compare_tree_int (index, len) >= 0)
{
+ if (tree_int_cst_lt (index, array_type_nelts_top (TREE_TYPE (ary))))
+ {
+ /* If it's within the array bounds but doesn't have an explicit
+ initializer, it's value-initialized. */
+ tree val = build_value_init (elem_type, tf_warning_or_error);
+ return cxx_eval_constant_expression (call, val,
+ allow_non_constant, addr,
+ non_constant_p);
+ }
+
if (!allow_non_constant)
error ("array subscript out of bound");
*non_constant_p = true;