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

Reply via email to