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