diff options
author | Patrick Palka <ppalka@redhat.com> | 2022-05-10 11:52:21 -0400 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2022-05-10 11:52:21 -0400 |
commit | dc6c96f0707aba6c2c94f41f3ccd0713381e372c (patch) | |
tree | bf4d7b5524538bbfdc05d989c77e5efa06677b7c | |
parent | ca97c87758d450a946cac31b0db43da0039fabf1 (diff) | |
download | gcc-dc6c96f0707aba6c2c94f41f3ccd0713381e372c.zip gcc-dc6c96f0707aba6c2c94f41f3ccd0713381e372c.tar.gz gcc-dc6c96f0707aba6c2c94f41f3ccd0713381e372c.tar.bz2 |
c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros
This makes the accessor macros for TYPE_/EXPR_PACK_EXPANSION
and TYPE_/NONTYPE_ARGUMENT_PACK check the tree code of the argument.
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.cc (cp_parser_sizeof_pack): Check for error_mark_node
before setting PACK_EXPANSION_SIZEOF_P.
-rw-r--r-- | gcc/cp/cp-tree.h | 34 | ||||
-rw-r--r-- | 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 8a5057a..29fc0e5 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 8da02de..5071c03 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); |