diff options
author | Jason Merrill <jason@redhat.com> | 2011-05-06 17:57:41 -0400 |
---|---|---|
committer | Jason Merrill <jason@gcc.gnu.org> | 2011-05-06 17:57:41 -0400 |
commit | c80e3e0267b3b415090d49a73747486f3313138b (patch) | |
tree | 523ded34c464561c71a40891051869504f7dc0f8 /gcc/cp | |
parent | d8f426ecc93d65cb9c8c7698116b6bad194fbdb9 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cp/semantics.c | 14 |
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; |