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 [63.128.21.124]) by sourceware.org (Postfix) with ESMTP id 48011384BC11 for ; Mon, 21 Sep 2020 19:07:04 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 48011384BC11 Received: from mail-qt1-f200.google.com (mail-qt1-f200.google.com [209.85.160.200]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-258-yqCtX2qjM-ecevHsp6E4Sg-1; Mon, 21 Sep 2020 15:07:02 -0400 X-MC-Unique: yqCtX2qjM-ecevHsp6E4Sg-1 Received: by mail-qt1-f200.google.com with SMTP id b54so13725476qtk.17 for ; Mon, 21 Sep 2020 12:07:02 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:date:to:cc:subject:in-reply-to:message-id :references:mime-version; bh=EaIpaenzU9RKdGe4mFEuJVwaCobGBaSwbNNOlAsBzyA=; b=eV+MMkdqck7gRyyF5/49mpkwbCjif+4M+Xf3NN+OddsF2DQLc5AptAzdVtVITBCHH7 rkqw6p563I7RVjUPsCwCnX6c87GSl6gTl193I/ZxFvzN0l2ynkURc7gM8EUq38umbaJS 1GgoYOuiYTHXVE2DbvqHyJXgXhp/ksi3HH7FIQtZp8ofnseyVOyHvGMMyiiSRTqwmYn2 FThTs0UIWwCc2AofspMfHu7DRIX41b1xYMvbtFzLcPV38dHH6n0dRlCwEGdcI8JN2ZLK CGF8JCDSdyOt8EzcYzwVPhTs4QW1ehDdMtU0PjdKrYl2jmI/XssMmgBWGgCpwD8fCGSc N/Jw== X-Gm-Message-State: AOAM5325zc8IPl8Z2fjMopgS1Ag0t9VsOBUQfnOiBXYFWNdIvDErlZmL uQn5mUMATFe6ynphgZHyX/RmpuADVk6t/iOBv/TPTL8VzoL5foYy7iv8Ko0szjpx9uLo6MlHt8N R4P8FB/vTI2z3WaiTLw== X-Received: by 2002:ae9:c30d:: with SMTP id n13mr1299799qkg.138.1600715221845; Mon, 21 Sep 2020 12:07:01 -0700 (PDT) X-Google-Smtp-Source: ABdhPJx5uVhBqTP1wJm9eIvgGKNozl3jNO73meFNqB8oE6/OATNt8ceFoxydUbEZpCeRAPay7XqxIw== X-Received: by 2002:ae9:c30d:: with SMTP id n13mr1299779qkg.138.1600715221573; Mon, 21 Sep 2020 12:07:01 -0700 (PDT) Received: from [192.168.1.130] (ool-457d493a.dyn.optonline.net. [69.125.73.58]) by smtp.gmail.com with ESMTPSA id n1sm10738045qte.91.2020.09.21.12.07.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 21 Sep 2020 12:07:00 -0700 (PDT) From: Patrick Palka X-Google-Original-From: Patrick Palka Date: Mon, 21 Sep 2020 15:07:00 -0400 (EDT) To: Patrick Palka cc: gcc-patches@gcc.gnu.org, libstdc++@gcc.gnu.org Subject: Re: [PATCH] libstdc++: Remove overzealous static_asserts from std::span In-Reply-To: <20200921184533.3909335-1-ppalka@redhat.com> Message-ID: <521c85f-5911-b97-e097-203d452350c0@idea> References: <20200921184533.3909335-1-ppalka@redhat.com> MIME-Version: 1.0 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-16.7 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_H5, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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-List-Received-Date: Mon, 21 Sep 2020 19:07:05 -0000 On Mon, 21 Sep 2020, Patrick Palka wrote: > For a span with empty static extent, we currently model the > preconditions of front(), back(), and operator[] as if they were > mandates, by using a static_assert to verify that extent != 0. This > causes us to incorrectly reject valid programs that instantiate these > member functions but never call them. > > libstdc++-v3/ChangeLog: > > * include/std/span (span::front): Remove static_assert. > (span::back): Likewise. > (span::operator[]): Likewise. > * testsuite/23_containers/span/back_neg.cc: Remove. > * testsuite/23_containers/span/front_neg.cc: Remove. > * testsuite/23_containers/span/index_op_neg.cc: Remove. Here's a version that rewrites rather than removes the testcases: -- >8 -- Subject: [PATCH] libstdc++: Remove overzealous static_asserts from std::span For a span with empty static extent, we currently model the preconditions of front(), back(), and operator[] as if they were mandates, by using a static_assert to verify that extent != 0. This causes us to incorrectly reject valid programs that instantiate these member functions but would never call them at runtime. libstdc++-v3/ChangeLog: * include/std/span (span::front): Remove static_assert. (span::back): Likewise. (span::operator[]): Likewise. * testsuite/23_containers/span/back_neg.cc: Rewrite to verify that we check the preconditions of back() only when it's called. * testsuite/23_containers/span/front_neg.cc: Likewise for front(). * testsuite/23_containers/span/index_op_neg.cc: Likewise for operator[]. --- libstdc++-v3/include/std/span | 3 --- .../testsuite/23_containers/span/back_neg.cc | 14 ++++++++++---- .../testsuite/23_containers/span/front_neg.cc | 14 ++++++++++---- .../testsuite/23_containers/span/index_op_neg.cc | 14 ++++++++++---- 4 files changed, 30 insertions(+), 15 deletions(-) diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span index f658adb04cf..1cdc0589ddb 100644 --- a/libstdc++-v3/include/std/span +++ b/libstdc++-v3/include/std/span @@ -264,7 +264,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference front() const noexcept { - static_assert(extent != 0); __glibcxx_assert(!empty()); return *this->_M_ptr; } @@ -272,7 +271,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference back() const noexcept { - static_assert(extent != 0); __glibcxx_assert(!empty()); return *(this->_M_ptr + (size() - 1)); } @@ -280,7 +278,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION constexpr reference operator[](size_type __idx) const noexcept { - static_assert(extent != 0); __glibcxx_assert(__idx < size()); return *(this->_M_ptr + __idx); } diff --git a/libstdc++-v3/testsuite/23_containers/span/back_neg.cc b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc index c451ed10df8..f777edfa20c 100644 --- a/libstdc++-v3/testsuite/23_containers/span/back_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/back_neg.cc @@ -20,10 +20,16 @@ #include -void -test01() +constexpr bool +test01(bool b) { std::span s; - s.back(); // { dg-error "here" } + if (b || !s.empty()) + s.back(); + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } diff --git a/libstdc++-v3/testsuite/23_containers/span/front_neg.cc b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc index 38f87aa2cd5..14e5bc1e100 100644 --- a/libstdc++-v3/testsuite/23_containers/span/front_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/front_neg.cc @@ -20,10 +20,16 @@ #include -void -test01() +constexpr bool +test01(bool b) { std::span s; - s.front(); // { dg-error "here" } + if (b || !s.empty()) + s.front(); + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } diff --git a/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc index 1e8b2d8724e..6a3bb8834b4 100644 --- a/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc +++ b/libstdc++-v3/testsuite/23_containers/span/index_op_neg.cc @@ -20,10 +20,16 @@ #include -void -test01() +constexpr bool +test01(bool b) { std::span s; - s[99]; // { dg-error "here" } + if (b || !s.empty()) + s[99]; + return true; } -// { dg-error "static assertion failed" "" { target *-*-* } 0 } + +static_assert(test01(false)); +static_assert(test01(true)); // { dg-error "non-constant" } +// { dg-error "assert" "" { target *-*-* } 0 } +// { dg-prune-output "in 'constexpr' expansion" } -- 2.28.0.497.g54e85e7af1