On Thu, Jul 15, 2021 at 5:19 AM Jason Merrill via Gcc-patches <gcc-patches@gcc.gnu.org> wrote: > > Many of the types from cp-tree.def were only marked as having tree_common, > when actually most of them have type_non_common. This broke > g++.dg/modules/xtreme-header-2, as the modules code relies on > tree_contains_struct to know what bits it needs to stream. > > We don't seem to use type_non_common for TYPE_ARGUMENT_PACK, so I bumped it > down to TS_TYPE_COMMON. I tried doing the same in cp_tree_size, but that > breaks without more extensive changes to tree_node_structure. > > Why do we need the init_ts function anyway? It seems redundant with > tree_node_structure.
tree_node_structure is a helper written for initialize_tree_contains_struct (the language independent "init_ts"), it's also used for the GTY dispatcher of the tree union. > > Tested x86_64-pc-linux-gnu, applying to trunk. > > PR c++/101095 > > gcc/cp/ChangeLog: > > * cp-objcp-common.c (cp_common_init_ts): Mark types as types. > (cp_tree_size): Remove redundant entries. > --- > gcc/cp/cp-objcp-common.c | 24 ++++++++++++++---------- > 1 file changed, 14 insertions(+), 10 deletions(-) > > diff --git a/gcc/cp/cp-objcp-common.c b/gcc/cp/cp-objcp-common.c > index 46b2248574c..ee255732d5a 100644 > --- a/gcc/cp/cp-objcp-common.c > +++ b/gcc/cp/cp-objcp-common.c > @@ -72,10 +72,13 @@ cp_tree_size (enum tree_code code) > case DEFERRED_NOEXCEPT: return sizeof (tree_deferred_noexcept); > case OVERLOAD: return sizeof (tree_overload); > case STATIC_ASSERT: return sizeof (tree_static_assert); > - case TYPE_ARGUMENT_PACK: > - case TYPE_PACK_EXPANSION: return sizeof (tree_type_non_common); > - case NONTYPE_ARGUMENT_PACK: > - case EXPR_PACK_EXPANSION: return sizeof (tree_exp); > +#if 0 > + /* This would match cp_common_init_ts, but breaks GC because > + tree_node_structure_for_code returns TS_TYPE_NON_COMMON for all > + types. */ > + case UNBOUND_CLASS_TEMPLATE: > + case TYPE_ARGUMENT_PACK: return sizeof (tree_type_common); > +#endif > case ARGUMENT_PACK_SELECT: return sizeof (tree_argument_pack_select); > case TRAIT_EXPR: return sizeof (tree_trait_expr); > case LAMBDA_EXPR: return sizeof (tree_lambda_expr); > @@ -456,13 +459,8 @@ cp_common_init_ts (void) > > /* Random new trees. */ > MARK_TS_COMMON (BASELINK); > - MARK_TS_COMMON (DECLTYPE_TYPE); > MARK_TS_COMMON (OVERLOAD); > MARK_TS_COMMON (TEMPLATE_PARM_INDEX); > - MARK_TS_COMMON (TYPENAME_TYPE); > - MARK_TS_COMMON (TYPEOF_TYPE); > - MARK_TS_COMMON (UNBOUND_CLASS_TEMPLATE); > - MARK_TS_COMMON (UNDERLYING_TYPE); > > /* New decls. */ > MARK_TS_DECL_COMMON (TEMPLATE_DECL); > @@ -472,10 +470,16 @@ cp_common_init_ts (void) > MARK_TS_DECL_NON_COMMON (USING_DECL); > > /* New Types. */ > + MARK_TS_TYPE_COMMON (UNBOUND_CLASS_TEMPLATE); > + MARK_TS_TYPE_COMMON (TYPE_ARGUMENT_PACK); > + > + MARK_TS_TYPE_NON_COMMON (DECLTYPE_TYPE); > + MARK_TS_TYPE_NON_COMMON (TYPENAME_TYPE); > + MARK_TS_TYPE_NON_COMMON (TYPEOF_TYPE); > + MARK_TS_TYPE_NON_COMMON (UNDERLYING_TYPE); > MARK_TS_TYPE_NON_COMMON (BOUND_TEMPLATE_TEMPLATE_PARM); > MARK_TS_TYPE_NON_COMMON (TEMPLATE_TEMPLATE_PARM); > MARK_TS_TYPE_NON_COMMON (TEMPLATE_TYPE_PARM); > - MARK_TS_TYPE_NON_COMMON (TYPE_ARGUMENT_PACK); > MARK_TS_TYPE_NON_COMMON (TYPE_PACK_EXPANSION); > > /* Statements. */ > > base-commit: c4fee1c646d52a9001a53fa0d4072db86b9be791 > -- > 2.27.0 >