On Sat, 24 May 2025, Nathaniel Shead wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk/15?
LGTM FWIW > > -- >8 -- > > When emitting a primary module interface, we must re-stream any TU-local > entities that we saw in a partition. This patch adds the missing > members from core_vals. > > As a drive-by fix, in some cases we might have a typedef referring to a > TU-local entity; we need to handle that case as well. > > PR c++/120412 > > gcc/cp/ChangeLog: > > * module.cc (trees_out::core_vals): Write TU_LOCAL_ENTITY bits. > (trees_in::core_vals): Read it. > (trees_in::tree_node): Handle TU_LOCAL_ENTITY typedefs. > > gcc/testsuite/ChangeLog: > > * g++.dg/modules/internal-14_a.C: New test. > * g++.dg/modules/internal-14_b.C: New test. > * g++.dg/modules/internal-14_c.C: New test. > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com> > --- > gcc/cp/module.cc | 15 ++++++++++++++- > gcc/testsuite/g++.dg/modules/internal-14_a.C | 17 +++++++++++++++++ > gcc/testsuite/g++.dg/modules/internal-14_b.C | 6 ++++++ > gcc/testsuite/g++.dg/modules/internal-14_c.C | 9 +++++++++ > 4 files changed, 46 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/g++.dg/modules/internal-14_a.C > create mode 100644 gcc/testsuite/g++.dg/modules/internal-14_b.C > create mode 100644 gcc/testsuite/g++.dg/modules/internal-14_c.C > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc > index 17c040d26b0..16322fddde7 100644 > --- a/gcc/cp/module.cc > +++ b/gcc/cp/module.cc > @@ -6774,6 +6774,13 @@ trees_out::core_vals (tree t) > if (streaming_p ()) > WU (((lang_tree_node *)t)->trait_expression.kind); > break; > + > + case TU_LOCAL_ENTITY: > + WT (((lang_tree_node *)t)->tu_local_entity.name); > + if (state) > + state->write_location > + (*this, ((lang_tree_node *)t)->tu_local_entity.loc); > + break; > } > > if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) > @@ -7317,6 +7324,11 @@ trees_in::core_vals (tree t) > RT (((lang_tree_node *)t)->trait_expression.type2); > RUC (cp_trait_kind, ((lang_tree_node *)t)->trait_expression.kind); > break; > + > + case TU_LOCAL_ENTITY: > + RT (((lang_tree_node *)t)->tu_local_entity.name); > + ((lang_tree_node *)t)->tu_local_entity.loc > + = state->read_location (*this); > } > > if (CODE_CONTAINS_STRUCT (code, TS_TYPED)) > @@ -10125,7 +10137,8 @@ trees_in::tree_node (bool is_use) > && dump ("Read %stypedef %C:%N", > DECL_IMPLICIT_TYPEDEF_P (res) ? "implicit " : "", > TREE_CODE (res), res); > - res = TREE_TYPE (res); > + if (TREE_CODE (res) != TU_LOCAL_ENTITY) > + res = TREE_TYPE (res); > } > break; > > diff --git a/gcc/testsuite/g++.dg/modules/internal-14_a.C > b/gcc/testsuite/g++.dg/modules/internal-14_a.C > new file mode 100644 > index 00000000000..07eb9658951 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/internal-14_a.C > @@ -0,0 +1,17 @@ > +// PR c++/120412 > +// { dg-additional-options "-fmodules -std=c++20 -Wtemplate-names-tu-local" } > +// { dg-module-cmi m:part } > + > +export module m:part; > + > +export template <typename F> > +auto fun1(F) { > + return true; > +} > + > +using Dodgy = decltype([]{}); > + > +export template <typename T> > +auto fun2(T&&) { // { dg-warning "TU-local" } > + return fun1(Dodgy{}); > +} > diff --git a/gcc/testsuite/g++.dg/modules/internal-14_b.C > b/gcc/testsuite/g++.dg/modules/internal-14_b.C > new file mode 100644 > index 00000000000..ad3b09d0722 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/internal-14_b.C > @@ -0,0 +1,6 @@ > +// PR c++/120412 > +// { dg-additional-options "-fmodules -std=c++20 -Wtemplate-names-tu-local" } > +// { dg-module-cmi m } > + > +export module m; > +export import :part; > diff --git a/gcc/testsuite/g++.dg/modules/internal-14_c.C > b/gcc/testsuite/g++.dg/modules/internal-14_c.C > new file mode 100644 > index 00000000000..4f8e785ce87 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/modules/internal-14_c.C > @@ -0,0 +1,9 @@ > +// PR c++/120412 > +// { dg-additional-options "-fmodules -std=c++20" } > + > +import m; > + > +int main() { > + // { dg-error "instantiation exposes TU-local entity '(fun1|Dodgy)'" "" { > target *-*-* } 0 } > + fun2(123); // { dg-message "required from here" } > +} > -- > 2.47.0 > >