genmatch.c (parser::parser): Initialize capture_ids.
authorRichard Biener <rguenther@suse.de>
Tue, 16 Dec 2014 18:24:55 +0000 (18:24 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 16 Dec 2014 18:24:55 +0000 (18:24 +0000)
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.

From-SVN: r218786

gcc/ChangeLog
gcc/genmatch.c

index e40fab7e1571142106cf186163cb6e581a553c12..609b8d1c6d47fbd901a4fcb43c4b5d635b7ab09b 100644 (file)
@@ -1,3 +1,12 @@
+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.
+
 2014-12-16  Michael Haubenwallner <michael.haubenwallner@ssi-schaefer.com>
 
        Both config.h and system.h define ABI/API macros for system headers.
index 756d54fc4b7cddc1e09e7062fbc48918edcd4295..70a5f60df72a46782dbe00fb70cc43ccff7d5d42 100644 (file)
@@ -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;