diff mbox series

[pushed] c++: fix tree_contains_struct for C++ types [PR101095]

Message ID 20210715031835.478412-1-jason@redhat.com
State New
Headers show
Series [pushed] c++: fix tree_contains_struct for C++ types [PR101095] | expand

Commit Message

Jason Merrill July 15, 2021, 3:18 a.m. UTC
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.

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


base-commit: c4fee1c646d52a9001a53fa0d4072db86b9be791

Comments

Richard Biener July 15, 2021, 8:08 a.m. UTC | #1
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
>
diff mbox series

Patch

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.  */