Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?

-- >8 --

Similarly to in the previous commit, templated virtual functions are
sometimes not instantiated until after parsing has completed.  This
means that any new declarations they instantiate are incorrectly marked
as being in the module purview, causing them to not be discarded from
the GMF.

        PR c++/114630
        PR c++/114795

gcc/cp/ChangeLog:

        * decl2.cc (mark_vtable_entries): Set module purview of deferred
        instantiations from the function decl.
        (c_parse_final_cleanups): Save and restore module_kind.

gcc/testsuite/ChangeLog:

        * g++.dg/modules/gmf-4.C: New test.

Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
---
 gcc/cp/decl2.cc                      | 11 +++++++++--
 gcc/testsuite/g++.dg/modules/gmf-4.C | 27 +++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/g++.dg/modules/gmf-4.C

diff --git a/gcc/cp/decl2.cc b/gcc/cp/decl2.cc
index 806a2a4bc69..0115a6b1cc9 100644
--- a/gcc/cp/decl2.cc
+++ b/gcc/cp/decl2.cc
@@ -2210,6 +2210,11 @@ mark_vtable_entries (tree decl, vec<tree> 
&consteval_vtables)
          location, as we're called from c_parse_final_cleanups, which
          takes care of that.  */
       input_location = DECL_SOURCE_LOCATION (fn);
+      /* Similarly, any deferred instantiations should have the same
+        module purview as this function.  */
+      module_kind &= ~MK_PURVIEW;
+      if (DECL_LANG_SPECIFIC (fn) && DECL_MODULE_PURVIEW_P (fn))
+       module_kind |= MK_PURVIEW;
       mark_used (fn);
     }
 }
@@ -5085,6 +5090,7 @@ c_parse_final_cleanups (void)
   tree decl;
 
   locus_at_end_of_parsing = input_location;
+  unsigned module_kind_at_end_of_parsing = module_kind;
   /* We're done parsing.  */
   at_eof = 1;
 
@@ -5177,9 +5183,10 @@ c_parse_final_cleanups (void)
            reconsider = true;
            keyed_classes->unordered_remove (i);
          }
-      /* The input_location may have been changed during marking of
-        vtable entries.  */
+      /* The input_location and module_kind may have been changed
+        during marking of vtable entries.  */
       input_location = locus_at_end_of_parsing;
+      module_kind = module_kind_at_end_of_parsing;
 
       /* Write out needed type info variables.  We have to be careful
         looping through unemitted decls, because emit_tinfo_decl may
diff --git a/gcc/testsuite/g++.dg/modules/gmf-4.C 
b/gcc/testsuite/g++.dg/modules/gmf-4.C
new file mode 100644
index 00000000000..c95bc782cea
--- /dev/null
+++ b/gcc/testsuite/g++.dg/modules/gmf-4.C
@@ -0,0 +1,27 @@
+// PR c++/114630
+// { dg-additional-options "-fmodules-ts -Wno-global-module 
-fdump-lang-module" }
+// { dg-module-cmi M }
+
+// Deferred instantiation of GM virtual functions should not place
+// newly discovered declarations in the module purview
+
+module;
+
+template <typename T>
+void go() {
+  extern T fn_decl();
+}
+
+template <typename T>
+struct S {
+  virtual void f() {
+    go<char>();
+  }
+};
+
+S<int> s;
+
+export module M;
+
+// The whole GMF should be discarded here
+// { dg-final { scan-lang-dump "Wrote 0 clusters" module } }
-- 
2.43.2

Reply via email to