From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by sourceware.org (Postfix) with ESMTPS id CC28A385F034; Sun, 8 Aug 2021 19:34:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CC28A385F034 Received: by mail-wm1-x32c.google.com with SMTP id o7-20020a05600c5107b0290257f956e02dso12984599wms.1; Sun, 08 Aug 2021 12:34:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:from:to:cc:references:message-id:date :user-agent:mime-version:in-reply-to:content-language; bh=9Y+0e9GX84wd+m45qvMoCgFaG+erqBUJVPXigNa/0Fc=; b=EI6nIe/NTnPsjitXuu/www36O+T5ZIkEmEwCQEj82FLsHJ+TZyPjoZat4nKNcJAweK DVDuejRmOdckA+hqj67v1hjd/TFwG7RZT9V/mm9IzSbIVtWsz0GIKFp17/BcYlCDeHjB 4t2M1kUH01NfngHPydHUxeI738JYRUSR53bDKxkQafg7boQgbasetJvcPFlLPtr65pMT CYaVvBW/rUu6tesJIMj/z7AhEwWqwjGAJ9GB6fz1oHerqU/u0KBQHGmp0jyWP50pHyac JuYWFpGRxSpniD5PudYFl6oxopyeG03mVjqGysst46RPB4lJGjluD+4d4A2T+d1itCYj WvGQ== X-Gm-Message-State: AOAM533rRjCj5boVTb9KYD1i17VOg3ZOMClTLJ0j7WnZWqEenFPpxe7f Dc+yzias/dUVGq1LmJraooujbKb+uag= X-Google-Smtp-Source: ABdhPJzP+u4FGvvcpipYldTDbNeT8nZd09eQ5tv7mnTBUB3ZI6clbM9ACqCM00iGz65X+MxBbwFesQ== X-Received: by 2002:a1c:1f17:: with SMTP id f23mr3467636wmf.136.1628451279513; Sun, 08 Aug 2021 12:34:39 -0700 (PDT) Received: from [192.168.42.180] (pop.92-184-112-220.mobile.abo.orange.fr. [92.184.112.220]) by smtp.googlemail.com with ESMTPSA id x12sm17277139wrt.35.2021.08.08.12.34.33 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 08 Aug 2021 12:34:37 -0700 (PDT) Subject: Re: [PATCH] Use _GLIBCXX_ASSERTIONS as _GLIBCXX_DEBUG light From: =?UTF-8?Q?Fran=c3=a7ois_Dumont?= To: Jonathan Wakely Cc: "libstdc++@gcc.gnu.org" , gcc-patches References: <6ccc9e9e-af8b-fd06-4ad3-4bc021aa364e@gmail.com> Message-ID: <7eacb79f-44a5-ba40-8090-39dd878f1855@gmail.com> Date: Sun, 8 Aug 2021 21:34:35 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.11.0 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------EC26EBE50AC9F49AF4893CBB" Content-Language: fr X-Spam-Status: No, score=-10.2 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, NICE_REPLY_A, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Sun, 08 Aug 2021 19:34:43 -0000 This is a multi-part message in MIME format. --------------EC26EBE50AC9F49AF4893CBB Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit After further testing here a fixed version which imply less changes. Moreover I already commit the fixes unrelated with this patch.     libstdc++: [_GLIBCXX_ASSERTIONS] Activate basic debug checks     libstdc++-v3/ChangeLog:             * include/bits/stl_algobase.h (equal): Use runtime-only _GLIBCXX_DEBUG check.             * include/bits/stl_iterator.h [_GLIBCXX_ASSERTIONS]: Include .             * include/debug/debug.h [_GLIBCXX_ASSERTIONS]: Define debug macros non-empty. Most of             the time do a simple valid_range check.             * include/debug/helper_functions.h: Cleanup comment about removed _Iter_base.             (__gnu_debug::__valid_range): Add __skip_if_constexpr parameter and skip check when true             and in a constexpr context.             * include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY): Define as __glibcxx_assert when only             _GLIBCXX_ASSERTIONS is defined.             (__glibcxx_check_valid_range): Add _SkipIfConstexpr parameter.             (__glibcxx_check_can_increment_range): Likewise.             * include/debug/safe_iterator.h (__valid_range): Adapt.             * include/debug/safe_local_iterator.h (__valid_range): Adapt.             * testsuite/24_iterators/istream_iterator/1.cc (test01): Skip iterator increment when             _GLIBCXX_ASSERTIONS is defined.             * testsuite/25_algorithms/copy/constexpr_neg.cc: New test.             * testsuite/25_algorithms/heap/1.cc: Skip operation complexity checks when _GLIBCXX_ASSERTIONS             is defined. Ok to commit ? François On 06/08/21 4:52 pm, François Dumont wrote: > On 07/06/21 6:25 am, François Dumont wrote: >> On 03/06/21 2:31 pm, Jonathan Wakely wrote: >>> >>>> +  } >>>> + >>>>   /* Checks that [first, last) is a valid range, and then returns >>>>    * __first. This routine is useful when we can't use a separate >>>>    * assertion statement because, e.g., we are in a constructor. >>>> @@ -260,8 +279,9 @@ namespace __gnu_debug >>>>     inline bool >>>>     __check_sorted(const _InputIterator& __first, const >>>> _InputIterator& __last) >>>>     { >>>> -      return __check_sorted_aux(__first, __last, >>>> -                std::__iterator_category(__first)); >>>> +      return __skip_debug_runtime_check() >>>> +    || __check_sorted_aux(__first, __last, >>>> +                  std::__iterator_category(__first)); >>> >>> Currently this function is never called at all ifndef _GLIBCXX_DEBUG. >>> With this change, it's going to be present for _GLIBCXX_ASSERTIONS, >>> and if it isn't inlined it's going to explode the code size. >>> >>> Some linux distros are already building the entire distro with >>> _GLIBCXX_ASSERTIONS so I think we need to be quite careful about this >>> kind of large change affecting every algo. >>> >>> So maybe we shouldn't enable these checks via _GLIBCXX_ASSERTIONS, but >>> a new macro. >>> >> _GLIBCXX_DEBUG is already rarely used, so will be yet another mode. >> >> So let's forget about all this, thanks. >> > I eventually wonder if your feedback was limited to the use of > __check_sorted and some other codes perhaps. > > So here is another proposal which activate a small subset of the > _GLIBCXX_DEBUG checks in _GLIBCXX_ASSERTIONS but with far less code. > > First, the _Error_formatter is not used, the injected checks are > simply using __glibcxx_assert. > > Second I reduced the number of accitaved checks, mostly the > __valid_range. > > I also enhance the valid_range check for constexpr because sometimes > the normal implementation is good enough to let the compiler diagnose > a potential issue in this context. This is for example the case of the > std::equal implementation whereas the std::copy implementation is too > defensive. > >     libstdc++: [_GLIBCXX_ASSERTIONS] Activate basic debug checks > >     libstdc++-v3/ChangeLog: > >             * include/bits/stl_algobase.h (equal): Use runtime-only > _GLIBCXX_DEBUG check. >             * include/bits/stl_iterator.h [_GLIBCXX_ASSERTIONS]: > Include . >             * include/debug/debug.h [_GLIBCXX_ASSERTIONS]: Define > debug macros non-empty. Most of >             the time do a simple valid_range check. >             * include/debug/helper_functions.h: Cleanup comment about > removed _Iter_base. >             (__valid_range): Add __skip_if_constexpr parameter and > skip check when in a constexpr >             context. >             * include/debug/macros.h (_GLIBCXX_DEBUG_VERIFY): Define > as __glibcxx_assert when only >             _GLIBCXX_ASSERTIONS is defined. >             (__glibcxx_check_valid_range): Add _SkipIfConstexpr > parameter. >             (__glibcxx_check_can_increment_range): Likewise. >             * testsuite/24_iterators/istream_iterator/1.cc (test01): > Skip iterator increment when >             _GLIBCXX_ASSERTIONS is defined. >             * testsuite/25_algorithms/copy/constexpr_neg.cc: New test. >             * testsuite/25_algorithms/heap/1.cc: Skip operation > complexity checks when _GLIBCXX_ASSERTIONS >             is defined. >             * > testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_neg.cc: > Fix dg-prune-output reason. >             * > testsuite/25_algorithms/lower_bound/debug/constexpr_partitioned_pred_neg.cc: > Likewise. >             * > testsuite/25_algorithms/lower_bound/debug/constexpr_valid_range_neg.cc: > Likewise. >             * > testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_neg.cc: > Likewise. >             * > testsuite/25_algorithms/upper_bound/debug/constexpr_partitioned_pred_neg.cc: > Likewise. >             * > testsuite/25_algorithms/upper_bound/debug/constexpr_valid_range_neg.cc: > Likewise. > > The last fixes below are due to the recent changes to the > __glibcxx_assert macro but it is close to the code I am changing so I > prefer to fix those here. > > Tested under Linux x86_64 w/o _GLIBCXX_ASSERTIONS. > > Ok to commit ? > > François > --------------EC26EBE50AC9F49AF4893CBB Content-Type: text/x-patch; charset=UTF-8; name="assertion_mode.patch" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="assertion_mode.patch" diff --git a/libstdc++-v3/include/bits/stl_algobase.h b/libstdc++-v3/include/bits/stl_algobase.h index d0c49628d7f..d45eec4339b 100644 --- a/libstdc++-v3/include/bits/stl_algobase.h +++ b/libstdc++-v3/include/bits/stl_algobase.h @@ -1551,7 +1551,7 @@ _GLIBCXX_BEGIN_NAMESPACE_ALGO __glibcxx_function_requires(_EqualOpConcept< typename iterator_traits<_II1>::value_type, typename iterator_traits<_II2>::value_type>) - __glibcxx_requires_can_increment_range(__first1, __last1, __first2); + __glibcxx_requires_can_increment_range_runtime(__first1, __last1, __first2); return std::__equal_aux(__first1, __last1, __first2); } diff --git a/libstdc++-v3/include/bits/stl_iterator.h b/libstdc++-v3/include/bits/stl_iterator.h index c5b02408c1c..a8986d11dfe 100644 --- a/libstdc++-v3/include/bits/stl_iterator.h +++ b/libstdc++-v3/include/bits/stl_iterator.h @@ -2463,7 +2463,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION _GLIBCXX_END_NAMESPACE_VERSION } // namespace -#ifdef _GLIBCXX_DEBUG +#ifdef _GLIBCXX_ASSERTIONS # include #endif diff --git a/libstdc++-v3/include/debug/debug.h b/libstdc++-v3/include/debug/debug.h index 116f2f023e2..4ff027eaa74 100644 --- a/libstdc++-v3/include/debug/debug.h +++ b/libstdc++-v3/include/debug/debug.h @@ -61,12 +61,13 @@ namespace __gnu_debug struct _Safe_iterator; } -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS # define __glibcxx_requires_cond(_Cond,_Msg) # define __glibcxx_requires_valid_range(_First,_Last) # define __glibcxx_requires_can_increment(_First,_Size) # define __glibcxx_requires_can_increment_range(_First1,_Last1,_First2) +# define __glibcxx_requires_can_increment_range_runtime(_First1,_Last1,_First2) # define __glibcxx_requires_can_decrement_range(_First1,_Last1,_First2) # define __glibcxx_requires_sorted(_First,_Last) # define __glibcxx_requires_sorted_pred(_First,_Last,_Pred) @@ -87,6 +88,7 @@ namespace __gnu_debug #else +# ifdef _GLIBCXX_DEBUG # include # define __glibcxx_requires_cond(_Cond,_Msg) _GLIBCXX_DEBUG_VERIFY(_Cond,_Msg) @@ -95,7 +97,9 @@ namespace __gnu_debug # define __glibcxx_requires_can_increment(_First,_Size) \ __glibcxx_check_can_increment(_First,_Size) # define __glibcxx_requires_can_increment_range(_First1,_Last1,_First2) \ - __glibcxx_check_can_increment_range(_First1,_Last1,_First2) + __glibcxx_check_can_increment_range(_First1,_Last1,_First2,false) +# define __glibcxx_requires_can_increment_range_runtime(_First1,_Last1,_First2) \ + __glibcxx_check_can_increment_range(_First1,_Last1,_First2,true) # define __glibcxx_requires_can_decrement_range(_First1,_Last1,_First2) \ __glibcxx_check_can_decrement_range(_First1,_Last1,_First2) # define __glibcxx_requires_sorted(_First,_Last) \ @@ -131,7 +135,50 @@ namespace __gnu_debug __glibcxx_check_irreflexive_pred2(_First,_Last,_Pred) # include +# else +# define __glibcxx_requires_cond(_Cond,_Msg) __glibcxx_assert(_Cond) +# define __glibcxx_requires_valid_range(_First,_Last) \ + __glibcxx_assert(__gnu_debug::__valid_range(_First,_Last)) +# define __glibcxx_requires_can_increment(_First,_Size) \ + __glibcxx_assert(__gnu_debug::__can_advance(_First,_Size)) +# define __glibcxx_requires_can_increment_range(_First1,_Last1,_First2) \ + __glibcxx_requires_valid_range(_First1,_Last1) +# define __glibcxx_requires_can_increment_range_runtime(_First1,_Last1,_First2) \ + __glibcxx_assert(__gnu_debug::__valid_range(_First1,_Last1,true)) +# define __glibcxx_requires_can_decrement_range(_First1,_Last1,_First2) \ + __glibcxx_requires_valid_range(_First1,_Last1) +# define __glibcxx_requires_sorted(_First,_Last) \ + __glibcxx_requires_valid_range(_First,_Last); \ + __glibcxx_requires_irreflexive(_First,_Last) +# define __glibcxx_requires_sorted_pred(_First,_Last,_Pred) \ + __glibcxx_requires_valid_range(_First,_Last); \ + __glibcxx_requires_irreflexive_pred(_First,_Last,_Pred) +# define __glibcxx_requires_sorted_set(_First1,_Last1,_First2) \ + __glibcxx_requires_valid_range(_First1,_Last1) +# define __glibcxx_requires_sorted_set_pred(_First1,_Last1,_First2,_Pred) \ + __glibcxx_requires_valid_range(_First1,_Last1) +# define __glibcxx_requires_partitioned_lower(_First,_Last,_Value) \ + __glibcxx_requires_valid_range(_First,_Last) +# define __glibcxx_requires_partitioned_upper(_First,_Last,_Value) \ + __glibcxx_requires_valid_range(_First,_Last) +# define __glibcxx_requires_partitioned_lower_pred(_First,_Last,_Value,_Pred) \ + __glibcxx_requires_valid_range(_First,_Last) +# define __glibcxx_requires_partitioned_upper_pred(_First,_Last,_Value,_Pred) \ + __glibcxx_requires_valid_range(_First,_Last) +# define __glibcxx_requires_heap(_First,_Last) +# define __glibcxx_requires_heap_pred(_First,_Last,_Pred) +# define __glibcxx_requires_string(_String) +# define __glibcxx_requires_string_len(_String,_Len) +# define __glibcxx_requires_irreflexive(_First,_Last) \ + __glibcxx_assert(_First == _Last || !(*_First < *_First)) +# define __glibcxx_requires_irreflexive2(_First,_Last) +# define __glibcxx_requires_irreflexive_pred(_First,_Last,_Pred) \ + __glibcxx_assert(_First == _Last || !_Pred(*_First < *_First)) +# define __glibcxx_requires_irreflexive_pred2(_First,_Last,_Pred) + +# include +# endif /* _GLIBCXX_DEBUG */ -#endif +#endif /* _GLIBCXX_ASSERTIONS */ #endif // _GLIBCXX_DEBUG_MACRO_SWITCH_H diff --git a/libstdc++-v3/include/debug/helper_functions.h b/libstdc++-v3/include/debug/helper_functions.h index c0144ced979..e4e582aefb9 100644 --- a/libstdc++-v3/include/debug/helper_functions.h +++ b/libstdc++-v3/include/debug/helper_functions.h @@ -30,8 +30,8 @@ #define _GLIBCXX_DEBUG_HELPER_FUNCTIONS_H 1 #include // for __addressof -#include // for iterator_traits, - // categories and _Iter_base +#include // for iterator_traits and + // categories #include // for __is_integer #include // for pair @@ -237,8 +237,13 @@ namespace __gnu_debug _GLIBCXX20_CONSTEXPR inline bool __valid_range(_InputIterator __first, _InputIterator __last, - typename _Distance_traits<_InputIterator>::__type& __dist) + typename _Distance_traits<_InputIterator>::__type& __dist, + bool __skip_if_constexpr __attribute__ ((__unused__)) = false) { +#ifdef __cpp_lib_is_constant_evaluated + if (std::is_constant_evaluated() && __skip_if_constexpr) + return true; +#endif typedef typename std::__is_integer<_InputIterator>::__type _Integral; return __valid_range_aux(__first, __last, __dist, _Integral()); } @@ -247,21 +252,28 @@ namespace __gnu_debug bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>&, const _Safe_iterator<_Iterator, _Sequence, _Category>&, - typename _Distance_traits<_Iterator>::__type&); + typename _Distance_traits<_Iterator>::__type&, + bool __skip_if_constexpr = false); #if __cplusplus >= 201103L template bool __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>&, const _Safe_local_iterator<_Iterator, _Sequence>&, - typename _Distance_traits<_Iterator>::__type&); + typename _Distance_traits<_Iterator>::__type&, + bool __skip_if_constexpr = false); #endif template _GLIBCXX14_CONSTEXPR inline bool - __valid_range(_InputIterator __first, _InputIterator __last) + __valid_range(_InputIterator __first, _InputIterator __last, + bool __skip_if_constexpr __attribute__ ((__unused__)) = false) { +#ifdef __cpp_lib_is_constant_evaluated + if (std::is_constant_evaluated() && __skip_if_constexpr) + return true; +#endif typedef typename std::__is_integer<_InputIterator>::__type _Integral; return __valid_range_aux(__first, __last, _Integral()); } @@ -269,13 +281,15 @@ namespace __gnu_debug template bool __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>&, - const _Safe_iterator<_Iterator, _Sequence, _Category>&); + const _Safe_iterator<_Iterator, _Sequence, _Category>&, + bool __skip_if_constexpr = false); #if __cplusplus >= 201103L template bool __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>&, - const _Safe_local_iterator<_Iterator, _Sequence>&); + const _Safe_local_iterator<_Iterator, _Sequence>&, + bool __skip_if_constexpr = false); #endif // Fallback method, always ok. diff --git a/libstdc++-v3/include/debug/macros.h b/libstdc++-v3/include/debug/macros.h index 9e1288cf4d9..5332ad09d22 100644 --- a/libstdc++-v3/include/debug/macros.h +++ b/libstdc++-v3/include/debug/macros.h @@ -100,12 +100,12 @@ _GLIBCXX_DEBUG_VERIFY(__gnu_debug::__can_advance(_First, _Size), \ ._M_iterator(_First, #_First) \ ._M_integer(_Way * _Dist.first, #_Dist)) -#define __glibcxx_check_can_increment_range(_First1,_Last1,_First2) \ +#define __glibcxx_check_can_increment_range(_First1,_Last1,_First2,_SkipIfConstexpr) \ do \ { \ typename __gnu_debug::_Distance_traits<__decltype(_First1)>::__type __dist;\ _GLIBCXX_DEBUG_VERIFY_AT_F( \ - __gnu_debug::__valid_range(_First1, _Last1, __dist),\ + __gnu_debug::__valid_range(_First1, _Last1, __dist, _SkipIfConstexpr), \ _M_message(__gnu_debug::__msg_valid_range) \ ._M_iterator(_First1, #_First1) \ ._M_iterator(_Last1, #_Last1), \ diff --git a/libstdc++-v3/include/debug/safe_iterator.h b/libstdc++-v3/include/debug/safe_iterator.h index 5584d06de5a..003557f2e59 100644 --- a/libstdc++-v3/include/debug/safe_iterator.h +++ b/libstdc++-v3/include/debug/safe_iterator.h @@ -965,7 +965,8 @@ namespace __gnu_debug _Category>& __first, const _Safe_iterator<_Iterator, _Sequence, _Category>& __last, - typename _Distance_traits<_Iterator>::__type& __dist) + typename _Distance_traits<_Iterator>::__type& __dist, + bool /* __skip_if_constexpr */) { return __first._M_valid_range(__last, __dist); } template @@ -973,7 +974,8 @@ namespace __gnu_debug __valid_range(const _Safe_iterator<_Iterator, _Sequence, _Category>& __first, const _Safe_iterator<_Iterator, _Sequence, - _Category>& __last) + _Category>& __last, + bool /* __skip_if_constexpr */) { typename _Distance_traits<_Iterator>::__type __dist; return __first._M_valid_range(__last, __dist); diff --git a/libstdc++-v3/include/debug/safe_local_iterator.h b/libstdc++-v3/include/debug/safe_local_iterator.h index 31c48e65a24..732965860c0 100644 --- a/libstdc++-v3/include/debug/safe_local_iterator.h +++ b/libstdc++-v3/include/debug/safe_local_iterator.h @@ -408,13 +408,15 @@ namespace __gnu_debug inline bool __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>& __first, const _Safe_local_iterator<_Iterator, _Sequence>& __last, - typename _Distance_traits<_Iterator>::__type& __dist_info) + typename _Distance_traits<_Iterator>::__type& __dist_info, + bool /* __skip_if_constexpr */) { return __first._M_valid_range(__last, __dist_info); } template inline bool __valid_range(const _Safe_local_iterator<_Iterator, _Sequence>& __first, - const _Safe_local_iterator<_Iterator, _Sequence>& __last) + const _Safe_local_iterator<_Iterator, _Sequence>& __last, + bool /* __skip_if_constexpr */) { typename _Distance_traits<_Iterator>::__type __dist_info; return __first._M_valid_range(__last, __dist_info); diff --git a/libstdc++-v3/testsuite/24_iterators/istream_iterator/1.cc b/libstdc++-v3/testsuite/24_iterators/istream_iterator/1.cc index 93085aa1471..ecf87a58797 100644 --- a/libstdc++-v3/testsuite/24_iterators/istream_iterator/1.cc +++ b/libstdc++-v3/testsuite/24_iterators/istream_iterator/1.cc @@ -48,7 +48,7 @@ void test01() ss.str("-1 -2 -3"); VERIFY( iter == end ); -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS // This is undefined, so aborts under debug mode. // Without debug mode, it should not extract anything from the stream, // and the iterator should remain at end-of-stream. diff --git a/libstdc++-v3/testsuite/25_algorithms/copy/constexpr_neg.cc b/libstdc++-v3/testsuite/25_algorithms/copy/constexpr_neg.cc new file mode 100644 index 00000000000..8840f31a1d9 --- /dev/null +++ b/libstdc++-v3/testsuite/25_algorithms/copy/constexpr_neg.cc @@ -0,0 +1,52 @@ +// Copyright (C) 2021 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 -D_GLIBCXX_ASSERTIONS" } +// { dg-do compile { target c++2a xfail *-*-* } } + +#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 "builtin_unreachable" } +// { dg-prune-output "non-constant condition" } diff --git a/libstdc++-v3/testsuite/25_algorithms/heap/1.cc b/libstdc++-v3/testsuite/25_algorithms/heap/1.cc index 69793de429f..9be4337729e 100644 --- a/libstdc++-v3/testsuite/25_algorithms/heap/1.cc +++ b/libstdc++-v3/testsuite/25_algorithms/heap/1.cc @@ -83,7 +83,7 @@ test02() { Gt gt; -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS //const int logN = static_cast(std::log(static_cast(N)) + 0.5); const int logN = 3; #endif @@ -95,7 +95,7 @@ test02() for (int i = 2; i <= N; ++i) { std::push_heap(s1, s1 + i, gt); -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS VERIFY(gt.count() <= logN); #endif gt.reset(); @@ -104,7 +104,7 @@ test02() for (int i = N; i >= 2; --i) { std::pop_heap(s1, s1 + i, gt); -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS VERIFY(gt.count() <= 2 * logN); #endif gt.reset(); @@ -118,13 +118,13 @@ test02() VERIFY(std::equal(s2, s2 + N, A)); std::make_heap(s2, s2 + N, gt); -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS VERIFY(gt.count() <= 3 * N); #endif gt.reset(); std::sort_heap(s2, s2 + N, gt); -#ifndef _GLIBCXX_DEBUG +#ifndef _GLIBCXX_ASSERTIONS VERIFY(gt.count() <= N * logN); #endif --------------EC26EBE50AC9F49AF4893CBB--