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.129.124]) by sourceware.org (Postfix) with ESMTPS id 20C2E3858CDA for ; Fri, 2 Dec 2022 19:48:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 20C2E3858CDA 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=1670010492; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=+jG5fuZ6wde9kLbuSMvk1FFMJH1/z29/hJSn1yqyEtk=; b=bdK+Aw2P9uuWTeeHbPVstEdqzrD5eP/qHISDlUW8dt1eQnsXGsRUu4Xc51gJAQmgwgpMmL qIygj20dmSGpzDdOLHhxL3n07g8VJlvmRKxVQloPFW/YEjWPEn7X/ltMBaWiunOJ/dIEZ9 8eAbbiC/yzFXCMSE6ZfoicAd+aKodBc= Received: from mail-qt1-f198.google.com (mail-qt1-f198.google.com [209.85.160.198]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_128_GCM_SHA256) id us-mta-659-082vTog0NG6bXN4Id2bYFQ-1; Fri, 02 Dec 2022 14:48:11 -0500 X-MC-Unique: 082vTog0NG6bXN4Id2bYFQ-1 Received: by mail-qt1-f198.google.com with SMTP id bz20-20020a05622a1e9400b003a646e03748so20018958qtb.12 for ; Fri, 02 Dec 2022 11:48:11 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=user-agent:in-reply-to:content-transfer-encoding :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=+jG5fuZ6wde9kLbuSMvk1FFMJH1/z29/hJSn1yqyEtk=; b=3lD6sV7c9CeWPXEXDR4yMw3asymOF3TyGQwdoTjhsbvzXT+4lKNDjt98qERSR+mNAJ 8dkV+fheyrfgBEkFsl+OYseXKrnUZFy3+tbxnPhDBIqXTvFxmTIbjZTPogQs5I7uw7zO hViHtlfE395vOroxQuGHSX4vjxB3w+h8d57TXyjlHJrfdKuWLoLgNAuEjqgeG7uMtPaM 2djxceQKqsrC5YLYznGZyCMCRT0r/CHIu/4L+XmNJjTHynSsR0sK8250lJYKN/SzrTJ1 AS9YU4GxNwGVxrKQEtGtOe04818+0MjlHyrEPADMeOyQGNClxnFsJwOCTVi+gku/cFzR F+7A== X-Gm-Message-State: ANoB5plPYFpF66g+Yymbz/rbTZzzuqdwgobQutJBpKvpSrQo746cHDGd 1TIlcCsxxp7s496YJTFeb4HoP6JzXpLovufa1crZttSCSJrO+w1QxpSeg8fhoLBdDz1ee3srdPl th52N4c5F1hsSK0CnZA== X-Received: by 2002:a05:620a:2781:b0:6fc:6d30:7a4f with SMTP id g1-20020a05620a278100b006fc6d307a4fmr24979935qkp.579.1670010490761; Fri, 02 Dec 2022 11:48:10 -0800 (PST) X-Google-Smtp-Source: AA0mqf7gs1qJg1Ua55/80/OBg6zFkHdADFTep85/boE7EhOwRZnx53Wr0GlnUimaOfUsyFkkttnSdQ== X-Received: by 2002:a05:620a:2781:b0:6fc:6d30:7a4f with SMTP id g1-20020a05620a278100b006fc6d307a4fmr24979915qkp.579.1670010490437; Fri, 02 Dec 2022 11:48:10 -0800 (PST) Received: from redhat.com (2603-7000-9500-2e39-0000-0000-0000-1db4.res6.spectrum.com. [2603:7000:9500:2e39::1db4]) by smtp.gmail.com with ESMTPSA id ay40-20020a05622a22a800b003a57a317c17sm4628308qtb.74.2022.12.02.11.48.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 02 Dec 2022 11:48:09 -0800 (PST) Date: Fri, 2 Dec 2022 14:48:07 -0500 From: Marek Polacek To: Jason Merrill Cc: GCC Patches Subject: Re: [PATCH v3] c++: P2448 - Relaxing some constexpr restrictions [PR106649] Message-ID: References: <20221109205305.96262-1-polacek@redhat.com> <5cfabd39-8afe-931c-7872-1b4360d2e5b5@redhat.com> <8ce934d2-4775-2d27-6154-1b677dedc5a6@redhat.com> <44e97804-e4d8-f1b4-8456-8577f2e5a8ab@redhat.com> MIME-Version: 1.0 In-Reply-To: <44e97804-e4d8-f1b4-8456-8577f2e5a8ab@redhat.com> User-Agent: Mutt/2.2.7 (2022-08-07) X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=iso-8859-1 Content-Disposition: inline Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-12.1 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,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 Fri, Nov 18, 2022 at 09:26:26PM -0500, Jason Merrill wrote: > On 11/16/22 15:27, Jason Merrill wrote: > > On 11/16/22 11:06, Marek Polacek wrote: > > > On Wed, Nov 16, 2022 at 08:41:53AM -0500, Jason Merrill wrote: > > > > On 11/15/22 19:30, Marek Polacek wrote: > > > > > @@ -996,19 +1040,26 @@ register_constexpr_fundef (const > > > > > constexpr_fundef &value) > > > > >      **slot = value; > > > > >    } > > > > > -/* FUN is a non-constexpr function called in a context that requires a > > > > > -   constant expression.  If it comes from a constexpr > > > > > template, explain why > > > > > -   the instantiation isn't constexpr.  */ > > > > > +/* FUN is a non-constexpr (or, with -Wno-invalid-constexpr, > > > > > a constexpr > > > > > +   function called in a context that requires a constant expression). > > > > > +   If it comes from a constexpr template, explain why the > > > > > instantiation > > > > > +   isn't constexpr.  */ > > > > > > > > The "if it comes from a constexpr template" wording has needed > > > > an update for > > > > a while now. > > > > > > Probably ever since r178519.  I've added "Otherwise, explain why the > > > function > > > cannot be used in a constexpr context."  Is that acceptable? > > > > > --- /dev/null > > > > > +++ b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit15.C > > > > > @@ -0,0 +1,43 @@ > > > > > +// PR c++/106649 > > > > > +// P2448 - Relaxing some constexpr restrictions > > > > > +// { dg-do compile { target c++23 } } > > > > > +// { dg-options "-Winvalid-constexpr" } > > > > > +// A copy/move assignment operator for a class X that is defaulted and > > > > > +// not defined as deleted is implicitly defined when it is odr-used, > > > > > +// when it is needed for constant evaluation, or when it is explicitly > > > > > +// defaulted after its first declaration. > > > > > +// The implicitly-defined copy/move assignment operator is constexpr. > > > > > + > > > > > +struct S { > > > > > +  constexpr S() {} > > > > > +  S& operator=(const S&) = default; // #1 > > > > > +  S& operator=(S&&) = default; // #2 > > > > > +}; > > > > > + > > > > > +struct U { > > > > > +  constexpr U& operator=(const U&) = default; > > > > > +  constexpr U& operator=(U&&) = default; > > > > > +}; > > > > > + > > > > > +/* FIXME: If we only declare #1 and #2, and default them here: > > > > > + > > > > > +   S& S::operator=(const S&) = default; > > > > > +   S& S::operator=(S&&) = default; > > > > > + > > > > > +then they aren't constexpr.  This sounds like a bug: > > > > > +.  */ > > > > > > > > As I commented on the PR, I don't think this is actually a bug, so let's > > > > omit this FIXME. > > > > > > I'm glad I didn't really attempt to "fix" it (the inform message is > > > flawed > > > and should be improved).  Thanks for taking a look. > > > > > > Here's a version with the two comments updated. > > > > > > Ok? > > > > OK. > > Since this patch I'm seeing these failures: > > FAIL: g++.dg/cpp0x/constexpr-ex1.C -std=c++23 -fimplicit-constexpr at line > 91 (test for errors, line 89) > FAIL: g++.dg/cpp23/constexpr-nonlit10.C -std=gnu++23 -fimplicit-constexpr > (test for warnings, line 14) > FAIL: g++.dg/cpp23/constexpr-nonlit10.C -std=gnu++23 -fimplicit-constexpr > (test for warnings, line 20) > FAIL: g++.dg/cpp23/constexpr-nonlit11.C -std=gnu++23 -fimplicit-constexpr > (test for warnings, line 28) > FAIL: g++.dg/cpp23/constexpr-nonlit11.C -std=gnu++23 -fimplicit-constexpr > (test for warnings, line 31) > FAIL: g++.dg/cpp2a/spaceship-eq3.C -std=c++23 -fimplicit-constexpr (test > for excess errors) Ah, sorry. The following patch fixes those fails. Ok? -- >8 -- Some of the new tests were failing with -fimplicit-constexpr. This patch adjusts the expected diagnostic. Tested with GXX_TESTSUITE_STDS=98,11,14,17,20,23 make check-c++ RUNTESTFLAGS="--target_board=unix\{,-fimplicit-constexpr\} dg.exp=spaceship-eq3.C" gcc/testsuite/ChangeLog: * g++.dg/cpp0x/constexpr-ex1.C: Adjust dg-error. * g++.dg/cpp23/constexpr-nonlit10.C: Adjust dg-warning. * g++.dg/cpp23/constexpr-nonlit11.C: Likewise. * g++.dg/cpp2a/spaceship-eq3.C: Add dg-error. --- gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C | 6 +++--- gcc/testsuite/g++.dg/cpp23/constexpr-nonlit10.C | 4 ++-- gcc/testsuite/g++.dg/cpp23/constexpr-nonlit11.C | 4 ++-- gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C index 48281a47784..383d38a42d4 100644 --- a/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C +++ b/gcc/testsuite/g++.dg/cpp0x/constexpr-ex1.C @@ -87,8 +87,8 @@ struct resource { } }; constexpr resource f(resource d) -{ return d; } // { dg-error "non-.constexpr." "" { target { { ! implicit_constexpr } && c++20_down } } } -// { dg-error "non-.constexpr." "" { target c++23 } .-2 } -constexpr resource d = f(9); // { dg-message ".constexpr." "" { target { ! implicit_constexpr } } } +{ return d; } // { dg-error "non-.constexpr." "" { target { { { ! implicit_constexpr } && c++20_down } || c++11_only } } } +// { dg-error "non-.constexpr." "" { target { c++23 && { ! implicit_constexpr } } } .-2 } +constexpr resource d = f(9); // { dg-message ".constexpr." "" { target { { ! implicit_constexpr } || c++11_only } } } // 4.4 floating-point constant expressions diff --git a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit10.C b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit10.C index 48706f7b66e..31d4b873bbf 100644 --- a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit10.C +++ b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit10.C @@ -11,13 +11,13 @@ struct NonLiteral { // C++23: It is possible to write a constexpr function for which no // invocation satisfies the requirements of a core constant expression. constexpr NonLiteral -fn0 (int) // { dg-warning "invalid return type" } +fn0 (int) // { dg-warning "invalid return type" "" { target { ! implicit_constexpr } } } { return NonLiteral{}; } constexpr int -fn1 (NonLiteral) // { dg-warning "invalid type" } +fn1 (NonLiteral) // { dg-warning "invalid type" "" { target { ! implicit_constexpr } } } { return 42; } diff --git a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit11.C b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit11.C index a7114bc66cb..e08809f873c 100644 --- a/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit11.C +++ b/gcc/testsuite/g++.dg/cpp23/constexpr-nonlit11.C @@ -25,10 +25,10 @@ struct X { struct S { X x; // Calls a non-constexpr constructor X::X(int). - constexpr S(int i) : x(i) { } // { dg-warning "call to" } + constexpr S(int i) : x(i) { } // { dg-warning "call to" "" { target { ! implicit_constexpr } } } S(int, int) { } // Target constructor isn't constexpr. - constexpr S() : S(42, 42) { } // { dg-warning "call to" } + constexpr S() : S(42, 42) { } // { dg-warning "call to" "" { target { ! implicit_constexpr } } } }; namespace N1 { diff --git a/gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C index 69eaa7b9b20..246839f1f95 100644 --- a/gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C +++ b/gcc/testsuite/g++.dg/cpp2a/spaceship-eq3.C @@ -9,6 +9,7 @@ struct D A i; bool operator==(const D& x) const = default; // { dg-error "A::operator==" "" { target c++20_down } } bool operator!=(const D& z) const = default; // { dg-error "D::operator==" "" { target c++20_down } } +// { dg-error "called" "" { target { c++23 && implicit_constexpr } } .-1 } }; constexpr D d{A()}; base-commit: d19aa6af6634b1e97f38431ad091f3b3f12baf2f -- 2.38.1