From patchwork Tue Apr 2 18:10:18 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jason Merrill X-Patchwork-Id: 1918935 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=dCOxjnGq; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4V8GD34Rrdz1yYw for ; Wed, 3 Apr 2024 05:11:31 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id AFDED385E02C for ; Tue, 2 Apr 2024 18:11:29 +0000 (GMT) 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.133.124]) by sourceware.org (Postfix) with ESMTPS id 074993858D32 for ; Tue, 2 Apr 2024 18:11:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 074993858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 074993858D32 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=170.10.133.124 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712081467; cv=none; b=G9nu8r6V3OGttHTTp9EbbaQQH5sLYIWG72iEmiYI1EOL77Qn6g+nu4eEtJZoQA0pkHfHsIWNl3ZhWN/7OEPY02KPOdlUX3AGBbp6zvLZmRDBqupQ3h877NiBaLMTuwiFF3H7hjXshNpXHFGrJzFtdC2gF+0hgUsACT4GOfDN7+M= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1712081467; c=relaxed/simple; bh=c00HiafRyr7Va1Qi90TvJBuFjyIglkO8/AT5VcXobUw=; h=DKIM-Signature:From:To:Subject:Date:Message-ID:MIME-Version; b=XGne09n3ZNiXyA2+oCribls5XlVHdq+YJr14lUxkENJiJuw6q4utnk+kuctq85sePOhSMDpecc0Vto9+NcCG//38z09/FRzFBwAHYw5NBIzlkvZbiHsgOkcngwzbCP7oHa4YW/jUWVMRtkbeiQI1qG/AYClTUZhEuFRBpX9EF1M= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1712081464; 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; bh=RU8GXA7N/xAc8/cnIWyjbkS2sdKa5E9Rs6FEVhH7LNs=; b=dCOxjnGqFc7bd9V3URncTsmo1Tpwy+yGYx/1xESpvjFderpkC+ik6UCzaP6u3uTbyKgQks rzG3hzeH38NlAPj8OqCsIH4pwTqM4/vuKKcbdADAbQKjYXV2E9lz82aGTQjRNfBGFHYg+A 8cEGG8JDfMRkYe/BZNLgE/Yrcvb6RRo= Received: from mail-qv1-f70.google.com (mail-qv1-f70.google.com [209.85.219.70]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-74-DbtiEVx-OwSUx21n85WqHg-1; Tue, 02 Apr 2024 14:11:03 -0400 X-MC-Unique: DbtiEVx-OwSUx21n85WqHg-1 Received: by mail-qv1-f70.google.com with SMTP id 6a1803df08f44-69919c981ccso10691706d6.3 for ; Tue, 02 Apr 2024 11:11:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1712081462; x=1712686262; h=content-transfer-encoding:mime-version:message-id:date:subject:to :from:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=RU8GXA7N/xAc8/cnIWyjbkS2sdKa5E9Rs6FEVhH7LNs=; b=m8rMmPrvhDuFGl4HD7aTDCSOa9yFi4aedsRtuJuBWroDgnIpN2rqnWBC3EZ+YzRL/c 0Z5R/OdlI6Nfd0G7fVoEvS+PW9t0aaz0XXjBBYEX79gjkr/+xZip3MyfsSpXGjdRJOZ3 gGE8SZ0tmuikeeFhfh5Cn6QWOvH9u+/UflnbWA0GkVKA8AWGCpxQYHlgr6o+8XPzzLTh HgmxoVGjS78tGV4D1DAfnc07/WYBEt5iKFZofhtaBpiI+ARtKdIpqY4hUXJG8HFO4CJH Jhd4MEo6slzrM0lcaCUnzzlTkaxDri+10Am1WgpVxu9gujgZE5Zzd6p4HX7yMvPH8OsE g15g== X-Gm-Message-State: AOJu0YzizWuAVtS0aHQ8m5/sTnHbnX+3mqJoxZQGHCmq2XPyH4tzJlw1 PNafwhNboCXw02fpYBIm2pNc+sKWqsuVwdufgpa+MowL3nT4+XR5Nz8BfNL7pHYysnF9U9dtw0u OSL4GZzRjOA+ANi2Tf8RMJxGU6OomMRmmpHVHvnIBWRthnaxKyo6gch09Mg96y5brobC/B33ZKX h54Dhw4TuUrjgpcrL9gmZKDHUWnAC9XlZ/wWI= X-Received: by 2002:a0c:e093:0:b0:699:211a:2d71 with SMTP id l19-20020a0ce093000000b00699211a2d71mr1130907qvk.14.1712081462421; Tue, 02 Apr 2024 11:11:02 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHyibHCMcpc9NrJkfkrVFTNl0GOBtP+30SxFv7d6kgAAH/Sg8pgOLNn7cmxC9tfL/7HJMOLFQ== X-Received: by 2002:a0c:e093:0:b0:699:211a:2d71 with SMTP id l19-20020a0ce093000000b00699211a2d71mr1130892qvk.14.1712081461984; Tue, 02 Apr 2024 11:11:01 -0700 (PDT) Received: from jason-thinkpadp1gen4i.rmtusma.csb (130-44-146-16.s12558.c3-0.arl-cbr1.sbo-arl.ma.cable.rcncustomer.com. [130.44.146.16]) by smtp.gmail.com with ESMTPSA id gw4-20020a0562140f0400b00698fd28cad3sm3475525qvb.80.2024.04.02.11.11.01 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 02 Apr 2024 11:11:01 -0700 (PDT) From: Jason Merrill To: gcc-patches@gcc.gnu.org Subject: [pushed] c++: binding reference to comma expr [PR114561] Date: Tue, 2 Apr 2024 14:10:18 -0400 Message-ID: <20240402181059.796634-1-jason@redhat.com> X-Mailer: git-send-email 2.44.0 MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-12.2 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_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, 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 X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org Tested x86_64-pc-linux-gnu, applying to trunk. -- 8< -- We represent a reference binding where the referent type is more qualified by a ck_ref_bind around a ck_qual. We performed the ck_qual and then tried to undo it with STRIP_NOPS, but that doesn't work if the conversion is buried in COMPOUND_EXPR. So instead let's avoid performing that fake conversion in the first place. PR c++/114561 PR c++/114562 gcc/cp/ChangeLog: * call.cc (convert_like_internal): Avoid adding qualification conversion in direct reference binding. gcc/testsuite/ChangeLog: * g++.dg/conversion/ref10.C: New test. * g++.dg/conversion/ref11.C: New test. --- gcc/cp/call.cc | 23 +++++++---------- gcc/testsuite/g++.dg/conversion/ref10.C | 5 ++++ gcc/testsuite/g++.dg/conversion/ref11.C | 33 +++++++++++++++++++++++++ 3 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 gcc/testsuite/g++.dg/conversion/ref10.C create mode 100644 gcc/testsuite/g++.dg/conversion/ref11.C base-commit: 35408b3669fac104cd380582b32e32c64a603d8b diff --git a/gcc/cp/call.cc b/gcc/cp/call.cc index 9e4c8073600..9568b5eb2c4 100644 --- a/gcc/cp/call.cc +++ b/gcc/cp/call.cc @@ -8742,7 +8742,15 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum, break; }; - expr = convert_like (next_conversion (convs), expr, fn, argnum, + conversion *nc = next_conversion (convs); + if (convs->kind == ck_ref_bind && nc->kind == ck_qual + && !convs->need_temporary_p) + /* direct_reference_binding might have inserted a ck_qual under + this ck_ref_bind for the benefit of conversion sequence ranking. + Don't actually perform that conversion. */ + nc = next_conversion (nc); + + expr = convert_like (nc, expr, fn, argnum, convs->kind == ck_ref_bind ? issue_conversion_warnings : false, c_cast_p, /*nested_p=*/true, complain & ~tf_no_cleanup); @@ -8820,19 +8828,6 @@ convert_like_internal (conversion *convs, tree expr, tree fn, int argnum, { tree ref_type = totype; - /* direct_reference_binding might have inserted a ck_qual under - this ck_ref_bind for the benefit of conversion sequence ranking. - Ignore the conversion; we'll create our own below. */ - if (next_conversion (convs)->kind == ck_qual - && !convs->need_temporary_p) - { - gcc_assert (same_type_p (TREE_TYPE (expr), - next_conversion (convs)->type)); - /* Strip the cast created by the ck_qual; cp_build_addr_expr - below expects an lvalue. */ - STRIP_NOPS (expr); - } - if (convs->bad_p && !next_conversion (convs)->bad_p) { tree extype = TREE_TYPE (expr); diff --git a/gcc/testsuite/g++.dg/conversion/ref10.C b/gcc/testsuite/g++.dg/conversion/ref10.C new file mode 100644 index 00000000000..1913f733a6b --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ref10.C @@ -0,0 +1,5 @@ +// PR c++/114561 + +void create(void* u) { + const void* const& r = ( (void)0, u ); +} diff --git a/gcc/testsuite/g++.dg/conversion/ref11.C b/gcc/testsuite/g++.dg/conversion/ref11.C new file mode 100644 index 00000000000..bb9b835034c --- /dev/null +++ b/gcc/testsuite/g++.dg/conversion/ref11.C @@ -0,0 +1,33 @@ +// PR c++/114562 +// { dg-do compile { target c++11 } } + +template +struct Optional { + Optional(T&&); +}; + +struct MyClass { + MyClass(Optional); +}; + +// const void* NONE = nullptr; // Correct Error +void* NONE = nullptr; // Crash + +void beforeParam(); + +template +struct Create { + template static T create(U &&) noexcept; +}; + + +template +template +T Create::create(U && u) noexcept { + return T( ( (beforeParam()), (u) ) ); // { dg-error "cannot bind rvalue reference" } + // return T( (u) ); // Correct Error +} + +void test_func() { + Create::create(NONE); +}