aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Biener <rguenther@suse.de>2015-07-29 12:06:14 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2015-07-29 12:06:14 +0000
commitc56f494f748440295cb1536871778153cd7c8335 (patch)
tree48ad90c6ec01799211a2947cf488f0dbdf109b1f /gcc
parent89a79e9629f0713df2c893133084563b5082e8e8 (diff)
downloadgcc-c56f494f748440295cb1536871778153cd7c8335.zip
gcc-c56f494f748440295cb1536871778153cd7c8335.tar.gz
gcc-c56f494f748440295cb1536871778153cd7c8335.tar.bz2
genmatch.c (c_expr::gen_transform): Error on unknown captures.
2015-07-29 Richard Biener <rguenther@suse.de> * genmatch.c (c_expr::gen_transform): Error on unknown captures. (parser::parse_capture): Add bool argument on whether to reject unknown captures. (parser::parse_expr): Adjust. (parser::parse_op): Likewise. (parser::parse_pattern): Likewise. From-SVN: r226344
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/genmatch.c21
2 files changed, 23 insertions, 7 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e3ed02b..df429fd 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,14 @@
2015-07-29 Richard Biener <rguenther@suse.de>
+ * genmatch.c (c_expr::gen_transform): Error on unknown captures.
+ (parser::parse_capture): Add bool argument on whether to reject
+ unknown captures.
+ (parser::parse_expr): Adjust.
+ (parser::parse_op): Likewise.
+ (parser::parse_pattern): Likewise.
+
+2015-07-29 Richard Biener <rguenther@suse.de>
+
* gimple-fold.c (has_use_on_stmt): New function.
(replace_stmt_with_simplification): Use it to allow
abnormals originally referenced in the stmt.
diff --git a/gcc/genmatch.c b/gcc/genmatch.c
index 7ad00f2..5f6d9dc 100644
--- a/gcc/genmatch.c
+++ b/gcc/genmatch.c
@@ -2048,7 +2048,10 @@ c_expr::gen_transform (FILE *f, int indent, const char *dest,
id = (const char *)n->val.str.text;
else
id = (const char *)CPP_HASHNODE (n->val.node.node)->ident.str;
- fprintf (f, "captures[%u]", *capture_ids->get(id));
+ unsigned *cid = capture_ids->get (id);
+ if (!cid)
+ fatal_at (token, "unknown capture id");
+ fprintf (f, "captures[%u]", *cid);
++i;
continue;
}
@@ -3153,7 +3156,7 @@ private:
const char *get_number ();
id_base *parse_operation ();
- operand *parse_capture (operand *);
+ operand *parse_capture (operand *, bool);
operand *parse_expr ();
c_expr *parse_c_expr (cpp_ttype);
operand *parse_op ();
@@ -3383,7 +3386,7 @@ parser::parse_operation ()
capture = '@'<number> */
struct operand *
-parser::parse_capture (operand *op)
+parser::parse_capture (operand *op, bool require_existing)
{
source_location src_loc = eat_token (CPP_ATSIGN)->src_loc;
const cpp_token *token = peek ();
@@ -3398,7 +3401,11 @@ parser::parse_capture (operand *op)
bool existed;
unsigned &num = capture_ids->get_or_insert (id, &existed);
if (!existed)
- num = next_id;
+ {
+ if (require_existing)
+ fatal_at (src_loc, "unknown capture id");
+ num = next_id;
+ }
return new capture (src_loc, num, op);
}
@@ -3452,7 +3459,7 @@ parser::parse_expr ()
if (token->type == CPP_ATSIGN
&& !(token->flags & PREV_WHITE))
- op = parse_capture (e);
+ op = parse_capture (e, !parsing_match_operand);
else if (force_capture)
{
unsigned num = capture_ids->elements ();
@@ -3604,7 +3611,7 @@ parser::parse_op ()
if (token->type == CPP_COLON)
fatal_at (token, "not implemented: predicate on leaf operand");
if (token->type == CPP_ATSIGN)
- op = parse_capture (op);
+ op = parse_capture (op, !parsing_match_operand);
}
return op;
@@ -4074,7 +4081,7 @@ parser::parse_pattern ()
capture_ids = new cid_map_t;
e = new expr (p, e_loc);
while (peek ()->type == CPP_ATSIGN)
- e->append_op (parse_capture (NULL));
+ e->append_op (parse_capture (NULL, false));
eat_token (CPP_CLOSE_PAREN);
}
if (p->nargs != -1