aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPatrick Palka <ppalka@redhat.com>2020-01-16 16:46:40 -0500
committerPatrick Palka <ppalka007@gmail.com>2020-01-22 11:13:02 -0500
commitbf91504dc23f17248df6302f7bad849f3ddedee7 (patch)
tree84a2687ae29c5334be0d8a435c36b58acadcf8d4 /gcc
parent7c46e71d016c86971ac26c6fa38d76482859f296 (diff)
downloadgcc-bf91504dc23f17248df6302f7bad849f3ddedee7.zip
gcc-bf91504dc23f17248df6302f7bad849f3ddedee7.tar.gz
gcc-bf91504dc23f17248df6302f7bad849f3ddedee7.tar.bz2
Fix a couple of memory leaks in the C++ frontend
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/cp/ChangeLog7
-rw-r--r--gcc/cp/constraint.cc7
-rw-r--r--gcc/cp/parser.c1
3 files changed, 12 insertions, 3 deletions
diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog
index 1609344..3d58238 100644
--- a/gcc/cp/ChangeLog
+++ b/gcc/cp/ChangeLog
@@ -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
diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc
index 128ab8a..823604a 100644
--- a/gcc/cp/constraint.cc
+++ b/gcc/cp/constraint.cc
@@ -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);
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index caafbef..ea32df9 100644
--- a/gcc/cp/parser.c
+++ b/gcc/cp/parser.c
@@ -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;
}