From patchwork Tue May 10 13:40:36 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Patrick Palka X-Patchwork-Id: 53736 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 795313898538 for ; Tue, 10 May 2022 13:41:11 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 795313898538 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1652190071; bh=exAwbSdMkjipxLewBMX74KGPVOjEjAkhmhYEHWNg4lc=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=m4AYA2lfAhGu4CI+kEbAutMNtl9XnmJl2mUGCXnOEtCFQeaTNjrTOCJj4J3SZQg+0 AE80BLr9s5z9Jixf7Lb2tZe73aBe1dPtOpAcbMMHeIJOoLqTIYlHcQakmAztPcp7PH aeKGkWc7LgvK7JrdXC6K0c7hE8czacAYU8/4s7BY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id D669F385DC2D for ; Tue, 10 May 2022 13:40:41 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org D669F385DC2D Received: from mail-qk1-f198.google.com (mail-qk1-f198.google.com [209.85.222.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-387-ATS-8ZKdMWeZeAezYWGo9w-1; Tue, 10 May 2022 09:40:40 -0400 X-MC-Unique: ATS-8ZKdMWeZeAezYWGo9w-1 Received: by mail-qk1-f198.google.com with SMTP id y140-20020a376492000000b0069f7e985c95so10723431qkb.15 for ; Tue, 10 May 2022 06:40:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=exAwbSdMkjipxLewBMX74KGPVOjEjAkhmhYEHWNg4lc=; b=Y+wtdVXH42SPb9BVp8df9Bsr5BP4Z6fvKEjGhZFzE2ED0dkKiIGFsvsHqqLOAWoLNt O5iqjI4e2ClcmooaN2egQ4DUvkLdn1XAnYRM/8SHKVO3hqQOOFHogELT/Jtkqwmg0Rp/ gw+NROsWkJX4MiB1Zo8O4C0i1CKcqnzIEsR6OQ8sMdHW1dFJl/UPiFgzx4JHo+XjGNQw xGSlXtWs5UGVH8srApSmfExFfqkeFCWxv/PkPR05qmLar3mxzuspp7fwClGHP4Nwi2H0 du4H9xzgUGj7JWvG3XMG6FyHfKum88oTU1ZeKb41y3JwgcbNIYbmBgdZMPKTW5pqJIL9 T6qg== X-Gm-Message-State: AOAM532U0cNfNf9cYrHSpnaev4WKmKZKJmFdpW1S2vHbIOYe6puTOKz6 lGC7qO9xSt3v2xvpyDnpPlNmEbdJBvil1VWv/iCgwaQF7bgUaj0KnYVtPt9kvb29h7qYKsJv5B5 7RZuNh70gWuIxrrImZYHKslfsZDY3Jkg/NYVW6OUUUn3p3ArMpcecOCMGiUrUJOHW6YA= X-Received: by 2002:a37:4454:0:b0:69f:c339:e2dc with SMTP id r81-20020a374454000000b0069fc339e2dcmr14464221qka.771.1652190039772; Tue, 10 May 2022 06:40:39 -0700 (PDT) X-Google-Smtp-Source: ABdhPJydUZ5wX0RSywP2+nsEF9qkkEhze6TzQDEWni5HHcsrQ4Q7zmIgsiJn85XO7h8dsVc5echJIA== X-Received: by 2002:a37:4454:0:b0:69f:c339:e2dc with SMTP id r81-20020a374454000000b0069fc339e2dcmr14464198qka.771.1652190039425; Tue, 10 May 2022 06:40:39 -0700 (PDT) Received: from localhost.localdomain (ool-457670bb.dyn.optonline.net. [69.118.112.187]) by smtp.gmail.com with ESMTPSA id o7-20020a05620a110700b0069fc13ce205sm8424219qkk.54.2022.05.10.06.40.38 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 May 2022 06:40:39 -0700 (PDT) To: gcc-patches@gcc.gnu.org Subject: [PATCH 1/2] c++: Harden *_PACK_EXPANSION and *_ARGUMENT_PACK macros Date: Tue, 10 May 2022 09:40:36 -0400 Message-Id: <20220510134037.628893-1-ppalka@redhat.com> X-Mailer: git-send-email 2.36.0.63.gf5aaf72f1b MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-14.6 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE, UPPERCASE_50_75 autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Patrick Palka via Gcc-patches From: Patrick Palka Reply-To: Patrick Palka Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" The accessor macros for TYPE_PACK_EXPANSION/EXPR_PACK_EXPANSION and TYPE_ARGUMENT_PACK/NONTYPE_ARGUMENT_PACK should check the tree code of the argument. Bootstrapped and regtested on x86_64-pc-linux-gnu, does this look OK for trunk? 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.c (cp_parser_sizeof_pack): Check for error_mark_node before setting PACK_EXPANSION_SIZEOF_P. --- gcc/cp/cp-tree.h | 34 ++++++++++++++++++++++------------ 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 8a5057a4dff..29fc0e5f829 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 8da02de95fb..5071c030f53 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);