On 06/26/2013 01:31 PM, Iyer, Balaji V wrote:
Attached, please find a fixed patch and ChangeLog entries:
This patch seems to be missing some hunks that are described in the ChangeLog and were present in the previous patch, such as
* cp-array-notation.c (cp_length_mismatch_in_expr_p): Combined two if statements into one and compared integers using tree_int_cst_equal.
Sorry about that, I accidentally missed this one. It is fixed now. I have also added the braced list capability into cp_array_notation.
Hmm, I seem to have been unclear. I was expecting that the call to cp_parser_array_notation could come after the braced list case, so we don't need to duplicate the offsetof or braced list code inside cp_parser_array_notation.
And then if you'd like we could check for ':' before the ']' and give a helpful diagnostic.
+ /* If we hare here, then there are 2 possibilities:
"are"
+ if (processing_template_decl) + array_ntn_expr = build_min_nt_loc (loc, ARRAY_NOTATION_REF, array, + start_index, length, stride, NULL_TREE);
If we know the type of the array, we should use it, rather than always leaving it null in a template. That is, if !dependent_type_p (type), we should give the ARRAY_NOTATION_REF a real type.
+ if (TREE_CODE (array_type) == RECORD_TYPE + || TREE_CODE (array_type) == POINTER_TYPE) { + error_at (loc, "start-index and length fields necessary for " + "using array notation in pointers or records");
In a template, array_type might be NULL_TREE; this diagnostic should move into build_array_notation_ref.
+ array_type_domain = TYPE_DOMAIN (array_type); + if (!array_type_domain) + { + error_at (loc, "start-index and length fields necessary for " + "using array notation with array of unknown bound"); + cp_parser_skip_to_end_of_statement (parser); + return error_mark_node; + } + start_index = TYPE_MINVAL (array_type_domain); + start_index = cp_fold_convert (ptrdiff_type_node, start_index); + length_index = size_binop + (PLUS_EXPR, TYPE_MAXVAL (array_type_domain), size_one_node); + length_index = cp_fold_convert (ptrdiff_type_node, length_index); + stride = build_int_cst (ptrdiff_type_node, 1);
As should all this code. cp_parser_array_notation should only parse.
+ else + stride = build_one_cst (ptrdiff_type_node);
I would move this into build_array_notation_ref as well. Jason