mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-25 05:30:25 +08:00
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:
parent
7c46e71d01
commit
bf91504dc2
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user