Hi, This patch rejects expanding operator-list to implicit 'for'. OK for trunk after bootstrap+testing ?
Thanks, Prathamesh
2015-05-20 Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> * genmatch.c (parser::record_operlist): Remove. (parser::oper_lists_set): Likewise. (parser::oper_lists): Likewise. (parser::parse_operation): Reject operator-list and remove call to parser::record_operlist. (parser::parse_c_expr): Remove call to parser::record_operlist. (parser::push_simplify): Remove pushing and popping parser::oper_lists in parser::active_fors. (parser::parse_simplify): Avoid initializing parser::oper_lists and parser::oper_lists_set. (parser::parser): Likewise.
Index: genmatch.c =================================================================== --- genmatch.c (revision 223437) +++ genmatch.c (working copy) @@ -2714,7 +2714,6 @@ c_expr *parse_c_expr (cpp_ttype); operand *parse_op (); - void record_operlist (source_location, user_id *); void parse_pattern (); void push_simplify (vec<simplify *>&, operand *, source_location, @@ -2729,9 +2728,6 @@ cpp_reader *r; vec<if_or_with> active_ifs; vec<vec<user_id *> > active_fors; - hash_set<user_id *> *oper_lists_set; - vec<user_id *> oper_lists; - cid_map_t *capture_ids; public: @@ -2860,22 +2856,6 @@ return (const char *)token->val.str.text; } - -/* Record an operator-list use for transparent for handling. */ - -void -parser::record_operlist (source_location loc, user_id *p) -{ - if (!oper_lists_set->add (p)) - { - if (!oper_lists.is_empty () - && oper_lists[0]->substitutes.length () != p->substitutes.length ()) - fatal_at (loc, "User-defined operator list does not have the " - "same number of entries as others used in the pattern"); - oper_lists.safe_push (p); - } -} - /* Parse the operator ID, special-casing convert?, convert1? and convert2? */ @@ -2913,7 +2893,7 @@ user_id *p = dyn_cast<user_id *> (op); if (p && p->is_oper_list) - record_operlist (id_tok->src_loc, p); + fatal_at (id_tok, "invalid use of operator-list %s", id); return op; } @@ -3051,11 +3031,8 @@ /* If this is possibly a user-defined identifier mark it used. */ if (token->type == CPP_NAME) { - id_base *idb = get_operator ((const char *)CPP_HASHNODE - (token->val.node.node)->ident.str); - user_id *p; - if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list) - record_operlist (token->src_loc, p); + get_operator ((const char *)CPP_HASHNODE + (token->val.node.node)->ident.str); } /* Record the token. */ @@ -3140,16 +3117,9 @@ operand *match, source_location match_loc, operand *result, source_location result_loc) { - /* Build and push a temporary for for operator list uses in expressions. */ - if (!oper_lists.is_empty ()) - active_fors.safe_push (oper_lists); - simplifiers.safe_push (new simplify (match, match_loc, result, result_loc, active_ifs.copy (), active_fors.copy (), capture_ids)); - - if (!oper_lists.is_empty ()) - active_fors.pop (); } /* Parse @@ -3170,11 +3140,7 @@ /* Reset the capture map. */ if (!capture_ids) capture_ids = new cid_map_t; - /* Reset oper_lists and set. */ - hash_set <user_id *> olist; - oper_lists_set = &olist; - oper_lists = vNULL; - + const cpp_token *loc = peek (); parsing_match_operand = true; struct operand *match = parse_op (); @@ -3563,8 +3529,6 @@ active_ifs = vNULL; active_fors = vNULL; simplifiers = vNULL; - oper_lists_set = NULL; - oper_lists = vNULL; capture_ids = NULL; user_predicates = vNULL; parsing_match_operand = false;