On Tue, Oct 28, 2014 at 3:50 PM, Richard Biener <richard.guent...@gmail.com> wrote: > On Mon, Oct 27, 2014 at 3:32 PM, Prathamesh Kulkarni > <bilbotheelffri...@gmail.com> wrote: >> I suppose we should reject conditional convert and commutative ops in >> result operand ? since it would create 1-n mapping from match -> >> result. > > Yeah. Same is true for parsing of :type syntax for the match part. > Now that we have a class parser I think it would be better to simply > record whether we are parsing ->match or ->result and issue the > diagnostic at parsing time. > > Can you adjust the patch accordingly? Is the following version okay ?
* genmatch.c (parser): Add new member parsing_match_operand. (parser::parse_operation): Check for conditional convert in result operand. (parser::parse_expr): Check for commutative operator in result operand. Check for :type in match operand. (parser::parse_simplify): Set/unset parsing_match_operand. Thanks, Prathamesh > > Thanks, > Richard. > >> * genmatch.c >> (fatal_at): New overloaded function with source_location as first >> parameter. >> (has_opt_convert_or_commutative_ops): New function. >> (lower): Call has_opt_convert_or_commutative_ops. >> >> Thanks, >> Prathamesh
Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 216776) +++ gcc/genmatch.c (working copy) @@ -2453,6 +2453,7 @@ public: vec<simplify *> simplifiers; vec<predicate_id *> user_predicates; + bool parsing_match_operand; }; /* Lexing helpers. */ @@ -2598,6 +2599,9 @@ ; else fatal_at (id_tok, "non-convert operator conditionalized"); + + if (!parsing_match_operand) + fatal_at (id_tok, "conditional convert can only be used in match expression"); eat_token (CPP_QUERY); } else if (strcmp (id, "convert1") == 0 @@ -2652,11 +2656,20 @@ { const char *s = get_ident (); if (s[0] == 'c' && !s[1]) - is_commutative = true; + { + if (!parsing_match_operand) + fatal_at (token, "flag :c can only be used in match expression"); + is_commutative = true; + } else if (s[1] != '\0') - expr_type = s; + { + if (parsing_match_operand) + fatal_at (token, "':type' can only be used in result expression"); + expr_type = s; + } else fatal_at (token, "flag %s not recognized", s); + token = peek (); } else @@ -2809,6 +2822,7 @@ { /* Reset the capture map. */ capture_ids = new std::map<std::string, unsigned>; + parsing_match_operand = true; const cpp_token *loc = peek (); struct operand *match = parse_op (); @@ -2818,6 +2832,7 @@ && is_a <predicate_id *> (as_a <expr *> (match)->operation)) fatal_at (loc, "outermost expression cannot be a predicate"); + parsing_match_operand = false; const cpp_token *token = peek (); /* If this if is immediately closed then it is part of a predicate