diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc index 20affcd65a2765e1a5ab599f1f9d3f43a0a59bcc..4ceae1d38de1be7fb9ffcf017400b4a4091ce83d 100644 --- a/gcc/cp/pt.cc +++ b/gcc/cp/pt.cc @@ -9275,6 +9275,7 @@ coerce_template_parms (tree parms, { /* We don't know how many args we have yet, just use the unconverted (and still packed) ones for now. */ + ggc_free (new_inner_args); new_inner_args = orig_inner_args; arg_idx = nargs; break; @@ -9329,7 +9330,8 @@ coerce_template_parms (tree parms, = make_pack_expansion (conv, complain); /* We don't know how many args we have yet, just - use the unconverted ones for now. */ + use the unconverted (but unpacked) ones for now. */ + ggc_free (new_inner_args); new_inner_args = inner_args; arg_idx = nargs; break; @@ -9442,6 +9444,12 @@ coerce_template_parms (tree parms, SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (new_inner_args, TREE_VEC_LENGTH (new_inner_args)); + /* If we expanded packs in inner_args and aren't returning it now, the + expanded vec is garbage. */ + if (inner_args != new_inner_args + && inner_args != orig_inner_args) + ggc_free (inner_args); + return return_full_args ? new_args : new_inner_args; }