On Wed, 10 Sep 2025, Patrick Palka wrote:

> Bootstrapped and regtested on x86_64-pc-linux-gnu, does this
> look OK for trunk?
> 
> -- >8 --
> 
> Some accessor macros unintentionally accept more kinds of nodes than
> they should, e.g. PACK_EXPANSION_PATTERN accepts any EXPR_P node.

Oops, disregard this patch -- these macros are already properly
hardened.  Somehow I completely missed the PACK_EXPANSION_CHECK in
PACK_EXPANSION_PATTERN etc.

> 
> gcc/cp/ChangeLog:
> 
>       * cp-tree.h (PACK_EXPANSION_PATTERN): Assert that NODE is
>       either a TYPE_PACK_EXPANSION or EXPR_PACK_EXPANSION.
>       (PACK_EXPANSION_EXTRA_ARGS): Likewise.
>       (PACK_INDEX_PACK): Assert that NODE is either a PACK_INDEX_TYPE
>       or PACK_INDEX_EXPR.
>       (PACK_INDEX_INDEX): Likewise.
>       (ARGUMENT_PACK_ARGS): Assert that NODE is either a
>       TYPE_ARGUMENT_PACK or NONTYPE_ARGUMENT_PACK.
>       (TYPE_PTRMEMFUNC_FN_TYPE): Assert that TYPE_PTRMEMFUNC_P is true
>       for NODE.
> ---
>  gcc/cp/cp-tree.h | 13 +++++++------
>  1 file changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/gcc/cp/cp-tree.h b/gcc/cp/cp-tree.h
> index d531bcd833b3..14c2f5be6360 100644
> --- a/gcc/cp/cp-tree.h
> +++ b/gcc/cp/cp-tree.h
> @@ -4168,7 +4168,7 @@ struct GTY(()) lang_decl {
>     EXPR_PACK_EXPANSION.  */
>  #define PACK_EXPANSION_PATTERN(NODE)                            \
>    (TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
> -   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
> +   ? TREE_TYPE (NODE) : TREE_OPERAND (EXPR_PACK_EXPANSION_CHECK (NODE), 0))
>  
>  /* The list of parameter packs used in the PACK_EXPANSION_* node. The
>     TREE_VALUE of each TREE_LIST contains the parameter packs.  */
> @@ -4186,7 +4186,7 @@ struct GTY(()) lang_decl {
>  #define PACK_EXPANSION_EXTRA_ARGS(NODE)              \
>    *(TREE_CODE (PACK_EXPANSION_CHECK (NODE)) == TYPE_PACK_EXPANSION \
>      ? &TYPE_MAX_VALUE_RAW (NODE)                     \
> -    : &TREE_OPERAND ((NODE), 2))
> +    : &TREE_OPERAND (EXPR_PACK_EXPANSION_CHECK (NODE), 2))
>  
>  /* True if NODE is a pack index.  */
>  #define PACK_INDEX_P(NODE)                 \
> @@ -4196,13 +4196,13 @@ struct GTY(()) lang_decl {
>  /* For a pack index T...[N], the pack expansion 'T...'.  */
>  #define PACK_INDEX_PACK(NODE) \
>    (TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \
> -   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
> +   ? TREE_TYPE (NODE) : TREE_OPERAND (PACK_INDEX_EXPR_CHECK (NODE), 0))
>  
>  /* For a pack index T...[N], the index N.  */
>  #define PACK_INDEX_INDEX(NODE) \
>    *(TREE_CODE (PACK_INDEX_CHECK (NODE)) == PACK_INDEX_TYPE \
>      ? &TYPE_MAX_VALUE_RAW (NODE)                     \
> -    : &TREE_OPERAND ((NODE), 1))
> +    : &TREE_OPERAND (PACK_INDEX_EXPR_CHECK (NODE), 1))
>  
>  /* True iff this pack expansion is within a function context.  */
>  #define PACK_EXPANSION_LOCAL_P(NODE) \
> @@ -4238,7 +4238,7 @@ struct GTY(()) lang_decl {
>     TREE_VEC, which may have length zero.  */
>  #define ARGUMENT_PACK_ARGS(NODE)                               \
>    (TREE_CODE (ARGUMENT_PACK_CHECK (NODE)) == TYPE_ARGUMENT_PACK \
> -   ? TREE_TYPE (NODE) : TREE_OPERAND (NODE, 0))
> +   ? TREE_TYPE (NODE) : TREE_OPERAND (NONTYPE_ARGUMENT_PACK_CHECK (NODE), 0))
>  
>  /* Whether the argument pack is "incomplete", meaning that more
>     arguments can still be deduced. Incomplete argument packs are only
> @@ -5074,7 +5074,8 @@ get_vec_init_expr (tree t)
>     pointer to member function.  TYPE_PTRMEMFUNC_P _must_ be true,
>     before using this macro.  */
>  #define TYPE_PTRMEMFUNC_FN_TYPE(NODE) \
> -  (cp_build_qualified_type (TREE_TYPE (TYPE_FIELDS (NODE)),\
> +  (gcc_checking_assert (TYPE_PTRMEMFUNC_P (NODE)), \
> +   cp_build_qualified_type (TREE_TYPE (TYPE_FIELDS (NODE)),\
>                           cp_type_quals (NODE)))
>  
>  /* As above, but can be used in places that want an lvalue at the expense
> -- 
> 2.51.0.193.g4975ec3473
> 
> 

Reply via email to