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.
This commit is contained in:
Patrick Palka 2020-01-16 16:46:40 -05:00 committed by Patrick Palka
parent 7c46e71d01
commit bf91504dc2
3 changed files with 12 additions and 3 deletions

View 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

View 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);

View 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;
}