From patchwork Mon Aug 8 19:06:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Polacek X-Patchwork-Id: 431 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:6a10:20da:b0:2d3:3019:e567 with SMTP id n26csp2043362pxc; Mon, 8 Aug 2022 12:07:32 -0700 (PDT) X-Google-Smtp-Source: AA6agR4TZ7NJ/0Q/D9mIgUwJRm6NJXyhPq+VeLYJm+d2q3VPMN1oHDGD1U4TEHlIGZcFLHUhB+46 X-Received: by 2002:a17:907:1629:b0:730:7d10:639c with SMTP id hb41-20020a170907162900b007307d10639cmr13875139ejc.256.1659985652500; Mon, 08 Aug 2022 12:07:32 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659985652; cv=none; d=google.com; s=arc-20160816; b=DpI41cegx4Hqs08Nv/XJzSM664lsk/8A7aAYF1u2hAnEHfw8Z32jPmgBh5mESZ5ZbY TfSfIVFtxsCK21MU3KfNmP46EF7Hd3Ji7pz1KZFi753ucU9EVFcJ7gouhCmY8pBD4Mkd 61FovcVgW/hyNYC77pmTOCQNxtSYDjk8uFmhuIWiw5AufGTXuCDmJAuZvOhSzPOBtuvr NSltQN0ZZnSBkFZiv/D5LelZxGXLUWHXcW+qb4mWswXeb/v5WrEmsRyN+2kOTaIuwRH/ l76+CCNHVCeSOEPTzPCAbjdvbbJcaC5cqe5PtqziRGL9+mvlY8s2SrmrDWmIO1Qfd9BE VGqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:reply-to:from:list-subscribe:list-help :list-post:list-archive:list-unsubscribe:list-id:precedence :content-disposition:user-agent:in-reply-to:mime-version:references :message-id:subject:to:date:dmarc-filter:delivered-to:dkim-signature :dkim-filter; bh=+kkvXJOa9gK/HH/pKr9uwjlKjXNqjeBpxxrbJrTVGRU=; b=LWJC58O5BhPubY8Imws5LlTaavA8W9TSmiKkwRYdsiCNf+vWumNkS6Y+5r0EkE6TkE u4f0lU5UhZ0yAnAxCXms63IJ6mo5X8RAhEP1LNIceOQQTELucvhfeubQXPFCx8d36zXi ci8orcIZDAXDlc7AxrjCZWpEV2GSlpDInbFCbaRkvaboOJ9QwwDkDb+ONEsI6OLQLsos BSVkkApGovCr2PNn+zcVmLgyLvLIypFnnBz4IP8GxhLTgdVqJdPZ2MVI4vw8G2aCWnX0 6Oepc4nL0Q/WGhV1WGmKRUx8dfzry49a4ib3/mBLdxNEtyO4BwVFgxSxtFeEEeaG8rgs CcQw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=thuTxlsT; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id m7-20020a056402430700b0043ac721c313si7650758edc.550.2022.08.08.12.07.30 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Aug 2022 12:07:32 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=thuTxlsT; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CC66B385702C for ; Mon, 8 Aug 2022 19:07:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org CC66B385702C DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1659985649; bh=+kkvXJOa9gK/HH/pKr9uwjlKjXNqjeBpxxrbJrTVGRU=; h=Date:To:Subject:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=thuTxlsT46siJ5oDI7vISDL4MjTnIWbuHo3DNWesmNm9A9ZODceDkdYxH46t/M8U9 RTfnp1d7Hzc0lvYQfNZme4fccvpdJope6lHNZp7Np1gsF6UiZVz0Jru7SK/48bpeM+ uGM+8nlMFZph+wNBQUUqAQdJA9dpStIQoWVCIjro= 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 B397C385701C for ; Mon, 8 Aug 2022 19:06:44 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B397C385701C Received: from mail-qt1-f197.google.com (mail-qt1-f197.google.com [209.85.160.197]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-483-UKAlRPQAMkilWS9AYq8k9Q-1; Mon, 08 Aug 2022 15:06:43 -0400 X-MC-Unique: UKAlRPQAMkilWS9AYq8k9Q-1 Received: by mail-qt1-f197.google.com with SMTP id cf20-20020a05622a401400b0031efad5abb9so7462221qtb.10 for ; Mon, 08 Aug 2022 12:06:43 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=user-agent:in-reply-to:content-disposition:mime-version:references :message-id:subject:cc:to:from:date:x-gm-message-state:from:to:cc; bh=+kkvXJOa9gK/HH/pKr9uwjlKjXNqjeBpxxrbJrTVGRU=; b=xKHQMFDEVK/xcxs9JaHb9Z2EmOdkHOq6Ynu8qlp5LHey90G4KOpk9R+EyYUZP6sYbA cL//lROGAtsl5fYSpo97yebQykSdGkba5d4xkOzxehZ/72CVtkJLrxl2MhNgGXVdGKfh 6qk/TRe+Fbydg56bopHRi5pUKNPNIWVpFyrTQqwVA3d/1PEm11MW9gMMTtAbkcGoTrGe n7XYPbTCnB09v3BB8XXuRmx+Nfm05mLWFhPJt3Rs+UjvF58AvdKUIhkn9VSNuusKHXoz O4r7u6/wnwckOaH5nnYcpvnLBAeQWmnlMl5rNfuGFMXL+5oEbAOQhU4UCE0hashYp0XZ EeSg== X-Gm-Message-State: ACgBeo2IHk4QuWVNVnBra2fSSZOLZcl8/iQN25yaEvQ++6xcvPh7Cp8+ GWOeUz5x4Hn851/9dwoBhgt/VC3dEygZiMSOCh29HjVxD/3yMJO4uKYFJSvPWnQx4Cejmz74+9R AyT+xKBJmnqe7L5JVRw== X-Received: by 2002:ac8:5706:0:b0:342:fdd6:d59d with SMTP id 6-20020ac85706000000b00342fdd6d59dmr3307255qtw.159.1659985602410; Mon, 08 Aug 2022 12:06:42 -0700 (PDT) X-Received: by 2002:ac8:5706:0:b0:342:fdd6:d59d with SMTP id 6-20020ac85706000000b00342fdd6d59dmr3307223qtw.159.1659985602003; Mon, 08 Aug 2022 12:06:42 -0700 (PDT) Received: from redhat.com ([2601:184:4780:4310::e531]) by smtp.gmail.com with ESMTPSA id y17-20020a05620a25d100b006b60d5a7205sm9705878qko.51.2022.08.08.12.06.41 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Aug 2022 12:06:41 -0700 (PDT) Date: Mon, 8 Aug 2022 15:06:39 -0400 To: Jason Merrill Subject: [PATCH v2] c-family: Honor -Wno-init-self for cv-qual vars [PR102633] Message-ID: References: <20220726190340.432777-1-polacek@redhat.com> <51485fa8-a1c0-c019-c2bb-f4599fe34ca4@redhat.com> <01d3db21-2cf9-fa81-e1d1-973c479e22a3@redhat.com> MIME-Version: 1.0 In-Reply-To: <01d3db21-2cf9-fa81-e1d1-973c479e22a3@redhat.com> User-Agent: Mutt/2.2.6 (2022-06-05) X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-13.8 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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) 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: Marek Polacek via Gcc-patches From: Marek Polacek Reply-To: Marek Polacek Cc: Richard Biener , GCC Patches , Joseph Myers Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1739443191410929611?= X-GMAIL-MSGID: =?utf-8?q?1740621115722453435?= On Sat, Aug 06, 2022 at 03:29:05PM -0700, Jason Merrill wrote: > On 7/26/22 14:31, Marek Polacek wrote: > > On Tue, Jul 26, 2022 at 04:24:18PM -0400, Jason Merrill wrote: > > > On 7/26/22 15:03, Marek Polacek wrote: > > > > Since r11-5188-g32934a4f45a721, we drop qualifiers during l-to-r > > > > conversion by creating a NOP_EXPR. For e.g. > > > > > > > > const int i = i; > > > > > > > > that means that the DECL_INITIAL is '(int) i' and not 'i' anymore. > > > > Consequently, we don't suppress_warning here: > > > > > > > > 711 case DECL_EXPR: > > > > 715 if (VAR_P (DECL_EXPR_DECL (*expr_p)) > > > > 716 && !DECL_EXTERNAL (DECL_EXPR_DECL (*expr_p)) > > > > 717 && !TREE_STATIC (DECL_EXPR_DECL (*expr_p)) > > > > 718 && (DECL_INITIAL (DECL_EXPR_DECL (*expr_p)) == DECL_EXPR_DECL (*expr_p)) > > > > 719 && !warn_init_self) > > > > 720 suppress_warning (DECL_EXPR_DECL (*expr_p), OPT_Winit_self); > > > > > > > > because of the check on line 718 -- (int) i is not i. So -Wno-init-self > > > > doesn't disable the warning as it's supposed to. > > > > > > > > The following patch fixes it...except it doesn't, for volatile variables > > > > in C++. The problem is that for > > > > > > > > volatile int k = k; > > > > > > > > we see that the initializer has TREE_SIDE_EFFECTS, so we perform dynamic > > > > initialization. So there's no DECL_INITIAL and the suppress_warning > > > > call above is never done. I suppose we could amend get_no_uninit_warning > > > > to return true for volatile-qualified expressions. I mean, can we ever > > > > say for a fact that a volatile variable is uninitialized? > > > > > > > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? > > > > > > > > PR middle-end/102633 > > > > > > > > gcc/c-family/ChangeLog: > > > > > > > > * c-gimplify.cc (c_gimplify_expr): Strip NOPs of DECL_INITIAL. > > > > > > I wonder if we want to handle this i = i case earlier, like in finish_decl. > > > > I could, something like > > > > @@ -5381,7 +5381,14 @@ finish_decl (tree decl, location_t init_loc, tree init, > > init = NULL_TREE; > > > > if (init) > > - store_init_value (init_loc, decl, init, origtype); > > + { > > + /* In the self-init case, undo the artificial NOP_EXPR we may have > > + added in convert_lvalue_to_rvalue so that c_gimplify_expr/DECL_EXPR > > + can perform suppress_warning. */ > > + if (TREE_CODE (init) == NOP_EXPR && TREE_OPERAND (init, 0) == decl) > > + init = TREE_OPERAND (init, 0); > > + store_init_value (init_loc, decl, init, origtype); > > + } > > > > but then I'd have to do the same thing in cp_finish_decl because > > decay_conversion also adds a NOP_EXPR for cv-qualified non-class prvalues. > > Is that what we want? To me that seems less clean than having c_gimplify_expr > > see through NOP_EXPRs. > > I was thinking of checking the form of the initializer before > decay_conversion or anything else messes with it, and calling > suppress_warning at that point instead of in c_gimplify_expr. Aaah, okay. Here's a patch that does it. In the C FE it has to happen really early. Now both front ends behave the same wrt volatiles! Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? -- >8 -- Since r11-5188-g32934a4f45a721, we drop qualifiers during l-to-r conversion by creating a NOP_EXPR. For e.g. const int i = i; that means that the DECL_INITIAL is '(int) i' and not 'i' anymore. Consequently, we don't suppress_warning here: 711 case DECL_EXPR: 715 if (VAR_P (DECL_EXPR_DECL (*expr_p)) 716 && !DECL_EXTERNAL (DECL_EXPR_DECL (*expr_p)) 717 && !TREE_STATIC (DECL_EXPR_DECL (*expr_p)) 718 && (DECL_INITIAL (DECL_EXPR_DECL (*expr_p)) == DECL_EXPR_DECL (*expr_p)) 719 && !warn_init_self) 720 suppress_warning (DECL_EXPR_DECL (*expr_p), OPT_Winit_self); because of the check on line 718 -- (int) i is not i. So -Wno-init-self doesn't disable the warning as it's supposed to. The following patch fixes it by moving the suppress_warning call from c_gimplify_expr to the front ends, at points where we haven't created the NOP_EXPR yet. PR middle-end/102633 gcc/c-family/ChangeLog: * c-gimplify.cc (c_gimplify_expr) : Don't call suppress_warning here. gcc/c/ChangeLog: * c-parser.cc (c_parser_initializer): Add new tree parameter. Use it. Call suppress_warning. (c_parser_declaration_or_fndef): Pass d down to c_parser_initializer. (c_parser_omp_declare_reduction): Pass omp_priv down to c_parser_initializer. gcc/cp/ChangeLog: * decl.cc (cp_finish_decl): Call suppress_warning. gcc/testsuite/ChangeLog: * c-c++-common/Winit-self1.c: New test. * c-c++-common/Winit-self2.c: New test. --- gcc/c-family/c-gimplify.cc | 12 --------- gcc/c/c-parser.cc | 19 ++++++++++++--- gcc/cp/decl.cc | 8 ++++++ gcc/testsuite/c-c++-common/Winit-self1.c | 31 ++++++++++++++++++++++++ gcc/testsuite/c-c++-common/Winit-self2.c | 31 ++++++++++++++++++++++++ 5 files changed, 85 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Winit-self1.c create mode 100644 gcc/testsuite/c-c++-common/Winit-self2.c base-commit: 21c7aab09805d0c8c7695c8a69c8715d673a739a diff --git a/gcc/c-family/c-gimplify.cc b/gcc/c-family/c-gimplify.cc index a6f26c9b0d3..039a4b93230 100644 --- a/gcc/c-family/c-gimplify.cc +++ b/gcc/c-family/c-gimplify.cc @@ -708,18 +708,6 @@ c_gimplify_expr (tree *expr_p, gimple_seq *pre_p ATTRIBUTE_UNUSED, break; } - case DECL_EXPR: - /* This is handled mostly by gimplify.cc, but we have to deal with - not warning about int x = x; as it is a GCC extension to turn off - this warning but only if warn_init_self is zero. */ - if (VAR_P (DECL_EXPR_DECL (*expr_p)) - && !DECL_EXTERNAL (DECL_EXPR_DECL (*expr_p)) - && !TREE_STATIC (DECL_EXPR_DECL (*expr_p)) - && (DECL_INITIAL (DECL_EXPR_DECL (*expr_p)) == DECL_EXPR_DECL (*expr_p)) - && !warn_init_self) - suppress_warning (DECL_EXPR_DECL (*expr_p), OPT_Winit_self); - break; - case PREINCREMENT_EXPR: case PREDECREMENT_EXPR: case POSTINCREMENT_EXPR: diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 92049d1a101..6ed17ed9c48 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -1521,7 +1521,7 @@ static struct c_arg_info *c_parser_parms_list_declarator (c_parser *, tree, static struct c_parm *c_parser_parameter_declaration (c_parser *, tree, bool); static tree c_parser_simple_asm_expr (c_parser *); static tree c_parser_gnu_attributes (c_parser *); -static struct c_expr c_parser_initializer (c_parser *); +static struct c_expr c_parser_initializer (c_parser *, tree); static struct c_expr c_parser_braced_init (c_parser *, tree, bool, struct obstack *); static void c_parser_initelt (c_parser *, struct obstack *); @@ -2286,7 +2286,7 @@ c_parser_declaration_or_fndef (c_parser *parser, bool fndef_ok, int flag_sanitize_save = flag_sanitize; if (TREE_CODE (d) == PARM_DECL) flag_sanitize = 0; - init = c_parser_initializer (parser); + init = c_parser_initializer (parser, d); flag_sanitize = flag_sanitize_save; finish_init (); } @@ -5211,11 +5211,13 @@ c_parser_type_name (c_parser *parser, bool alignas_ok) Any expression without commas is accepted in the syntax for the constant-expressions, with non-constant expressions rejected later. + DECL is the declaration we're parsing this initializer for. + This function is only used for top-level initializers; for nested ones, see c_parser_initval. */ static struct c_expr -c_parser_initializer (c_parser *parser) +c_parser_initializer (c_parser *parser, tree decl) { if (c_parser_next_token_is (parser, CPP_OPEN_BRACE)) return c_parser_braced_init (parser, NULL_TREE, false, NULL); @@ -5224,6 +5226,15 @@ c_parser_initializer (c_parser *parser) struct c_expr ret; location_t loc = c_parser_peek_token (parser)->location; ret = c_parser_expr_no_commas (parser, NULL); + /* This is handled mostly by gimplify.cc, but we have to deal with + not warning about int x = x; as it is a GCC extension to turn off + this warning but only if warn_init_self is zero. */ + if (VAR_P (decl) + && !DECL_EXTERNAL (decl) + && !TREE_STATIC (decl) + && ret.value == decl + && !warn_init_self) + suppress_warning (decl, OPT_Winit_self); if (TREE_CODE (ret.value) != STRING_CST && TREE_CODE (ret.value) != COMPOUND_LITERAL_EXPR) ret = convert_lvalue_to_rvalue (loc, ret, true, true); @@ -22576,7 +22587,7 @@ c_parser_omp_declare_reduction (c_parser *parser, enum pragma_context context) location_t loc = c_parser_peek_token (parser)->location; rich_location richloc (line_table, loc); start_init (omp_priv, NULL_TREE, 0, &richloc); - struct c_expr init = c_parser_initializer (parser); + struct c_expr init = c_parser_initializer (parser, omp_priv); finish_init (); finish_decl (omp_priv, loc, init.value, init.original_type, NULL_TREE); diff --git a/gcc/cp/decl.cc b/gcc/cp/decl.cc index 70ad681467e..ff56fddba54 100644 --- a/gcc/cp/decl.cc +++ b/gcc/cp/decl.cc @@ -8253,6 +8253,14 @@ cp_finish_decl (tree decl, tree init, bool init_const_expr_p, && !TYPE_REF_P (type)) TREE_CONSTANT (decl) = 1; } + /* This is handled mostly by gimplify.cc, but we have to deal with + not warning about int x = x; as it is a GCC extension to turn off + this warning but only if warn_init_self is zero. */ + if (!DECL_EXTERNAL (decl) + && !TREE_STATIC (decl) + && decl == tree_strip_any_location_wrapper (init) + && !warn_init_self) + suppress_warning (decl, OPT_Winit_self); } if (flag_openmp diff --git a/gcc/testsuite/c-c++-common/Winit-self1.c b/gcc/testsuite/c-c++-common/Winit-self1.c new file mode 100644 index 00000000000..740b83b5e9f --- /dev/null +++ b/gcc/testsuite/c-c++-common/Winit-self1.c @@ -0,0 +1,31 @@ +/* PR middle-end/102633 */ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -Wno-init-self" } */ + +int +fn1 (void) +{ + int i = i; + return i; +} + +int +fn2 () +{ + const int j = j; + return j; +} + +int +fn3 () +{ + volatile int k = k; + return k; +} + +int +fn4 () +{ + const volatile int l = l; + return l; +} diff --git a/gcc/testsuite/c-c++-common/Winit-self2.c b/gcc/testsuite/c-c++-common/Winit-self2.c new file mode 100644 index 00000000000..13aa9efdf26 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Winit-self2.c @@ -0,0 +1,31 @@ +/* PR middle-end/102633 */ +/* { dg-do compile } */ +/* { dg-options "-Wuninitialized -Winit-self" } */ + +int +fn1 (void) +{ + int i = i; /* { dg-warning "used uninitialized" } */ + return i; +} + +int +fn2 () +{ + const int j = j; /* { dg-warning "used uninitialized" } */ + return j; +} + +int +fn3 () +{ + volatile int k = k; /* { dg-warning "used uninitialized" } */ + return k; +} + +int +fn4 () +{ + const volatile int l = l; /* { dg-warning "used uninitialized" } */ + return l; +}