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 >