From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wr1-x42e.google.com (mail-wr1-x42e.google.com [IPv6:2a00:1450:4864:20::42e]) by sourceware.org (Postfix) with ESMTPS id 09076383F850; Fri, 11 Dec 2020 07:20:29 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 09076383F850 Received: by mail-wr1-x42e.google.com with SMTP id q18so415837wrn.1; Thu, 10 Dec 2020 23:20:28 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:to:from:subject:message-id:date:user-agent :mime-version:content-language; bh=tdpZACe9dGG2O1WdKE5r8PhXcAW3YQYvDciFLeLRhjc=; b=po2yA7j31afhFeyuz7dFr2VuE20zU/Rf7r8FvNg9UEeRoMp5GDt9+kofcU802prkF4 W9Y0IhIvhzph/+SD35BAJY9mY1r2eo587pStVmG9aKiw5xLaTcj6C9sywJjSnue+maM8 aONsjRWk8dUapU1Mjgh1sQmrxrhNIS9XQmrygnaWQa204zdJ/vV/vMKyCmFanNhRS2cD lII6p6VTSXYgqFKW9VJtQ3VWTWlqEJ73TfYQzmNZF8bEP8cnXhWefL4NN7mWRCTo6p49 pukrkYfH8woOz6ss5oWdXYYqDV+yqIuv8i9BMq2J3tgBrA/vxIUmYtZbSpLUWCbEEQH3 EEhQ== X-Gm-Message-State: AOAM5321wKW8Nqktbd43GmPzAp/8FoV8J8XO5wOznYWGYDn/XqEKi0Ax qR/rkYC74DXp4iXWtgjfnh+H8Iami6CaGg== X-Google-Smtp-Source: ABdhPJzWjPAq/+wSLXsDr6b4UwE1vuFy1KQXhwVGQOoQHF1fUJNt/kV5dXFrDCCUu4if9hZQSa6+Ww== X-Received: by 2002:adf:93e6:: with SMTP id 93mr12157974wrp.197.1607671227659; Thu, 10 Dec 2020 23:20:27 -0800 (PST) Received: from ?IPv6:2a01:e0a:1dc:b1c0:e9ab:5afc:e85e:23c8? ([2a01:e0a:1dc:b1c0:e9ab:5afc:e85e:23c8]) by smtp.googlemail.com with ESMTPSA id p3sm13046325wrs.50.2020.12.10.23.20.26 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Thu, 10 Dec 2020 23:20:26 -0800 (PST) To: "libstdc++@gcc.gnu.org" , gcc-patches From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= Subject: [PATCH] Complete _GLIBCXX_DEBUG constexpr compatibility Message-ID: <3dfe6dda-329b-2ee8-ecdb-2c1c147044f7@gmail.com> Date: Fri, 11 Dec 2020 08:20:26 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.10.0 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="------------03E2BC5585D150BCDA942CBB" Content-Language: fr X-Spam-Status: No, score=-9.0 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SCC_10_SHORT_WORD_LINES, SCC_5_SHORT_WORD_LINES, 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: libstdc++@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Libstdc++ mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 11 Dec 2020 07:20:31 -0000 This is a multi-part message in MIME format. --------------03E2BC5585D150BCDA942CBB Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Hi I'd like to commit this small fix to complete _GLIBCXX_DEBUG constexpr compatibility. There are still 2 macros not using __glibcxx_assert_1. It fixes the generated diagnostic to have the __failed_assertion rather than a message saying that _Error_formatter::_M_error is not constexpr.     libstdc++: Fix _GLIBCXX_DEBUG mode constexpr compatibility     The __glibcxx_check_can_[increment|decrement]_range macros are using the     _GLIBCXX_DEBUG_VERIFY_COND_AT macro which is not constexpr compliant and will produce nasty     diagnostics rather than the std::__failed_assertion dedicated to constexpr. Replace it with     correct _GLIBCXX_DEBUG_VERIFY_AT_F.     libstdc++-v3/ChangeLog:             * include/debug/macros.h (__glibcxx_check_can_increment_range): Replace             _GLIBCXX_DEBUG_VERIFY_COND_AT usage with _GLIBCXX_DEBUG_VERIFY_AT_F.             (__glibcxx_check_can_decrement_range): Likewise.             * testsuite/25_algorithms/copy_backward/constexpr.cc (test03): New.             * testsuite/25_algorithms/copy/debug/constexpr_neg.cc: New test.             * testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc: New test.             * testsuite/25_algorithms/equal/constexpr_neg.cc: New test.             * testsuite/25_algorithms/equal/debug/constexpr_neg.cc: New test. Tested under Linux x86_64 normal and debug modes. Ok to commit ? François --------------03E2BC5585D150BCDA942CBB Content-Type: text/x-patch; charset=UTF-8; name="debug_constexpr.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="debug_constexpr.patch" diff --git a/libstdc++-v3/include/debug/macros.h b/libstdc++-v3/include/debug/macros.h index ef4c76c747a..a69310d9a12 100644 --- a/libstdc++-v3/include/debug/macros.h +++ b/libstdc++-v3/include/debug/macros.h @@ -98,13 +98,13 @@ _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Size), \ do \ { \ typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\ - _GLIBCXX_DEBUG_VERIFY_COND_AT( \ + _GLIBCXX_DEBUG_VERIFY_AT_F( \ __gnu_debug::__valid_range(_First1, _Last1, __dist),\ _M_message(__gnu_debug::__msg_valid_range) \ ._M_iterator(_First1, #_First1) \ ._M_iterator(_Last1, #_Last1), \ __FILE__,__LINE__,__PRETTY_FUNCTION__); \ - _GLIBCXX_DEBUG_VERIFY_COND_AT( \ + _GLIBCXX_DEBUG_VERIFY_AT_F( \ __gnu_debug::__can_advance(_First2, __dist.first),\ _M_message(__gnu_debug::__msg_iter_subscript_oob)\ ._M_iterator(_First2, #_First2) \ @@ -116,13 +116,13 @@ _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Size), \ do \ { \ typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\ - _GLIBCXX_DEBUG_VERIFY_COND_AT( \ + _GLIBCXX_DEBUG_VERIFY_AT_F( \ __gnu_debug::__valid_range(_First1, _Last1, __dist),\ _M_message(__gnu_debug::__msg_valid_range) \ ._M_iterator(_First1, #_First1) \ ._M_iterator(_Last1, #_Last1), \ __FILE__,__LINE__,__PRETTY_FUNCTION__); \ - _GLIBCXX_DEBUG_VERIFY_COND_AT( \ + _GLIBCXX_DEBUG_VERIFY_AT_F( \ __gnu_debug::__can_advance(_First2, -__dist.first),\ _M_message(__gnu_debug::__msg_iter_subscript_oob)\ ._M_iterator(_First2, #_First2) \ diff --git a/libstdc++-v3/testsuite/25_algorithms/copy/debug/constexpr_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy/debug/constexpr_neg.cc new file mode 100644 index 00000000000..fc66a2f8fca --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/copy/debug/constexpr_neg.cc @@ -0,0 +1,53 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a xfail *-*-* } } +// { dg-require-debug-mode "" } + +#include +#include + +constexpr bool +test1() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + std::array ma0{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + const auto out6 = std::copy(ca0.begin() + 8, ca0.begin(), ma0.begin() + 2); + + return out6 == ma0.begin() + 10; +} + +static_assert(test1()); // { dg-error "non-constant condition" } + +constexpr bool +test2() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + std::array ma0{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + const auto out6 = std::copy(ca0.begin(), ca0.begin() + 8, ma0.begin() + 10); + + return out6 == ma0.begin() + 18; +} + +static_assert(test2()); // { dg-error "is outside the bounds" } + +// { dg-prune-output "in 'constexpr' expansion" } +// { dg-prune-output "failed_assertion" } +// { dg-prune-output "non-constant condition" } diff --git a/libstdc++-v3/testsuite/25_algorithms/copy_backward/constexpr.cc b/libstdc++-v3/testsuite/25_algorithms/copy_backward/constexpr.cc index e97e30e0777..b98cb0dd17f 100644 --- a/libstdc++-v3/testsuite/25_algorithms/copy_backward/constexpr.cc +++ b/libstdc++-v3/testsuite/25_algorithms/copy_backward/constexpr.cc @@ -52,3 +52,15 @@ test02() } static_assert(test02()); + +constexpr bool +test03() +{ + std::array ma0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + const auto out7 = std::copy_backward(ma0.begin(), ma0.begin() + 8, + ma0.begin() + 10); + + return out7 == ma0.begin() + 2 && *out7 == 0 && *(ma0.begin() + 9) == 7; +} + +static_assert(test03()); diff --git a/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc new file mode 100644 index 00000000000..6e2dc2f8f9d --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/copy_backward/debug/constexpr_neg.cc @@ -0,0 +1,40 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a xfail *-*-* } } +// { dg-require-debug-mode "" } + +#include +#include + +constexpr bool +test() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + std::array ma0{{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; + + const auto out7 = std::copy_backward(ca0.begin() + 8, ca0.begin(), + ma0.begin() + 10); + + return true; +} + +static_assert(test()); // { dg-error "non-constant condition" } + +// { dg-prune-output "in 'constexpr' expansion" } +// { dg-prune-output "failed_assertion" } diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/constexpr_neg.cc b/libstdc++-v3/testsuite/25_algorithms/equal/constexpr_neg.cc new file mode 100644 index 00000000000..206c1cf406d --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/equal/constexpr_neg.cc @@ -0,0 +1,50 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a xfail *-*-* } } +// { dg-require-normal-mode "" } + +#include +#include + +constexpr bool +test01() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + constexpr std::array ca1{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + + const auto outa = std::equal(ca0.end(), ca0.begin(), ca1.begin()); + return outa; +} + +static_assert(test01()); // { dg-error "outside the bounds" } + +constexpr bool +test02() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + constexpr std::array ca1{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}; + + const auto outa = std::equal(ca0.begin(), ca0.end(), ca1.begin()); + return outa; +} + +static_assert(test02()); // { dg-error "outside the bounds" } + +// { dg-prune-output "non-constant condition" } +// { dg-prune-output "in 'constexpr'" } diff --git a/libstdc++-v3/testsuite/25_algorithms/equal/debug/constexpr_neg.cc b/libstdc++-v3/testsuite/25_algorithms/equal/debug/constexpr_neg.cc new file mode 100644 index 00000000000..3a6903c9d00 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/equal/debug/constexpr_neg.cc @@ -0,0 +1,51 @@ +// Copyright (C) 2020 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +// { dg-options "-std=gnu++2a" } +// { dg-do compile { target c++2a xfail *-*-* } } +// { dg-require-debug-mode "" } + +#include +#include + +constexpr bool +test01() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + constexpr std::array ca1{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + + const auto outa = std::equal(ca0.end(), ca0.begin(), ca1.begin()); + return outa; +} + +static_assert(test01()); // { dg-error } + +constexpr bool +test02() +{ + constexpr std::array ca0{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}; + constexpr std::array ca1{{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}; + + const auto outa = std::equal(ca0.begin(), ca0.end(), ca1.begin()); + return outa; +} + +static_assert(test02()); // { dg-error "outside the bounds" } + +// { dg-prune-output "non-constant condition" } +// { dg-prune-output "in 'constexpr'" } +// { dg-prune-output "failed_assertion" } --------------03E2BC5585D150BCDA942CBB--