public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros
@ 2022-05-10 13:40 Patrick Palka
  2022-05-10 13:40 ` [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS Patrick Palka
  2022-05-10 14:17 ` [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Jason Merrill
  0 siblings, 2 replies; 4+ messages in thread
From: Patrick Palka @ 2022-05-10 13:40 UTC (permalink / raw)
  To: gcc-patches

The accessor macros for TYPE_PACK_EXPANSION/EXPR_PACK_EXPANSION
and TYPE_ARGUMENT_PACK/NONTYPE_ARGUMENT_PACK should check the
tree code of the argument.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?

gcc/cp/ChangeLog:

	* cp-tree.h (PACK_EXPANSION_CHECK): Define.
	(PACK_EXPANSION_PATTERN): Use PACK_EXPANSION_CHECK.
	(SET_PACK_EXPANSION_PATTERN): Likewise.
	(PACK_EXPANSION_PARAMETER_PACKS): Likewise.
	(PACK_EXPANSION_EXTRA_ARGS): Likewise.
	(PACK_EXPANSION_LOCAL_P): Likewise.
	(PACK_EXPANSION_SIZEOF_P): Likewise.
	(PACK_EXPANSION_AUTO_P): Likewise.
	(PACK_EXPANSION_FORCE_EXTRA_ARGS_P): Likewise.
	(ARGUMENT_PACK_CHECK): Define.
	(ARGUMENT_PACK_ARGS): Use ARGUMENT_PACK_CHECK.
	(SET_ARGUMENT_PACK_ARGS): Likewise.
	* parser.c (cp_parser_sizeof_pack): Check for error_mark_node
	before setting PACK_EXPANSION_SIZEOF_P.
---
 gcc/cp/cp-tree.h | 34 ++++++++++++++++++++++------------
 gcc/cp/parser.cc |  3 ++-
 2 files changed, 24 insertions(+), 13 deletions(-)

diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 8a5057a4dff..29fc0e5f829 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3894,16 +3894,19 @@ struct GTY(()) lang_decl {
   (TREE_CODE (NODE) == TYPE_PACK_EXPANSION     \
    || TREE_CODE (NODE) == EXPR_PACK_EXPANSION)
 
+#define PACK_EXPANSION_CHECK(NODE) \
+  TREE_CHECK2 (NODE, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION)
+
 /* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or
    EXPR_PACK_EXPANSION.  */
 #define PACK_EXPANSION_PATTERN(NODE)                            \
-  (TREE_CODE (NODE) == TYPE_PACK_EXPANSION ? TREE_TYPE (NODE)    \
-   : TREE_OPERAND (NODE, 0))
+  (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
+   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
 
 /* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
    EXPR_PACK_EXPANSION.  */
 #define SET_PACK_EXPANSION_PATTERN(NODE,VALUE)  \
-  if (TREE_CODE (NODE) == TYPE_PACK_EXPANSION)  \
+  if (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION)  \
     TREE_TYPE (NODE) = VALUE;                   \
   else                                          \
     TREE_OPERAND (NODE, 0) = VALUE
@@ -3911,7 +3914,7 @@ struct GTY(()) lang_decl {
 /* The list of parameter packs used in the PACK_EXPANSION_* node. The
    TREE_VALUE of each TREE_LIST contains the parameter packs.  */
 #define PACK_EXPANSION_PARAMETER_PACKS(NODE)		\
-  *(TREE_CODE (NODE) == EXPR_PACK_EXPANSION		\
+  *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == EXPR_PACK_EXPANSION \
     ? &TREE_OPERAND (NODE, 1)				\
     : &TYPE_MIN_VALUE_RAW (TYPE_PACK_EXPANSION_CHECK (NODE)))
 
@@ -3922,22 +3925,26 @@ struct GTY(()) lang_decl {
    are enclosing functions that provided function parameter packs we'll need
    to map appropriately.  */
 #define PACK_EXPANSION_EXTRA_ARGS(NODE)		\
-  *(TREE_CODE (NODE) == TYPE_PACK_EXPANSION	\
+  *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
     ? &TYPE_MAX_VALUE_RAW (NODE)			\
     : &TREE_OPERAND ((NODE), 2))
 
 /* True iff this pack expansion is within a function context.  */
-#define PACK_EXPANSION_LOCAL_P(NODE) TREE_LANG_FLAG_0 (NODE)
+#define PACK_EXPANSION_LOCAL_P(NODE) \
+  TREE_LANG_FLAG_0 (PACK_EXPANSION_CHECK (NODE))
 
 /* True iff this pack expansion is for sizeof....  */
-#define PACK_EXPANSION_SIZEOF_P(NODE) TREE_LANG_FLAG_1 (NODE)
+#define PACK_EXPANSION_SIZEOF_P(NODE) \
+  TREE_LANG_FLAG_1 (PACK_EXPANSION_CHECK (NODE))
 
 /* True iff this pack expansion is for auto... in lambda init-capture.  */
-#define PACK_EXPANSION_AUTO_P(NODE) TREE_LANG_FLAG_2 (NODE)
+#define PACK_EXPANSION_AUTO_P(NODE) \
+  TREE_LANG_FLAG_2 (PACK_EXPANSION_CHECK (NODE))
 
 /* True if we must use PACK_EXPANSION_EXTRA_ARGS and avoid partial
    instantiation of this pack expansion.  */
-#define PACK_EXPANSION_FORCE_EXTRA_ARGS_P(NODE) TREE_LANG_FLAG_3 (NODE)
+#define PACK_EXPANSION_FORCE_EXTRA_ARGS_P(NODE) \
+  TREE_LANG_FLAG_3 (PACK_EXPANSION_CHECK (NODE))
 
 /* True iff the wildcard can match a template parameter pack.  */
 #define WILDCARD_PACK_P(NODE) TREE_LANG_FLAG_0 (NODE)
@@ -3947,16 +3954,19 @@ struct GTY(()) lang_decl {
   (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK              \
    || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK)
 
+#define ARGUMENT_PACK_CHECK(NODE) \
+  TREE_CHECK2 (NODE, TYPE_ARGUMENT_PACK, NONTYPE_ARGUMENT_PACK)
+
 /* The arguments stored in an argument pack. Arguments are stored in a
    TREE_VEC, which may have length zero.  */
 #define ARGUMENT_PACK_ARGS(NODE)                               \
-  (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK? TREE_TYPE (NODE)    \
-   : TREE_OPERAND (NODE, 0))
+  (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
+   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
 
 /* Set the arguments stored in an argument pack. VALUE must be a
    TREE_VEC.  */
 #define SET_ARGUMENT_PACK_ARGS(NODE,VALUE)     \
-  if (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK)  \
+  if (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK)  \
     TREE_TYPE (NODE) = VALUE;                           \
   else                                                  \
     TREE_OPERAND (NODE, 0) = VALUE
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 8da02de95fb..5071c030f53 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -32563,7 +32563,8 @@ cp_parser_sizeof_pack (cp_parser *parser)
   else if (TREE_CODE (expr) == CONST_DECL)
     expr = DECL_INITIAL (expr);
   expr = make_pack_expansion (expr);
-  PACK_EXPANSION_SIZEOF_P (expr) = true;
+  if (expr != error_mark_node)
+    PACK_EXPANSION_SIZEOF_P (expr) = true;
 
   if (paren)
     parens.require_close (parser);
-- 
2.36.0.63.gf5aaf72f1b


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS
  2022-05-10 13:40 [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Patrick Palka
@ 2022-05-10 13:40 ` Patrick Palka
  2022-05-10 14:17   ` Jason Merrill
  2022-05-10 14:17 ` [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Jason Merrill
  1 sibling, 1 reply; 4+ messages in thread
From: Patrick Palka @ 2022-05-10 13:40 UTC (permalink / raw)
  To: gcc-patches

Unlike in C, in C++ the conditional operator yields an lvalue if both
branches are lvalues, so we can just assign to PACK_EXPANSION_PATTERN
and ARGUMENT_PACK_ARGS directly.

Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
trunk?

gcc/cp/ChangeLog:

	* coroutines.cc (instantiate_coro_traits): Adjust accordingly.
	* cp-tree.h (SET_PACK_EXPANSION_PATTERN): Remove.
	(SET_ARGUMENT_PACK_ARGS): Remove.
	* module.cc (trees_in::tree_node): Adjust accordingly.
	* parser.cc (make_char_string_pack): Likewise.
	(make_string_pack): Likewise.
	* pt.cc (make_pack_expansion): Likewise.
	(template_parm_to_arg): Likewise.
	(coerce_template_parameter_pack): Likewise.
	(extract_fnparm_pack): Likewise.
	(extract_locals_r): Likewise.
	(make_argument_pack): Likewise.
	(tsubst_argument_pack): Likewise.
	(lookup_init_capture_pack): Likewise.
	(type_unification_real): Likewise.
	(unify_pack_expansion): Likewise.
	(tsubst_initializer_list): Likewise.
---
 gcc/cp/coroutines.cc |  2 +-
 gcc/cp/cp-tree.h     | 16 ----------------
 gcc/cp/module.cc     |  4 ++--
 gcc/cp/parser.cc     |  4 ++--
 gcc/cp/pt.cc         | 30 +++++++++++++++---------------
 5 files changed, 20 insertions(+), 36 deletions(-)

diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
index 1d886b31c77..edb3b706ddc 100644
--- a/gcc/cp/coroutines.cc
+++ b/gcc/cp/coroutines.cc
@@ -344,7 +344,7 @@ instantiate_coro_traits (tree fndecl, location_t kw)
     }
 
   tree argtypepack = cxx_make_type (TYPE_ARGUMENT_PACK);
-  SET_ARGUMENT_PACK_ARGS (argtypepack, argtypes);
+  ARGUMENT_PACK_ARGS (argtypepack) = argtypes;
 
   tree targ = make_tree_vec (2);
   TREE_VEC_ELT (targ, 0) = TREE_TYPE (functyp);
diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
index 29fc0e5f829..cfda8337ad8 100644
--- a/gcc/cp/cp-tree.h
+++ b/gcc/cp/cp-tree.h
@@ -3903,14 +3903,6 @@ struct GTY(()) lang_decl {
   (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
    ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
 
-/* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
-   EXPR_PACK_EXPANSION.  */
-#define SET_PACK_EXPANSION_PATTERN(NODE,VALUE)  \
-  if (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION)  \
-    TREE_TYPE (NODE) = VALUE;                   \
-  else                                          \
-    TREE_OPERAND (NODE, 0) = VALUE
-
 /* The list of parameter packs used in the PACK_EXPANSION_* node. The
    TREE_VALUE of each TREE_LIST contains the parameter packs.  */
 #define PACK_EXPANSION_PARAMETER_PACKS(NODE)		\
@@ -3963,14 +3955,6 @@ struct GTY(()) lang_decl {
   (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
    ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
 
-/* Set the arguments stored in an argument pack. VALUE must be a
-   TREE_VEC.  */
-#define SET_ARGUMENT_PACK_ARGS(NODE,VALUE)     \
-  if (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK)  \
-    TREE_TYPE (NODE) = VALUE;                           \
-  else                                                  \
-    TREE_OPERAND (NODE, 0) = VALUE
-
 /* Whether the argument pack is "incomplete", meaning that more
    arguments can still be deduced. Incomplete argument packs are only
    used when the user has provided an explicit template argument list
diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
index bd4771bef72..27b8f64ce75 100644
--- a/gcc/cp/module.cc
+++ b/gcc/cp/module.cc
@@ -9338,7 +9338,7 @@ trees_in::tree_node (bool is_use)
 	    if (!get_overrun ())
 	      {
 		tree pack = cxx_make_type (TYPE_ARGUMENT_PACK);
-		SET_ARGUMENT_PACK_ARGS (pack, res);
+		ARGUMENT_PACK_ARGS (pack) = res;
 		res = pack;
 	      }
 	    break;
@@ -9351,7 +9351,7 @@ trees_in::tree_node (bool is_use)
 		{
 		  tree expn = cxx_make_type (TYPE_PACK_EXPANSION);
 		  SET_TYPE_STRUCTURAL_EQUALITY (expn);
-		  SET_PACK_EXPANSION_PATTERN (expn, res);
+		  PACK_EXPANSION_PATTERN (expn) = res;
 		  PACK_EXPANSION_PARAMETER_PACKS (expn) = param_packs;
 		  PACK_EXPANSION_LOCAL_P (expn) = local;
 		  res = expn;
diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
index 5071c030f53..4ed9feaa427 100644
--- a/gcc/cp/parser.cc
+++ b/gcc/cp/parser.cc
@@ -4649,7 +4649,7 @@ make_char_string_pack (tree value)
     }
 
   /* Build the argument packs.  */
-  SET_ARGUMENT_PACK_ARGS (argpack, charvec);
+  ARGUMENT_PACK_ARGS (argpack) = charvec;
 
   TREE_VEC_ELT (argvec, 0) = argpack;
 
@@ -4684,7 +4684,7 @@ make_string_pack (tree value)
 			    double_int::from_buffer (str + i * sz, sz));
 
   /* Build the argument packs.  */
-  SET_ARGUMENT_PACK_ARGS (argpack, charvec);
+  ARGUMENT_PACK_ARGS (argpack) = charvec;
 
   TREE_VEC_ELT (argvec, 1) = argpack;
 
diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
index 6e666c2cde3..9932d861af6 100644
--- a/gcc/cp/pt.cc
+++ b/gcc/cp/pt.cc
@@ -4219,7 +4219,7 @@ make_pack_expansion (tree arg, tsubst_flags_t complain)
 
       /* Create the pack expansion type for the base type.  */
       purpose = cxx_make_type (TYPE_PACK_EXPANSION);
-      SET_PACK_EXPANSION_PATTERN (purpose, TREE_PURPOSE (arg));
+      PACK_EXPANSION_PATTERN (purpose) = TREE_PURPOSE (arg);
       PACK_EXPANSION_PARAMETER_PACKS (purpose) = parameter_packs;
       PACK_EXPANSION_LOCAL_P (purpose) = at_function_scope_p ();
 
@@ -4237,7 +4237,7 @@ make_pack_expansion (tree arg, tsubst_flags_t complain)
   result = for_types
      ? cxx_make_type (TYPE_PACK_EXPANSION)
      : make_node (EXPR_PACK_EXPANSION);
-  SET_PACK_EXPANSION_PATTERN (result, arg);
+  PACK_EXPANSION_PATTERN (result) = arg;
   if (TREE_CODE (result) == EXPR_PACK_EXPANSION)
     {
       /* Propagate type and const-expression information.  */
@@ -4852,7 +4852,7 @@ template_parm_to_arg (tree t)
 	  TREE_VEC_ELT (vec, 0) = make_pack_expansion (t);
 
 	  t = cxx_make_type (TYPE_ARGUMENT_PACK);
-	  SET_ARGUMENT_PACK_ARGS (t, vec);
+	  ARGUMENT_PACK_ARGS (t) = vec;
 	}
     }
   else
@@ -4869,7 +4869,7 @@ template_parm_to_arg (tree t)
 	  TREE_VEC_ELT (vec, 0) = make_pack_expansion (t);
 
 	  t  = make_node (NONTYPE_ARGUMENT_PACK);
-	  SET_ARGUMENT_PACK_ARGS (t, vec);
+	  ARGUMENT_PACK_ARGS (t) = vec;
 	}
       else
 	t = convert_from_reference (t);
@@ -8718,7 +8718,7 @@ coerce_template_parameter_pack (tree parms,
 	 _DECL as a use rather than a declaration.  */
       tree decl = TREE_VALUE (parm);
       tree exp = cxx_make_type (TYPE_PACK_EXPANSION);
-      SET_PACK_EXPANSION_PATTERN (exp, decl);
+      PACK_EXPANSION_PATTERN (exp) = decl;
       PACK_EXPANSION_PARAMETER_PACKS (exp) = packs;
       SET_TYPE_STRUCTURAL_EQUALITY (exp);
 
@@ -8818,7 +8818,7 @@ coerce_template_parameter_pack (tree parms,
       TREE_CONSTANT (argument_pack) = 1;
     }
 
-  SET_ARGUMENT_PACK_ARGS (argument_pack, packed_args);
+  ARGUMENT_PACK_ARGS (argument_pack) = packed_args;
   if (CHECKING_P)
     SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (packed_args,
 					 TREE_VEC_LENGTH (packed_args));
@@ -12460,7 +12460,7 @@ extract_fnparm_pack (tree tmpl_parm, tree *spec_p)
 	}
 
       /* Build the argument packs.  */
-      SET_ARGUMENT_PACK_ARGS (argpack, parmvec);
+      ARGUMENT_PACK_ARGS (argpack) = parmvec;
     }
   *spec_p = spec_parm;
 
@@ -13023,7 +13023,7 @@ extract_locals_r (tree *tp, int */*walk_subtrees*/, void *data_)
 			{
 			  spec = copy_node (spec);
 			  args = copy_node (args);
-			  SET_ARGUMENT_PACK_ARGS (spec, args);
+			  ARGUMENT_PACK_ARGS (spec) = args;
 			  register_local_specialization (spec, *tp);
 			}
 		      TREE_VEC_ELT (args, i) = carg;
@@ -13410,7 +13410,7 @@ make_argument_pack (tree vec)
       pack = make_node (NONTYPE_ARGUMENT_PACK);
       TREE_CONSTANT (pack) = 1;
     }
-  SET_ARGUMENT_PACK_ARGS (pack, vec);
+  ARGUMENT_PACK_ARGS (pack) = vec;
   return pack;
 }
 
@@ -13463,7 +13463,7 @@ tsubst_argument_pack (tree orig_arg, tree args, tsubst_flags_t complain,
 	  TREE_CONSTANT (new_arg) = TREE_CONSTANT (orig_arg);
 	}
 
-      SET_ARGUMENT_PACK_ARGS (new_arg, pack_args);
+      ARGUMENT_PACK_ARGS (new_arg) = pack_args;
     }
 
   return new_arg;
@@ -18442,7 +18442,7 @@ lookup_init_capture_pack (tree decl)
       len = TREE_VEC_LENGTH (fpack);
       vec = make_tree_vec (len);
       r = make_node (NONTYPE_ARGUMENT_PACK);
-      SET_ARGUMENT_PACK_ARGS (r, vec);
+      ARGUMENT_PACK_ARGS (r) = vec;
     }
   for (int i = 0; i < len; ++i)
     {
@@ -22911,7 +22911,7 @@ type_unification_real (tree tparms,
 	      else
 		arg = cxx_make_type (TYPE_ARGUMENT_PACK);
 
-	      SET_ARGUMENT_PACK_ARGS (arg, make_tree_vec (0));
+	      ARGUMENT_PACK_ARGS (arg) = make_tree_vec (0);
 
 	      TREE_VEC_ELT (targs, i) = arg;
 	      continue;
@@ -23771,7 +23771,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
           else
 	    result = cxx_make_type (TYPE_ARGUMENT_PACK);
 
-          SET_ARGUMENT_PACK_ARGS (result, new_args);
+	  ARGUMENT_PACK_ARGS (result) = new_args;
 
           /* Note the deduced argument packs for this parameter
              pack.  */
@@ -23785,7 +23785,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
              now we have a complete set of arguments.  */
           tree explicit_args = ARGUMENT_PACK_EXPLICIT_ARGS (old_pack);
 
-          SET_ARGUMENT_PACK_ARGS (old_pack, new_args);
+	  ARGUMENT_PACK_ARGS (old_pack) = new_args;
           ARGUMENT_PACK_INCOMPLETE_P (old_pack) = 1;
           ARGUMENT_PACK_EXPLICIT_ARGS (old_pack) = explicit_args;
         }
@@ -26899,7 +26899,7 @@ tsubst_initializer_list (tree t, tree argvec)
 		  else
 		    {
 		      value = expr;
-		      SET_PACK_EXPANSION_PATTERN (value, TREE_VALUE (arg));
+		      PACK_EXPANSION_PATTERN (value) = TREE_VALUE (arg);
 		    }
 		  expanded_exprs
 		    = tsubst_pack_expansion (value, argvec,
-- 
2.36.0.63.gf5aaf72f1b


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros
  2022-05-10 13:40 [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Patrick Palka
  2022-05-10 13:40 ` [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS Patrick Palka
@ 2022-05-10 14:17 ` Jason Merrill
  1 sibling, 0 replies; 4+ messages in thread
From: Jason Merrill @ 2022-05-10 14:17 UTC (permalink / raw)
  To: Patrick Palka, gcc-patches

On 5/10/22 09:40, Patrick Palka wrote:
> The accessor macros for TYPE_PACK_EXPANSION/EXPR_PACK_EXPANSION
> and TYPE_ARGUMENT_PACK/NONTYPE_ARGUMENT_PACK should check the
> tree code of the argument.
> 
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk?

OK.

> gcc/cp/ChangeLog:
> 
> 	* cp-tree.h (PACK_EXPANSION_CHECK): Define.
> 	(PACK_EXPANSION_PATTERN): Use PACK_EXPANSION_CHECK.
> 	(SET_PACK_EXPANSION_PATTERN): Likewise.
> 	(PACK_EXPANSION_PARAMETER_PACKS): Likewise.
> 	(PACK_EXPANSION_EXTRA_ARGS): Likewise.
> 	(PACK_EXPANSION_LOCAL_P): Likewise.
> 	(PACK_EXPANSION_SIZEOF_P): Likewise.
> 	(PACK_EXPANSION_AUTO_P): Likewise.
> 	(PACK_EXPANSION_FORCE_EXTRA_ARGS_P): Likewise.
> 	(ARGUMENT_PACK_CHECK): Define.
> 	(ARGUMENT_PACK_ARGS): Use ARGUMENT_PACK_CHECK.
> 	(SET_ARGUMENT_PACK_ARGS): Likewise.
> 	* parser.c (cp_parser_sizeof_pack): Check for error_mark_node
> 	before setting PACK_EXPANSION_SIZEOF_P.
> ---
>   gcc/cp/cp-tree.h | 34 ++++++++++++++++++++++------------
>   gcc/cp/parser.cc |  3 ++-
>   2 files changed, 24 insertions(+), 13 deletions(-)
> 
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index 8a5057a4dff..29fc0e5f829 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -3894,16 +3894,19 @@ struct GTY(()) lang_decl {
>     (TREE_CODE (NODE) == TYPE_PACK_EXPANSION     \
>      || TREE_CODE (NODE) == EXPR_PACK_EXPANSION)
>   
> +#define PACK_EXPANSION_CHECK(NODE) \
> +  TREE_CHECK2 (NODE, TYPE_PACK_EXPANSION, EXPR_PACK_EXPANSION)
> +
>   /* Extracts the type or expression pattern from a TYPE_PACK_EXPANSION or
>      EXPR_PACK_EXPANSION.  */
>   #define PACK_EXPANSION_PATTERN(NODE)                            \
> -  (TREE_CODE (NODE) == TYPE_PACK_EXPANSION ? TREE_TYPE (NODE)    \
> -   : TREE_OPERAND (NODE, 0))
> +  (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
> +   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
>   
>   /* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
>      EXPR_PACK_EXPANSION.  */
>   #define SET_PACK_EXPANSION_PATTERN(NODE,VALUE)  \
> -  if (TREE_CODE (NODE) == TYPE_PACK_EXPANSION)  \
> +  if (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION)  \
>       TREE_TYPE (NODE) = VALUE;                   \
>     else                                          \
>       TREE_OPERAND (NODE, 0) = VALUE
> @@ -3911,7 +3914,7 @@ struct GTY(()) lang_decl {
>   /* The list of parameter packs used in the PACK_EXPANSION_* node. The
>      TREE_VALUE of each TREE_LIST contains the parameter packs.  */
>   #define PACK_EXPANSION_PARAMETER_PACKS(NODE)		\
> -  *(TREE_CODE (NODE) == EXPR_PACK_EXPANSION		\
> +  *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == EXPR_PACK_EXPANSION \
>       ? &TREE_OPERAND (NODE, 1)				\
>       : &TYPE_MIN_VALUE_RAW (TYPE_PACK_EXPANSION_CHECK (NODE)))
>   
> @@ -3922,22 +3925,26 @@ struct GTY(()) lang_decl {
>      are enclosing functions that provided function parameter packs we'll need
>      to map appropriately.  */
>   #define PACK_EXPANSION_EXTRA_ARGS(NODE)		\
> -  *(TREE_CODE (NODE) == TYPE_PACK_EXPANSION	\
> +  *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
>       ? &TYPE_MAX_VALUE_RAW (NODE)			\
>       : &TREE_OPERAND ((NODE), 2))
>   
>   /* True iff this pack expansion is within a function context.  */
> -#define PACK_EXPANSION_LOCAL_P(NODE) TREE_LANG_FLAG_0 (NODE)
> +#define PACK_EXPANSION_LOCAL_P(NODE) \
> +  TREE_LANG_FLAG_0 (PACK_EXPANSION_CHECK (NODE))
>   
>   /* True iff this pack expansion is for sizeof....  */
> -#define PACK_EXPANSION_SIZEOF_P(NODE) TREE_LANG_FLAG_1 (NODE)
> +#define PACK_EXPANSION_SIZEOF_P(NODE) \
> +  TREE_LANG_FLAG_1 (PACK_EXPANSION_CHECK (NODE))
>   
>   /* True iff this pack expansion is for auto... in lambda init-capture.  */
> -#define PACK_EXPANSION_AUTO_P(NODE) TREE_LANG_FLAG_2 (NODE)
> +#define PACK_EXPANSION_AUTO_P(NODE) \
> +  TREE_LANG_FLAG_2 (PACK_EXPANSION_CHECK (NODE))
>   
>   /* True if we must use PACK_EXPANSION_EXTRA_ARGS and avoid partial
>      instantiation of this pack expansion.  */
> -#define PACK_EXPANSION_FORCE_EXTRA_ARGS_P(NODE) TREE_LANG_FLAG_3 (NODE)
> +#define PACK_EXPANSION_FORCE_EXTRA_ARGS_P(NODE) \
> +  TREE_LANG_FLAG_3 (PACK_EXPANSION_CHECK (NODE))
>   
>   /* True iff the wildcard can match a template parameter pack.  */
>   #define WILDCARD_PACK_P(NODE) TREE_LANG_FLAG_0 (NODE)
> @@ -3947,16 +3954,19 @@ struct GTY(()) lang_decl {
>     (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK              \
>      || TREE_CODE (NODE) == NONTYPE_ARGUMENT_PACK)
>   
> +#define ARGUMENT_PACK_CHECK(NODE) \
> +  TREE_CHECK2 (NODE, TYPE_ARGUMENT_PACK, NONTYPE_ARGUMENT_PACK)
> +
>   /* The arguments stored in an argument pack. Arguments are stored in a
>      TREE_VEC, which may have length zero.  */
>   #define ARGUMENT_PACK_ARGS(NODE)                               \
> -  (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK? TREE_TYPE (NODE)    \
> -   : TREE_OPERAND (NODE, 0))
> +  (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
> +   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
>   
>   /* Set the arguments stored in an argument pack. VALUE must be a
>      TREE_VEC.  */
>   #define SET_ARGUMENT_PACK_ARGS(NODE,VALUE)     \
> -  if (TREE_CODE (NODE) == TYPE_ARGUMENT_PACK)  \
> +  if (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK)  \
>       TREE_TYPE (NODE) = VALUE;                           \
>     else                                                  \
>       TREE_OPERAND (NODE, 0) = VALUE
> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> index 8da02de95fb..5071c030f53 100644
> --- a/gcc/cp/parser.cc
> +++ b/gcc/cp/parser.cc
> @@ -32563,7 +32563,8 @@ cp_parser_sizeof_pack (cp_parser *parser)
>     else if (TREE_CODE (expr) == CONST_DECL)
>       expr = DECL_INITIAL (expr);
>     expr = make_pack_expansion (expr);
> -  PACK_EXPANSION_SIZEOF_P (expr) = true;
> +  if (expr != error_mark_node)
> +    PACK_EXPANSION_SIZEOF_P (expr) = true;
>   
>     if (paren)
>       parens.require_close (parser);


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS
  2022-05-10 13:40 ` [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS Patrick Palka
@ 2022-05-10 14:17   ` Jason Merrill
  0 siblings, 0 replies; 4+ messages in thread
From: Jason Merrill @ 2022-05-10 14:17 UTC (permalink / raw)
  To: Patrick Palka, gcc-patches

On 5/10/22 09:40, Patrick Palka wrote:
> Unlike in C, in C++ the conditional operator yields an lvalue if both
> branches are lvalues, so we can just assign to PACK_EXPANSION_PATTERN
> and ARGUMENT_PACK_ARGS directly.
> 
> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for
> trunk?

OK.

> gcc/cp/ChangeLog:
> 
> 	* coroutines.cc (instantiate_coro_traits): Adjust accordingly.
> 	* cp-tree.h (SET_PACK_EXPANSION_PATTERN): Remove.
> 	(SET_ARGUMENT_PACK_ARGS): Remove.
> 	* module.cc (trees_in::tree_node): Adjust accordingly.
> 	* parser.cc (make_char_string_pack): Likewise.
> 	(make_string_pack): Likewise.
> 	* pt.cc (make_pack_expansion): Likewise.
> 	(template_parm_to_arg): Likewise.
> 	(coerce_template_parameter_pack): Likewise.
> 	(extract_fnparm_pack): Likewise.
> 	(extract_locals_r): Likewise.
> 	(make_argument_pack): Likewise.
> 	(tsubst_argument_pack): Likewise.
> 	(lookup_init_capture_pack): Likewise.
> 	(type_unification_real): Likewise.
> 	(unify_pack_expansion): Likewise.
> 	(tsubst_initializer_list): Likewise.
> ---
>   gcc/cp/coroutines.cc |  2 +-
>   gcc/cp/cp-tree.h     | 16 ----------------
>   gcc/cp/module.cc     |  4 ++--
>   gcc/cp/parser.cc     |  4 ++--
>   gcc/cp/pt.cc         | 30 +++++++++++++++---------------
>   5 files changed, 20 insertions(+), 36 deletions(-)
> 
> diff --git a/gcc/cp/coroutines.cc b/gcc/cp/coroutines.cc
> index 1d886b31c77..edb3b706ddc 100644
> --- a/gcc/cp/coroutines.cc
> +++ b/gcc/cp/coroutines.cc
> @@ -344,7 +344,7 @@ instantiate_coro_traits (tree fndecl, location_t kw)
>       }
>   
>     tree argtypepack = cxx_make_type (TYPE_ARGUMENT_PACK);
> -  SET_ARGUMENT_PACK_ARGS (argtypepack, argtypes);
> +  ARGUMENT_PACK_ARGS (argtypepack) = argtypes;
>   
>     tree targ = make_tree_vec (2);
>     TREE_VEC_ELT (targ, 0) = TREE_TYPE (functyp);
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index 29fc0e5f829..cfda8337ad8 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -3903,14 +3903,6 @@ struct GTY(()) lang_decl {
>     (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
>      ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
>   
> -/* Sets the type or expression pattern for a TYPE_PACK_EXPANSION or
> -   EXPR_PACK_EXPANSION.  */
> -#define SET_PACK_EXPANSION_PATTERN(NODE,VALUE)  \
> -  if (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION)  \
> -    TREE_TYPE (NODE) = VALUE;                   \
> -  else                                          \
> -    TREE_OPERAND (NODE, 0) = VALUE
> -
>   /* The list of parameter packs used in the PACK_EXPANSION_* node. The
>      TREE_VALUE of each TREE_LIST contains the parameter packs.  */
>   #define PACK_EXPANSION_PARAMETER_PACKS(NODE)		\
> @@ -3963,14 +3955,6 @@ struct GTY(()) lang_decl {
>     (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
>      ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
>   
> -/* Set the arguments stored in an argument pack. VALUE must be a
> -   TREE_VEC.  */
> -#define SET_ARGUMENT_PACK_ARGS(NODE,VALUE)     \
> -  if (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK)  \
> -    TREE_TYPE (NODE) = VALUE;                           \
> -  else                                                  \
> -    TREE_OPERAND (NODE, 0) = VALUE
> -
>   /* Whether the argument pack is "incomplete", meaning that more
>      arguments can still be deduced. Incomplete argument packs are only
>      used when the user has provided an explicit template argument list
> diff --git a/gcc/cp/module.cc b/gcc/cp/module.cc
> index bd4771bef72..27b8f64ce75 100644
> --- a/gcc/cp/module.cc
> +++ b/gcc/cp/module.cc
> @@ -9338,7 +9338,7 @@ trees_in::tree_node (bool is_use)
>   	    if (!get_overrun ())
>   	      {
>   		tree pack = cxx_make_type (TYPE_ARGUMENT_PACK);
> -		SET_ARGUMENT_PACK_ARGS (pack, res);
> +		ARGUMENT_PACK_ARGS (pack) = res;
>   		res = pack;
>   	      }
>   	    break;
> @@ -9351,7 +9351,7 @@ trees_in::tree_node (bool is_use)
>   		{
>   		  tree expn = cxx_make_type (TYPE_PACK_EXPANSION);
>   		  SET_TYPE_STRUCTURAL_EQUALITY (expn);
> -		  SET_PACK_EXPANSION_PATTERN (expn, res);
> +		  PACK_EXPANSION_PATTERN (expn) = res;
>   		  PACK_EXPANSION_PARAMETER_PACKS (expn) = param_packs;
>   		  PACK_EXPANSION_LOCAL_P (expn) = local;
>   		  res = expn;
> diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc
> index 5071c030f53..4ed9feaa427 100644
> --- a/gcc/cp/parser.cc
> +++ b/gcc/cp/parser.cc
> @@ -4649,7 +4649,7 @@ make_char_string_pack (tree value)
>       }
>   
>     /* Build the argument packs.  */
> -  SET_ARGUMENT_PACK_ARGS (argpack, charvec);
> +  ARGUMENT_PACK_ARGS (argpack) = charvec;
>   
>     TREE_VEC_ELT (argvec, 0) = argpack;
>   
> @@ -4684,7 +4684,7 @@ make_string_pack (tree value)
>   			    double_int::from_buffer (str + i * sz, sz));
>   
>     /* Build the argument packs.  */
> -  SET_ARGUMENT_PACK_ARGS (argpack, charvec);
> +  ARGUMENT_PACK_ARGS (argpack) = charvec;
>   
>     TREE_VEC_ELT (argvec, 1) = argpack;
>   
> diff --git a/gcc/cp/pt.cc b/gcc/cp/pt.cc
> index 6e666c2cde3..9932d861af6 100644
> --- a/gcc/cp/pt.cc
> +++ b/gcc/cp/pt.cc
> @@ -4219,7 +4219,7 @@ make_pack_expansion (tree arg, tsubst_flags_t complain)
>   
>         /* Create the pack expansion type for the base type.  */
>         purpose = cxx_make_type (TYPE_PACK_EXPANSION);
> -      SET_PACK_EXPANSION_PATTERN (purpose, TREE_PURPOSE (arg));
> +      PACK_EXPANSION_PATTERN (purpose) = TREE_PURPOSE (arg);
>         PACK_EXPANSION_PARAMETER_PACKS (purpose) = parameter_packs;
>         PACK_EXPANSION_LOCAL_P (purpose) = at_function_scope_p ();
>   
> @@ -4237,7 +4237,7 @@ make_pack_expansion (tree arg, tsubst_flags_t complain)
>     result = for_types
>        ? cxx_make_type (TYPE_PACK_EXPANSION)
>        : make_node (EXPR_PACK_EXPANSION);
> -  SET_PACK_EXPANSION_PATTERN (result, arg);
> +  PACK_EXPANSION_PATTERN (result) = arg;
>     if (TREE_CODE (result) == EXPR_PACK_EXPANSION)
>       {
>         /* Propagate type and const-expression information.  */
> @@ -4852,7 +4852,7 @@ template_parm_to_arg (tree t)
>   	  TREE_VEC_ELT (vec, 0) = make_pack_expansion (t);
>   
>   	  t = cxx_make_type (TYPE_ARGUMENT_PACK);
> -	  SET_ARGUMENT_PACK_ARGS (t, vec);
> +	  ARGUMENT_PACK_ARGS (t) = vec;
>   	}
>       }
>     else
> @@ -4869,7 +4869,7 @@ template_parm_to_arg (tree t)
>   	  TREE_VEC_ELT (vec, 0) = make_pack_expansion (t);
>   
>   	  t  = make_node (NONTYPE_ARGUMENT_PACK);
> -	  SET_ARGUMENT_PACK_ARGS (t, vec);
> +	  ARGUMENT_PACK_ARGS (t) = vec;
>   	}
>         else
>   	t = convert_from_reference (t);
> @@ -8718,7 +8718,7 @@ coerce_template_parameter_pack (tree parms,
>   	 _DECL as a use rather than a declaration.  */
>         tree decl = TREE_VALUE (parm);
>         tree exp = cxx_make_type (TYPE_PACK_EXPANSION);
> -      SET_PACK_EXPANSION_PATTERN (exp, decl);
> +      PACK_EXPANSION_PATTERN (exp) = decl;
>         PACK_EXPANSION_PARAMETER_PACKS (exp) = packs;
>         SET_TYPE_STRUCTURAL_EQUALITY (exp);
>   
> @@ -8818,7 +8818,7 @@ coerce_template_parameter_pack (tree parms,
>         TREE_CONSTANT (argument_pack) = 1;
>       }
>   
> -  SET_ARGUMENT_PACK_ARGS (argument_pack, packed_args);
> +  ARGUMENT_PACK_ARGS (argument_pack) = packed_args;
>     if (CHECKING_P)
>       SET_NON_DEFAULT_TEMPLATE_ARGS_COUNT (packed_args,
>   					 TREE_VEC_LENGTH (packed_args));
> @@ -12460,7 +12460,7 @@ extract_fnparm_pack (tree tmpl_parm, tree *spec_p)
>   	}
>   
>         /* Build the argument packs.  */
> -      SET_ARGUMENT_PACK_ARGS (argpack, parmvec);
> +      ARGUMENT_PACK_ARGS (argpack) = parmvec;
>       }
>     *spec_p = spec_parm;
>   
> @@ -13023,7 +13023,7 @@ extract_locals_r (tree *tp, int */*walk_subtrees*/, void *data_)
>   			{
>   			  spec = copy_node (spec);
>   			  args = copy_node (args);
> -			  SET_ARGUMENT_PACK_ARGS (spec, args);
> +			  ARGUMENT_PACK_ARGS (spec) = args;
>   			  register_local_specialization (spec, *tp);
>   			}
>   		      TREE_VEC_ELT (args, i) = carg;
> @@ -13410,7 +13410,7 @@ make_argument_pack (tree vec)
>         pack = make_node (NONTYPE_ARGUMENT_PACK);
>         TREE_CONSTANT (pack) = 1;
>       }
> -  SET_ARGUMENT_PACK_ARGS (pack, vec);
> +  ARGUMENT_PACK_ARGS (pack) = vec;
>     return pack;
>   }
>   
> @@ -13463,7 +13463,7 @@ tsubst_argument_pack (tree orig_arg, tree args, tsubst_flags_t complain,
>   	  TREE_CONSTANT (new_arg) = TREE_CONSTANT (orig_arg);
>   	}
>   
> -      SET_ARGUMENT_PACK_ARGS (new_arg, pack_args);
> +      ARGUMENT_PACK_ARGS (new_arg) = pack_args;
>       }
>   
>     return new_arg;
> @@ -18442,7 +18442,7 @@ lookup_init_capture_pack (tree decl)
>         len = TREE_VEC_LENGTH (fpack);
>         vec = make_tree_vec (len);
>         r = make_node (NONTYPE_ARGUMENT_PACK);
> -      SET_ARGUMENT_PACK_ARGS (r, vec);
> +      ARGUMENT_PACK_ARGS (r) = vec;
>       }
>     for (int i = 0; i < len; ++i)
>       {
> @@ -22911,7 +22911,7 @@ type_unification_real (tree tparms,
>   	      else
>   		arg = cxx_make_type (TYPE_ARGUMENT_PACK);
>   
> -	      SET_ARGUMENT_PACK_ARGS (arg, make_tree_vec (0));
> +	      ARGUMENT_PACK_ARGS (arg) = make_tree_vec (0);
>   
>   	      TREE_VEC_ELT (targs, i) = arg;
>   	      continue;
> @@ -23771,7 +23771,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
>             else
>   	    result = cxx_make_type (TYPE_ARGUMENT_PACK);
>   
> -          SET_ARGUMENT_PACK_ARGS (result, new_args);
> +	  ARGUMENT_PACK_ARGS (result) = new_args;
>   
>             /* Note the deduced argument packs for this parameter
>                pack.  */
> @@ -23785,7 +23785,7 @@ unify_pack_expansion (tree tparms, tree targs, tree packed_parms,
>                now we have a complete set of arguments.  */
>             tree explicit_args = ARGUMENT_PACK_EXPLICIT_ARGS (old_pack);
>   
> -          SET_ARGUMENT_PACK_ARGS (old_pack, new_args);
> +	  ARGUMENT_PACK_ARGS (old_pack) = new_args;
>             ARGUMENT_PACK_INCOMPLETE_P (old_pack) = 1;
>             ARGUMENT_PACK_EXPLICIT_ARGS (old_pack) = explicit_args;
>           }
> @@ -26899,7 +26899,7 @@ tsubst_initializer_list (tree t, tree argvec)
>   		  else
>   		    {
>   		      value = expr;
> -		      SET_PACK_EXPANSION_PATTERN (value, TREE_VALUE (arg));
> +		      PACK_EXPANSION_PATTERN (value) = TREE_VALUE (arg);
>   		    }
>   		  expanded_exprs
>   		    = tsubst_pack_expansion (value, argvec,


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2022-05-10 14:17 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-05-10 13:40 [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Patrick Palka
2022-05-10 13:40 ` [PATCH 2/2] c++: Remove SET_PACK_EXPANSION_PATTERN / SET_ARGUMENT_PACK_ARGS Patrick Palka
2022-05-10 14:17   ` Jason Merrill
2022-05-10 14:17 ` [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Jason Merrill

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).