From bf91504dc23f17248df6302f7bad849f3ddedee7 Mon Sep 17 00:00:00 2001 From: Patrick Palka Date: Thu, 16 Jan 2020 16:46:40 -0500 Subject: [PATCH] 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. --- gcc/cp/ChangeLog | 7 +++++++ gcc/cp/constraint.cc | 7 ++++--- gcc/cp/parser.c | 1 + 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 1609344ac6f..3d582383227 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,10 @@ +2020-01-22 Patrick Palka + + * 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 * coroutines.cc (finish_co_await_expr): Add error check on return diff --git a/gcc/cp/constraint.cc b/gcc/cp/constraint.cc index 128ab8ae0b2..823604afb89 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 > lists (count); + auto_vec< vec > 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 &list = lists[level - 1]; + vec &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 &list = lists[i]; + vec &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 caafbefda8e..ea32df92f9c 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; } -- 2.30.2