On Wed, 1 May 2024, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
LGTM > > -- >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 > >