diff mbox

[match-and-simplify] allow 't' only in user-defined predicates

Message ID CAAgBjM=p2ooLRXqzV1-RMJRn-_gkxQxs-PaNoZQVAA_JuNUWCw@mail.gmail.com
State New
Headers show

Commit Message

Prathamesh Kulkarni Dec. 16, 2014, 2:28 p.m. UTC
This patch rejects 't' outside user-defined predicates.

2014-12-16  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>

        * genmatch.c (parser::parsing_match): New.
        (parser::parser): Initialize parsing_match to false.
        (parser::parse_pattern): Reset parsing_match when parsing
user-defined                       predicate.
        (parser::parse_c_expr): Check if 't' is used when parsing_match is set.

Thanks,
Prathamesh

Comments

Prathamesh Kulkarni Dec. 16, 2014, 2:32 p.m. UTC | #1
sorry for the noise. I sent it just before our conversation on IRC.

On 16 December 2014 at 19:58, Prathamesh Kulkarni
<prathamesh.kulkarni@linaro.org> wrote:
> This patch rejects 't' outside user-defined predicates.
>
> 2014-12-16  Prathamesh Kulkarni  <prathamesh.kulkarni@linaro.org>
>
>         * genmatch.c (parser::parsing_match): New.
>         (parser::parser): Initialize parsing_match to false.
>         (parser::parse_pattern): Reset parsing_match when parsing
> user-defined                       predicate.
>         (parser::parse_c_expr): Check if 't' is used when parsing_match is set.
>
> Thanks,
> Prathamesh
diff mbox

Patch

Index: gcc/genmatch.c
===================================================================
--- gcc/genmatch.c	(revision 218778)
+++ gcc/genmatch.c	(working copy)
@@ -2746,6 +2746,7 @@ 
   vec<simplify *> simplifiers;
   vec<predicate_id *> user_predicates;
   bool parsing_match_operand;
+  bool parsing_match;
 };
 
 /* Lexing helpers.  */
@@ -3059,8 +3060,11 @@ 
       /* 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);
+	  const char *lexeme = (const char *) CPP_HASHNODE (token->val.node.node)->ident.str;
+	  if (strcmp (lexeme, "t") == 0 && !parsing_match)
+	    fatal_at (token, "'t' is allowed only in predicates");
+
+	  id_base *idb = get_operator (lexeme);
 	  user_id *p;
 	  if (idb && (p = dyn_cast<user_id *> (idb)) && p->is_oper_list)
 	    record_operlist (token->src_loc, p);
@@ -3497,6 +3501,7 @@ 
     parse_simplify (token->src_loc, simplifiers, NULL, NULL);
   else if (strcmp (id, "match") == 0)
     {
+      parsing_match = true;
       bool with_args = false;
       if (peek ()->type == CPP_OPEN_PAREN)
 	{
@@ -3530,6 +3535,7 @@ 
 	fatal_at (token, "non-matching number of match operands");
       p->nargs = e ? e->ops.length () : 0;
       parse_simplify (token->src_loc, p->matchers, p, e);
+      parsing_match = false;
     }
   else if (strcmp (id, "for") == 0)
     parse_for (token->src_loc);
@@ -3569,6 +3575,7 @@ 
   oper_lists = vNULL;
   user_predicates = vNULL;
   parsing_match_operand = false;
+  parsing_match = false;
 
   const cpp_token *token = next ();
   while (token->type != CPP_EOF)