]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: ICE do to GC leakage [PR 99423]
authorNathan Sidwell <nathan@acm.org>
Wed, 10 Mar 2021 20:07:24 +0000 (12:07 -0800)
committerNathan Sidwell <nathan@acm.org>
Wed, 10 Mar 2021 20:12:00 +0000 (12:12 -0800)
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.

gcc/cp/module.cc
gcc/testsuite/g++.dg/modules/pr99423_a.H [new file with mode: 0644]
gcc/testsuite/g++.dg/modules/pr99423_b.H [new file with mode: 0644]

index 2518d73c22067e76e2bf4244d1f7ed92d5926e87..db5fa9076c3103db109508b5024699b204f131f9 100644 (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);
diff --git a/gcc/testsuite/g++.dg/modules/pr99423_a.H b/gcc/testsuite/g++.dg/modules/pr99423_a.H
new file mode 100644 (file)
index 0000000..db3406c
--- /dev/null
@@ -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 {};
+}
diff --git a/gcc/testsuite/g++.dg/modules/pr99423_b.H b/gcc/testsuite/g++.dg/modules/pr99423_b.H
new file mode 100644 (file)
index 0000000..c02ab29
--- /dev/null
@@ -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();