On Sat, 26 Jul 2025, Nathaniel Shead wrote:

> On Fri, Jul 25, 2025 at 08:58:47AM -0400, Patrick Palka wrote:
> > On Fri, 25 Jul 2025, Nathaniel Shead wrote:
> > 
> > > Bootstrapped and regtested on x86_64-pc-linux-gnu, OK for trunk?
> > > 
> > > -- >8 --
> > > 
> > > I noticed that C++26 trivial relocation didn't work in modules yet, and
> > > there are a couple of other flags that seem potentially useful we
> > > weren't streaming.  This streams those flags and adds a comment to
> > > cp-tree.h to help people remember about modules when adding more.
> > > 
> > > As a drive-by improvement, update gcc_assert with gcc_checking_assert in
> > > lang_type_bools streaming.
> > 
> > LGTM
> > 
> 
> Thanks!  To clarify, I notice you're now a reviewer for the C++ frontend
> (congratulations!); does this count as approval or should I wait for
> Jason?

Oops good point, I guess I should say "OK for trunk" now :) (and thanks!)

> 
> > > 
> > > gcc/cp/ChangeLog:
> > > 
> > >   * cp-tree.h (struct lang_type): Add comment mentioning modules.
> > >   * module.cc (trees_out::lang_type_bools): Stream new flags, use
> > >   gcc_checking_assert.
> > >   (trees_in::lang_type_bools): Likewise.
> > > 
> > > gcc/testsuite/ChangeLog:
> > > 
> > >   * g++.dg/modules/class-11_a.H: New test.
> > >   * g++.dg/modules/class-11_b.C: New test.
> > > 
> > > Signed-off-by: Nathaniel Shead <nathanielosh...@gmail.com>
> > > ---
> > >  gcc/cp/cp-tree.h                          |  4 ++-
> > >  gcc/cp/module.cc                          | 22 ++++++++++++--
> > >  gcc/testsuite/g++.dg/modules/class-11_a.H | 36 +++++++++++++++++++++++
> > >  gcc/testsuite/g++.dg/modules/class-11_b.C | 15 ++++++++++
> > >  4 files changed, 73 insertions(+), 4 deletions(-)
> > >  create mode 100644 gcc/testsuite/g++.dg/modules/class-11_a.H
> > >  create mode 100644 gcc/testsuite/g++.dg/modules/class-11_b.C
> > > 
> > > diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> > > index 01112aa894e..22bb70136f5 100644
> > > --- a/gcc/cp/cp-tree.h
> > > +++ b/gcc/cp/cp-tree.h
> > > @@ -2508,7 +2508,9 @@ struct GTY(()) lang_type {
> > >  
> > >    /* When adding a flag here, consider whether or not it ought to
> > >       apply to a template instance if it applies to the template.  If
> > > -     so, make sure to copy it in instantiate_class_template!  */
> > > +     so, make sure to copy it in instantiate_class_template!
> > > +
> > > +     Also make sure new flags here are streamed in module.cc.  */
> > >  
> > >    /* There are some bits left to fill out a 32-bit word.  Keep track
> > >       of this by updating the size of this bitfield whenever you add or
> > > diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> > > index a551509ec0b..ed51837433e 100644
> > > --- a/gcc/cp/module.cc
> > > +++ b/gcc/cp/module.cc
> > > @@ -6157,7 +6157,7 @@ trees_out::lang_type_bools (tree t, bits_out& bits)
> > >    WB (lang->declared_class);
> > >    WB (lang->diamond_shaped);
> > >    WB (lang->repeated_base);
> > > -  gcc_assert (!lang->being_defined);
> > > +  gcc_checking_assert (!lang->being_defined);
> > >    // lang->debug_requested
> > >    WB (lang->fields_readonly);
> > >    WB (lang->ptrmemfunc_flag);
> > > @@ -6183,6 +6183,14 @@ trees_out::lang_type_bools (tree t, bits_out& bits)
> > >    WB (lang->has_constexpr_ctor);
> > >    WB (lang->unique_obj_representations);
> > >    WB (lang->unique_obj_representations_set);
> > > +  gcc_checking_assert (!lang->erroneous);
> > > +  WB (lang->non_pod_aggregate);
> > > +  WB (lang->non_aggregate_pod);
> > > +  WB (lang->trivially_relocatable);
> > > +  WB (lang->trivially_relocatable_computed);
> > > +
> > > +  WB (lang->replaceable);
> > > +  WB (lang->replaceable_computed);
> > >  #undef WB
> > >  }
> > >  
> > > @@ -6227,8 +6235,8 @@ trees_in::lang_type_bools (tree t, bits_in& bits)
> > >    RB (lang->declared_class);
> > >    RB (lang->diamond_shaped);
> > >    RB (lang->repeated_base);
> > > -  gcc_assert (!lang->being_defined);
> > > -  gcc_assert (!lang->debug_requested);
> > > +  gcc_checking_assert (!lang->being_defined);
> > > +  gcc_checking_assert (!lang->debug_requested);
> > >    RB (lang->fields_readonly);
> > >    RB (lang->ptrmemfunc_flag);
> > >  
> > > @@ -6253,6 +6261,14 @@ trees_in::lang_type_bools (tree t, bits_in& bits)
> > >    RB (lang->has_constexpr_ctor);
> > >    RB (lang->unique_obj_representations);
> > >    RB (lang->unique_obj_representations_set);
> > > +  gcc_checking_assert (!lang->erroneous);
> > > +  RB (lang->non_pod_aggregate);
> > > +  RB (lang->non_aggregate_pod);
> > > +  RB (lang->trivially_relocatable);
> > > +  RB (lang->trivially_relocatable_computed);
> > > +
> > > +  RB (lang->replaceable);
> > > +  RB (lang->replaceable_computed);
> > >  #undef RB
> > >    return !get_overrun ();
> > >  }
> > > diff --git a/gcc/testsuite/g++.dg/modules/class-11_a.H 
> > > b/gcc/testsuite/g++.dg/modules/class-11_a.H
> > > new file mode 100644
> > > index 00000000000..b14a8adb1ed
> > > --- /dev/null
> > > +++ b/gcc/testsuite/g++.dg/modules/class-11_a.H
> > > @@ -0,0 +1,36 @@
> > > +// Check for some additional lang_type flags that we'd missed.
> > > +// { dg-additional-options "-fmodule-header -fabi-version=21 -Wabi=15" }
> > > +// { dg-module-cmi {} }
> > > +
> > > +#if __cpp_trivial_relocatability < 202502L
> > > +#define trivially_relocatable_if_eligible 
> > > __trivially_relocatable_if_eligible
> > > +#define replaceable_if_eligible __replaceable_if_eligible
> > > +#endif
> > > +
> > > +struct A trivially_relocatable_if_eligible { A(A&&); };
> > > +struct B replaceable_if_eligible { B(B&&); B& operator=(B&&); };
> > > +struct C {};
> > > +static_assert(__builtin_is_trivially_relocatable(C) && 
> > > __builtin_is_replaceable(C));
> > > +
> > > +
> > > +struct pr106381 {
> > > +  long l;
> > > +  char c = -1;
> > > +};
> > > +struct L1 : pr106381 {
> > > +  char x;  // { dg-warning "offset" "" { target c++14 } }
> > > +};
> > > +static_assert(sizeof(L1) == sizeof(pr106381));
> > > +
> > > +
> > > +struct pr120012 {
> > > +  pr120012(const pr120012&) = default;
> > > +  pr120012(pr120012&&) = default;
> > > +  pr120012& operator=(pr120012&&) = default;
> > > +  unsigned int a;
> > > +  unsigned char b;
> > > +};
> > > +struct L2 : pr120012 {
> > > +  unsigned char y;  // { dg-warning "offset" "" { target c++20 } }
> > > +};
> > > +static_assert(sizeof(L2) > sizeof(pr120012));
> > > diff --git a/gcc/testsuite/g++.dg/modules/class-11_b.C 
> > > b/gcc/testsuite/g++.dg/modules/class-11_b.C
> > > new file mode 100644
> > > index 00000000000..476cb63308f
> > > --- /dev/null
> > > +++ b/gcc/testsuite/g++.dg/modules/class-11_b.C
> > > @@ -0,0 +1,15 @@
> > > +// { dg-additional-options "-fmodules -fabi-version=21 -Wabi=15" }
> > > +
> > > +import "class-11_a.H";
> > > +
> > > +static_assert(__builtin_is_trivially_relocatable(A));
> > > +static_assert(__builtin_is_replaceable(B));
> > > +static_assert(__builtin_is_trivially_relocatable(C) && 
> > > __builtin_is_replaceable(C));
> > > +
> > > +struct M1 : pr106381 {
> > > +  char x;  // { dg-warning "offset" "" { target c++14 } }
> > > +};
> > > +
> > > +struct M2 : pr120012 {
> > > +  unsigned char y;  // { dg-warning "offset" "" { target c++20 } }
> > > +};
> > > -- 
> > > 2.47.0
> > > 
> > > 
> > 
> 
> 

Reply via email to