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
> 
> 

Reply via email to