Currently this is accepted: (for plus (mult div) ...) which is incorrect. This patch puts more error-checks on the user-defined operator in for-pattern.
* genmatch.c (insert_operator): New function. (parse_for): Call insert_operator. Thanks, Prathamesh
Index: gcc/genmatch.c =================================================================== --- gcc/genmatch.c (revision 216673) +++ gcc/genmatch.c (working copy) @@ -349,8 +349,41 @@ return 0; } +id_base * +insert_operator (id_base *op) +{ + id_base **orig_slot; + id_base **slot = orig_slot = operators->find_slot_with_hash (op, op->hashval, INSERT); + if (*slot) + return 0; + char *id2 = xstrdup (op->id); + for (unsigned i = 0; i < strlen (id2); ++i) + id2[i] = TOUPPER (id2[i]); + id_base tem (id_base::CODE, id2); + slot = operators->find_slot_with_hash (&tem, tem.hashval, INSERT); + if (*slot) + { + free (id2); + return 0; + } + + /* Try _EXPR appended */ + id2 = (char *)xrealloc (id2, strlen (id2) + sizeof ("_EXPR") + 1); + strcat (id2, "_EXPR"); + id_base tem2 (id_base::CODE, id2); + slot = operators->find_slot_with_hash (&tem2, tem2.hashval, INSERT); + + if (*slot) + { + free (id2); + return 0; + } + + *orig_slot = op; + return *orig_slot; +} /* The AST produced by parsing of the pattern definitions. */ struct dt_operand; @@ -2920,10 +2953,8 @@ /* Insert the user defined operators into the operator hash. */ const char *id = get_ident (); user_id *op = new user_id (id); - id_base **slot = operators->find_slot_with_hash (op, op->hashval, INSERT); - if (*slot) - fatal_at (token, "operator already defined"); - *slot = op; + if (insert_operator (op) == 0) + fatal_at (token, "operator '%s' already defined", id); user_ids.safe_push (op); eat_token (CPP_OPEN_PAREN);