On Tue, Oct 28, 2014 at 3:50 PM, Richard Biener
<[email protected]> wrote:
> On Mon, Oct 27, 2014 at 3:32 PM, Prathamesh Kulkarni
> <[email protected]> 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