diff options
author | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-16 18:24:55 +0000 |
---|---|---|
committer | rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2014-12-16 18:24:55 +0000 |
commit | 852fa94e29ebd44814054f4657b7385788b0321b (patch) | |
tree | 11c0289ddf7315923f3d0a6c53633d94b5314718 /gcc/genmatch.c | |
parent | 307137691983099bdfd8ecbba82128400f4a71d5 (diff) | |
download | gcc-852fa94e29ebd44814054f4657b7385788b0321b.tar.gz |
2014-12-16 Richard Biener <rguenther@suse.de>
* genmatch.c (parser::parser): Initialize capture_ids.
(parser::parse_pattern): Properly allocate capture_ids before
using them. Set capture_ids to zero when its lifetime is
supposed to finish.
(parser::parse_simplify): Allocate capture_ids only if
required.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218786 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/genmatch.c')
-rw-r--r-- | gcc/genmatch.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/genmatch.c b/gcc/genmatch.c index 756d54fc4b7..70a5f60df72 100644 --- a/gcc/genmatch.c +++ b/gcc/genmatch.c @@ -3171,7 +3171,8 @@ parser::parse_simplify (source_location match_location, expr *result) { /* Reset the capture map. */ - capture_ids = new cid_map_t; + if (!capture_ids) + capture_ids = new cid_map_t; /* Reset oper_lists and set. */ hash_set <user_id *> olist; oper_lists_set = &olist; @@ -3489,7 +3490,10 @@ parser::parse_pattern () const cpp_token *token = peek (); const char *id = get_ident (); if (strcmp (id, "simplify") == 0) - parse_simplify (token->src_loc, simplifiers, NULL, NULL); + { + parse_simplify (token->src_loc, simplifiers, NULL, NULL); + capture_ids = NULL; + } else if (strcmp (id, "match") == 0) { bool with_args = false; @@ -3514,6 +3518,7 @@ parser::parse_pattern () expr *e = NULL; if (with_args) { + capture_ids = new cid_map_t; e = new expr (p); while (peek ()->type == CPP_ATSIGN) e->append_op (parse_capture (NULL)); @@ -3525,6 +3530,7 @@ parser::parse_pattern () 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); + capture_ids = NULL; } else if (strcmp (id, "for") == 0) parse_for (token->src_loc); @@ -3562,6 +3568,7 @@ parser::parser (cpp_reader *r_) simplifiers = vNULL; oper_lists_set = NULL; oper_lists = vNULL; + capture_ids = NULL; user_predicates = vNULL; parsing_match_operand = false; |