From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id AC52F3858CDB for ; Sat, 18 Mar 2023 12:35:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AC52F3858CDB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1679142940; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=4FojIk5DLhbetA4IGRv3qWlP+xEHuqdyZj40a1r6OaQ=; b=ivMGhOmSAJK+opu6Rg25TuUkeW6uC4Xk2G7+WWqSOicdfynE7fCIhaPz3ktYfRgM9aVnwr 9aBukIwAGYwLeE5Ayvn1lodyHlbhPSp7RenJTuKKL3nU4llKnO565/hun2/BxWk5ydCPNX 9FSWeG9H8eEkMgzqGZkPchfkiRqXlKc= Received: from mail-qv1-f71.google.com (mail-qv1-f71.google.com [209.85.219.71]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-614-6G5AagPTN5aKC91FK4zvdA-1; Sat, 18 Mar 2023 08:35:39 -0400 X-MC-Unique: 6G5AagPTN5aKC91FK4zvdA-1 Received: by mail-qv1-f71.google.com with SMTP id c15-20020a056214070f00b005bb308e7c12so2999184qvz.19 for ; Sat, 18 Mar 2023 05:35:38 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; t=1679142938; h=content-transfer-encoding:in-reply-to:from:references:to :content-language:subject:user-agent:mime-version:date:message-id :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=4FojIk5DLhbetA4IGRv3qWlP+xEHuqdyZj40a1r6OaQ=; b=XsAg040n9ZpUm1jHcbBunH4UL60AoLdhW4BW4/i220oG/rR8XCM18J+xALoKUChNwQ gYFwMxZhqZmg0hnU98fo44wWDszsHcypiuDWyiABKxyXMmjsB1ZuZwuue9DoZawiOwB1 a+02TfxSdtWyS/PIwOxuZMqVQMffaAejDN/fkvmXXBsGOB5hj2TKDTV+Rls/FzaF/9Mi CdOOI8qSdZTAzDCPNg27i6Rx4wJB/QdY8yrvPQh0Tjv5iD50x7zmddX/q5mSEUxZkO6t /izmN6thjNqiPBb9S7E8J9ZNAQzOe+DZeucbeOWhv82pjWYp/4LpgjKxmqeFIVztC4zt cNsg== X-Gm-Message-State: AO0yUKVISe2eC31BHfnLIUI0ZlL9bDGFuVr1qOf70w2fKIPEcw3ru/Bw IwakU99TtIsvXWW0VEWNldoZ86mzirSeFWxwcYy+qzqu7IR9oZmZy5AuC7ZGRorjaa/WV4dyzGK h5zerQmp4HjTKegq28w== X-Received: by 2002:a05:622a:450:b0:3b9:173e:45de with SMTP id o16-20020a05622a045000b003b9173e45demr8679632qtx.6.1679142938014; Sat, 18 Mar 2023 05:35:38 -0700 (PDT) X-Google-Smtp-Source: AK7set/mE5EJCjg20JY0zymsIHNM+wTscUq3ASRDosmWNEnbp8rKeEWhgR1Twr315+OV5VX2AjqJTQ== X-Received: by 2002:a05:622a:450:b0:3b9:173e:45de with SMTP id o16-20020a05622a045000b003b9173e45demr8679600qtx.6.1679142937668; Sat, 18 Mar 2023 05:35:37 -0700 (PDT) Received: from [192.168.1.108] (130-44-159-43.s15913.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.159.43]) by smtp.gmail.com with ESMTPSA id i16-20020ac871d0000000b003d9a69b4876sm3140429qtp.11.2023.03.18.05.35.36 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sat, 18 Mar 2023 05:35:37 -0700 (PDT) Message-ID: Date: Sat, 18 Mar 2023 08:35:36 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [PATCH] c++: further -Wdangling-reference refinement [PR107532] To: Marek Polacek , GCC Patches References: <20230317202908.42800-1-polacek@redhat.com> From: Jason Merrill In-Reply-To: <20230317202908.42800-1-polacek@redhat.com> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-12.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,NICE_REPLY_A,RCVD_IN_DNSWL_NONE,RCVD_IN_MSPIKE_H2,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On 3/17/23 16:29, Marek Polacek wrote: > Based on , > it seems like we should treat *any* class with a reference member > as a reference wrapper. This simplifies the code so I'm happy to > make that change. > > The patch, however, does not suppress the warning in > > int i = 42; > auto const& v = std::get<0>(std::tuple(i)); Why not? tuple has an int& member, doesn't it? Do we need to look into bases as well? > Since reference_like_class_p already checks for std::pair > maybe it could also check for std::tuple. I don't know if we > want to make that change in GCC 13, or move -Wdangling-reference to > -Wextra for GCC 13 and perhaps move it back to -Wall in GCC 14. > > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? > > PR c++/107532 > > gcc/cp/ChangeLog: > > * call.cc (reference_like_class_p): Don't look for a constructor. > > gcc/testsuite/ChangeLog: > > * g++.dg/warn/Wdangling-reference11.C: New test. > --- > gcc/cp/call.cc | 35 +++++++------------ > .../g++.dg/warn/Wdangling-reference11.C | 23 ++++++++++++ > 2 files changed, 35 insertions(+), 23 deletions(-) > create mode 100644 gcc/testsuite/g++.dg/warn/Wdangling-reference11.C > > diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc > index c01e7b82457..00d56a157b6 100644 > --- a/gcc/cp/call.cc > +++ b/gcc/cp/call.cc > @@ -13781,8 +13781,9 @@ std_pair_ref_ref_p (tree t) > > /* Return true if a class CTYPE is either std::reference_wrapper or > std::ref_view, or a reference wrapper class. We consider a class > - a reference wrapper class if it has a reference member and a > - constructor taking the same reference type. */ > + a reference wrapper class if it has a reference member. We no > + longer check that it has a constructor taking the same reference type > + since that approach still generated too many false positives. */ > > static bool > reference_like_class_p (tree ctype) > @@ -13798,31 +13799,19 @@ reference_like_class_p (tree ctype) > if (decl_in_std_namespace_p (tdecl)) > { > tree name = DECL_NAME (tdecl); > - return (name > - && (id_equal (name, "reference_wrapper") > - || id_equal (name, "span") > - || id_equal (name, "ref_view"))); > + if (name > + && (id_equal (name, "reference_wrapper") > + || id_equal (name, "span") > + || id_equal (name, "ref_view"))) > + return true; > } > for (tree fields = TYPE_FIELDS (ctype); > fields; > fields = DECL_CHAIN (fields)) > - { > - if (TREE_CODE (fields) != FIELD_DECL || DECL_ARTIFICIAL (fields)) > - continue; > - tree type = TREE_TYPE (fields); > - if (!TYPE_REF_P (type)) > - continue; > - /* OK, the field is a reference member. Do we have a constructor > - taking its type? */ > - for (tree fn : ovl_range (CLASSTYPE_CONSTRUCTORS (ctype))) > - { > - tree args = FUNCTION_FIRST_USER_PARMTYPE (fn); > - if (args > - && same_type_p (TREE_VALUE (args), type) > - && TREE_CHAIN (args) == void_list_node) > - return true; > - } > - } > + if (TREE_CODE (fields) == FIELD_DECL > + && !DECL_ARTIFICIAL (fields) > + && TYPE_REF_P (TREE_TYPE (fields))) > + return true; > return false; > } > > diff --git a/gcc/testsuite/g++.dg/warn/Wdangling-reference11.C b/gcc/testsuite/g++.dg/warn/Wdangling-reference11.C > new file mode 100644 > index 00000000000..667618e7196 > --- /dev/null > +++ b/gcc/testsuite/g++.dg/warn/Wdangling-reference11.C > @@ -0,0 +1,23 @@ > +// PR c++/107532 > +// { dg-do compile { target c++11 } } > +// { dg-options "-Wdangling-reference" } > + > +struct R > +{ > + int& r; > + int& get() { return r; } > + int&& rget() { return static_cast(r); } > +}; > + > +int main() > +{ > + int i = 42; > + int& l = R{i}.get(); // { dg-bogus "dangling reference" } > + int const& cl = R{i}.get(); // { dg-bogus "dangling reference" } > + int&& r = R{i}.rget(); // { dg-bogus "dangling reference" } > + int const&& cr = R{i}.rget(); // { dg-bogus "dangling reference" } > + (void) l; > + (void) r; > + (void) cr; > + (void) cl; > +} > > base-commit: ae7190e345a8d80310835cb83b3b41ef2aeb0d37