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