Fix a couple of memory leaks in the C++ frontend
authorPatrick Palka <ppalka@redhat.com>
Thu, 16 Jan 2020 21:46:40 +0000 (16:46 -0500)
committerPatrick Palka <ppalka007@gmail.com>
Wed, 22 Jan 2020 16:13:02 +0000 (11:13 -0500)
The leak in get_mapped_args is due to auto_vec not properly supporting
destructible elements in that auto_vec's destructor doesn't call the
destructors of its elements.

gcc/cp/ChangeLog:

* constraint.cc (get_mapped_args): Avoid using auto_vec
as a vector element.  Release the vectors inside the lists
vector.
* parser.c (cp_literal_operator_id): Free the buffer.

gcc/cp/ChangeLog
gcc/cp/constraint.cc
gcc/cp/parser.c

index 1609344ac6fd029838d9df2a014846cce9336974..3d5823832279a17e75b1e324fff65d07fdb5e65f 100644 (file)
@@ -1,3 +1,10 @@
+2020-01-22  Patrick Palka  <ppalka@redhat.com>
+
+       * constraint.cc (get_mapped_args): Avoid using auto_vec
+       as a vector element.  Release the vectors inside the lists
+       vector.
+       * parser.c (cp_literal_operator_id): Free the buffer.
+
 2020-01-22  Jun Ma  <JunMa@linux.alibaba.com>
 
        * coroutines.cc (finish_co_await_expr): Add error check on return
index 128ab8ae0b21b6171412a9e798d5b9905577e61f..823604afb89e7a06c2d04cc6da07f6af924415e3 100644 (file)
@@ -2431,7 +2431,7 @@ get_mapped_args (tree map)
      list. Note that the list will be sparse (not all arguments supplied),
      but instantiation is guaranteed to only use the parameters in the
      mapping, so null arguments would never be used.  */
-  auto_vec< auto_vec<tree> > lists (count);
+  auto_vec< vec<tree> > lists (count);
   lists.quick_grow_cleared (count);
   for (tree p = map; p; p = TREE_CHAIN (p))
     {
@@ -2440,7 +2440,7 @@ get_mapped_args (tree map)
       template_parm_level_and_index (TREE_VALUE (p), &level, &index);
 
       /* Insert the argument into its corresponding position.  */
-      auto_vec<tree> &list = lists[level - 1];
+      vec<tree> &list = lists[level - 1];
       if (index >= (int)list.length ())
        list.safe_grow_cleared (index + 1);
       list[index] = TREE_PURPOSE (p);
@@ -2450,11 +2450,12 @@ get_mapped_args (tree map)
   tree args = make_tree_vec (lists.length ());
   for (unsigned i = 0; i != lists.length (); ++i)
     {
-      auto_vec<tree> &list = lists[i];
+      vec<tree> &list = lists[i];
       tree level = make_tree_vec (list.length ());
       for (unsigned j = 0; j < list.length(); ++j)
        TREE_VEC_ELT (level, j) = list[j];
       SET_TMPL_ARGS_LEVEL (args, i + 1, level);
+      list.release ();
     }
   SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (args, 0);
 
index caafbefda8e63013367ddad23942c06e25276f80..ea32df92f9c18b1e3e2bfe0b84690e01c3c4f1f8 100644 (file)
@@ -15372,6 +15372,7 @@ cp_literal_operator_id (const char* name)
                              + strlen (name) + 10);
   sprintf (buffer, UDLIT_OP_ANSI_FORMAT, name);
   identifier = get_identifier (buffer);
+  XDELETEVEC (buffer);
 
   return identifier;
 }