c++: ICE do to GC leakage [PR 99423]

My reworking of pending-entity loading introduced a GC problem.  The
post-load processing needs to inhibit GCs (that would otherwise occur
in clone_decl).  That wasn't happening on one code path, leading to
dangling pointers in the active call frames.

	PR c++/99423
	gcc/cp/
	* module.cc (post_load_processing): Assert not gcable.
	(laxy_load_pendings): Extend no-gc region around
	post_load_processing.
	gcc/testsuite/
	* g++.dg/modules/pr99423_a.H: New.
	* g++.dg/modules/pr99423_b.H: New.
This commit is contained in:
Nathan Sidwell 2021-03-10 12:07:24 -08:00
parent 44fd4dc0b6
commit 1f428775ac
3 changed files with 24 additions and 1 deletions

View File

@ -17194,6 +17194,10 @@ module_state::write_inits (elf_out *to, depset::hash &table, unsigned *crc_ptr)
static void
post_load_processing ()
{
/* We mustn't cause a GC, our caller should have arranged for that
not to happen. */
gcc_checking_assert (function_depth);
if (!post_load_decls)
return;
@ -18882,9 +18886,9 @@ lazy_load_pendings (tree decl)
pending_table->remove (key);
dump.pop (n);
function_depth--;
lazy_snum = 0;
post_load_processing ();
function_depth--;
}
timevar_stop (TV_MODULE_IMPORT);

View File

@ -0,0 +1,13 @@
// PR 99423 ICE seeing GC freed entities
// { dg-additional-options -fmodule-header }
// { dg-module-cmi {} }
template<typename _T1>
struct pair
{
pair() { }
};
inline pair<bool> blob ()
{
return {};
}

View File

@ -0,0 +1,6 @@
// { dg-additional-options {-fmodule-header --param ggc-min-expand=0 --param ggc-min-heapsize=0} }
// { dg-module-cmi {} }
import "pr99423_a.H";
pair<bool> boom();