* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] [not found] ` <CACb0b4kQAvpDkWVW00GwPU+ve3T-TMQxhZrJSKs9jzYK+zN=DQ@mail.gmail.com> @ 2024-03-14 21:49 ` François Dumont 2024-03-16 12:16 ` François Dumont 0 siblings, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-14 21:49 UTC (permalink / raw) To: Jonathan Wakely, Maciej Miera; +Cc: libstdc++, gcc-patches Hi This is what I started to do. For now I haven't touch to __cpp_lib_null_iterators definition as _Safe_local_iterator still need some work. libstdc++: Implement N3644 on _Safe_iterator<> [PR114316] Consider range of value-initialized iterators as valid and empty. libstdc++-v3/ChangeLog: PR libstdc++/114316 * include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_valid_range): First check if both iterators are value-initialized before checking if singular. * testsuite/23_containers/set/debug/114316.cc: New test case. * testsuite/23_containers/vector/debug/114316.cc: New test case. Tested under Linux x86_64, ok to commit ? François On 12/03/2024 10:52, Jonathan Wakely wrote: > On Tue, 12 Mar 2024 at 01:03, Jonathan Wakely <jwakely@redhat.com> wrote: >> On Tue, 12 Mar 2024 at 00:55, Maciej Miera <maciej.miera@gmail.com> wrote: >>> >>> >>> Wiadomość napisana przez Jonathan Wakely <jwakely@redhat.com> w dniu 11.03.2024, o godz. 21:40: >>> >>> On Mon, 11 Mar 2024 at 20:07, Maciej Miera <maciej.miera@gmail.com> wrote: >>> >>> >>> Hello, >>> >>> I have tried to introduce an extra level of safety to my codebase and utilize _GLIBCXX_DEBUG in my test builds in order to catch faulty iterators. >>> However, I have encountered the following problem: I would like to utilize singular, value-initialized iterators as an arbitrary "null range”. >>> However, this leads to failed assertions in std:: algorithms taking such range. >>> >>> Consider the following code sample with find_if: >>> >>> #include <map> >>> #include <algorithm> >>> #include <iterator> >>> >>> #ifndef __cpp_lib_null_iterators >>> #warning "Not standard compliant" >>> #endif >>> >>> int main() >>> { >>> std::multimap<char, int>::iterator it1{}; >>> std::multimap<char, int>::iterator it2{}; >>> >>> (void) (it1==it2); // OK >>> (void) std::find_if( >>> it1, it2, [](const auto& el) { return el.second == 8;}); >>> } >>> >>> Compiled with -std=c++20 and -D_GLIBCXX_DEBUG it produces the warning "Not standard compliant" >>> and the execution results in the following assert failure: >>> >>> /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algo.h:3875: >>> In function: >>> constexpr _IIter std::find_if(_IIter, _IIter, _Predicate) [with _IIter = >>> gnu_debug::_Safe_iterator<_Rb_tree_iterator<pair<const char, int> >, >>> debug::multimap<char, int>, bidirectional_iterator_tag>; _Predicate = >>> main()::<lambda(const auto:16&)>] >>> >>> The question is though: is it by design, or is it just a mere oversight? The warning actually suggest the first option. >>> If it is an intentional design choice, could you provide some rationale behind it, please? >>> >>> >>> The macro was not defined because the C++14 rule wasn't implemented >>> for debug mode, but that should have been fixed for GCC 11, according >>> to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98466 and >>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70303 >>> So we should be able to define macro now, except maybe it wasn't fixed >>> for the RB tree containers. >>> >>> >>> >>> Just to make sure there are no misunderstandings: comparison via == works fine. The feature check macro without _GLIBCXX_DEBUG and with <iterator> included is also fine. Maybe the need to include a header is the issue, but that’s not the core of the problem anyway. >> No, it has nothing to do with the headers included. The feature test >> macro is defined like so: >> >> # if (__cplusplus >= 201402L) && (!defined(_GLIBCXX_DEBUG)) >> # define __glibcxx_null_iterators 201304L >> >> It's a very deliberate choice to not define it when _GLIBCXX_DEBUG is >> defined. But as I said, I think we should have changed that. >> >>> The actual question is though, whether passing singular iterators to std algorithms (like find_if) should make the asserts at the beginning of the algo function fail when compiled with _GLIBCXX_DEBUG. IMHO, intuitively it should not, as comparing iterators equal would just ensure early exit and return of the same singular iterator. >>> This seems not to be the case though. The actual message is this: >>> Error: the function requires a valid iterator range [first, last). >>> What bothers me is whether the empty virtual range limited by two same singular iterators is actually valid or not. >> Yes, it's valid. So the bug is in the __glibcxx_requires_valid_range macro. > Thanks for the bugzilla report: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114316 > We'll get it fixed! > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-14 21:49 ` _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] François Dumont @ 2024-03-16 12:16 ` François Dumont 2024-03-17 11:45 ` Jonathan Wakely 0 siblings, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-16 12:16 UTC (permalink / raw) To: Jonathan Wakely, Maciej Miera; +Cc: libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 4963 bytes --] With the patch, sorry. On 14/03/2024 22:49, François Dumont wrote: > Hi > > This is what I started to do. > > For now I haven't touch to __cpp_lib_null_iterators definition as > _Safe_local_iterator still need some work. > > libstdc++: Implement N3644 on _Safe_iterator<> [PR114316] > > Consider range of value-initialized iterators as valid and empty. > > libstdc++-v3/ChangeLog: > > PR libstdc++/114316 > * include/debug/safe_iterator.tcc > (_Safe_iterator<>::_M_valid_range): > First check if both iterators are value-initialized before > checking if > singular. > * testsuite/23_containers/set/debug/114316.cc: New test case. > * testsuite/23_containers/vector/debug/114316.cc: New test case. > > Tested under Linux x86_64, ok to commit ? > > François > > > On 12/03/2024 10:52, Jonathan Wakely wrote: >> On Tue, 12 Mar 2024 at 01:03, Jonathan Wakely <jwakely@redhat.com> >> wrote: >>> On Tue, 12 Mar 2024 at 00:55, Maciej Miera <maciej.miera@gmail.com> >>> wrote: >>>> >>>> >>>> Wiadomość napisana przez Jonathan Wakely <jwakely@redhat.com> w >>>> dniu 11.03.2024, o godz. 21:40: >>>> >>>> On Mon, 11 Mar 2024 at 20:07, Maciej Miera <maciej.miera@gmail.com> >>>> wrote: >>>> >>>> >>>> Hello, >>>> >>>> I have tried to introduce an extra level of safety to my codebase >>>> and utilize _GLIBCXX_DEBUG in my test builds in order to catch >>>> faulty iterators. >>>> However, I have encountered the following problem: I would like to >>>> utilize singular, value-initialized iterators as an arbitrary "null >>>> range”. >>>> However, this leads to failed assertions in std:: algorithms taking >>>> such range. >>>> >>>> Consider the following code sample with find_if: >>>> >>>> #include <map> >>>> #include <algorithm> >>>> #include <iterator> >>>> >>>> #ifndef __cpp_lib_null_iterators >>>> #warning "Not standard compliant" >>>> #endif >>>> >>>> int main() >>>> { >>>> std::multimap<char, int>::iterator it1{}; >>>> std::multimap<char, int>::iterator it2{}; >>>> >>>> (void) (it1==it2); // OK >>>> (void) std::find_if( >>>> it1, it2, [](const auto& el) { return el.second == 8;}); >>>> } >>>> >>>> Compiled with -std=c++20 and -D_GLIBCXX_DEBUG it produces the >>>> warning "Not standard compliant" >>>> and the execution results in the following assert failure: >>>> >>>> /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algo.h:3875: >>>> >>>> In function: >>>> constexpr _IIter std::find_if(_IIter, _IIter, _Predicate) [with >>>> _IIter = >>>> gnu_debug::_Safe_iterator<_Rb_tree_iterator<pair<const char, int> >, >>>> debug::multimap<char, int>, bidirectional_iterator_tag>; >>>> _Predicate = >>>> main()::<lambda(const auto:16&)>] >>>> >>>> The question is though: is it by design, or is it just a mere >>>> oversight? The warning actually suggest the first option. >>>> If it is an intentional design choice, could you provide some >>>> rationale behind it, please? >>>> >>>> >>>> The macro was not defined because the C++14 rule wasn't implemented >>>> for debug mode, but that should have been fixed for GCC 11, according >>>> to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98466 and >>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70303 >>>> So we should be able to define macro now, except maybe it wasn't fixed >>>> for the RB tree containers. >>>> >>>> >>>> >>>> Just to make sure there are no misunderstandings: comparison via == >>>> works fine. The feature check macro without _GLIBCXX_DEBUG and with >>>> <iterator> included is also fine. Maybe the need to include a >>>> header is the issue, but that’s not the core of the problem anyway. >>> No, it has nothing to do with the headers included. The feature test >>> macro is defined like so: >>> >>> # if (__cplusplus >= 201402L) && (!defined(_GLIBCXX_DEBUG)) >>> # define __glibcxx_null_iterators 201304L >>> >>> It's a very deliberate choice to not define it when _GLIBCXX_DEBUG is >>> defined. But as I said, I think we should have changed that. >>> >>>> The actual question is though, whether passing singular iterators >>>> to std algorithms (like find_if) should make the asserts at the >>>> beginning of the algo function fail when compiled with >>>> _GLIBCXX_DEBUG. IMHO, intuitively it should not, as comparing >>>> iterators equal would just ensure early exit and return of the same >>>> singular iterator. >>>> This seems not to be the case though. The actual message is this: >>>> Error: the function requires a valid iterator range [first, last). >>>> What bothers me is whether the empty virtual range limited by two >>>> same singular iterators is actually valid or not. >>> Yes, it's valid. So the bug is in the __glibcxx_requires_valid_range >>> macro. >> Thanks for the bugzilla report: >> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114316 >> We'll get it fixed! >> [-- Attachment #2: pr104316.txt --] [-- Type: text/plain, Size: 2121 bytes --] diff --git a/libstdc++-v3/include/debug/safe_iterator.tcc b/libstdc++-v3/include/debug/safe_iterator.tcc index a8b24233e85..4b2baf2980e 100644 --- a/libstdc++-v3/include/debug/safe_iterator.tcc +++ b/libstdc++-v3/include/debug/safe_iterator.tcc @@ -194,6 +194,12 @@ namespace __gnu_debug std::pair<difference_type, _Distance_precision>& __dist, bool __check_dereferenceable) const { + if (_M_value_initialized() && __rhs._M_value_initialized()) + { + __dist = std::make_pair(0, __dp_exact); + return true; + } + if (_M_singular() || __rhs._M_singular() || !_M_can_compare(__rhs)) return false; @@ -218,6 +224,12 @@ namespace __gnu_debug std::pair<difference_type, _Distance_precision>& __dist) const { + if (this->_M_value_initialized() && __rhs._M_value_initialized()) + { + __dist = std::make_pair(0, __dp_exact); + return true; + } + if (this->_M_singular() || __rhs._M_singular() || !this->_M_can_compare(__rhs)) return false; diff --git a/libstdc++-v3/testsuite/23_containers/set/debug/114316.cc b/libstdc++-v3/testsuite/23_containers/set/debug/114316.cc new file mode 100644 index 00000000000..126ec89b5e0 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/set/debug/114316.cc @@ -0,0 +1,16 @@ +// { dg-do run { target c++11 } } +// { dg-require-debug-mode "" } + +// PR libstdc++/114316 + +#include <set> +#include <algorithm> + +#include <testsuite_hooks.h> + +int main() +{ + std::set<int>::iterator it{}; + VERIFY( std::find(it, it, 0) == it ); + return 0; +} diff --git a/libstdc++-v3/testsuite/23_containers/vector/debug/114316.cc b/libstdc++-v3/testsuite/23_containers/vector/debug/114316.cc new file mode 100644 index 00000000000..f211cf67b4c --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/debug/114316.cc @@ -0,0 +1,16 @@ +// { dg-do run { target c++11 } } +// { dg-require-debug-mode "" } + +// PR libstdc++/114316 + +#include <vector> +#include <algorithm> + +#include <testsuite_hooks.h> + +int main() +{ + std::vector<int>::iterator it{}; + VERIFY( std::find(it, it, 0) == it ); + return 0; +} ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-16 12:16 ` François Dumont @ 2024-03-17 11:45 ` Jonathan Wakely 2024-03-17 16:52 ` François Dumont 0 siblings, 1 reply; 14+ messages in thread From: Jonathan Wakely @ 2024-03-17 11:45 UTC (permalink / raw) To: François Dumont Cc: Jonathan Wakely, Maciej Miera, libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 5505 bytes --] On Sat, 16 Mar 2024, 12:16 François Dumont, <frs.dumont@gmail.com> wrote: > With the patch, sorry. > > On 14/03/2024 22:49, François Dumont wrote: > > Hi > > > > This is what I started to do. > > > > For now I haven't touch to __cpp_lib_null_iterators definition as > > _Safe_local_iterator still need some work. > > > > libstdc++: Implement N3644 on _Safe_iterator<> [PR114316] > > > > Consider range of value-initialized iterators as valid and empty. > > > > libstdc++-v3/ChangeLog: > > > > PR libstdc++/114316 > > * include/debug/safe_iterator.tcc > > (_Safe_iterator<>::_M_valid_range): > > First check if both iterators are value-initialized before > > checking if > > singular. > > * testsuite/23_containers/set/debug/114316.cc: New test case. > > * testsuite/23_containers/vector/debug/114316.cc: New test case. > > > > Tested under Linux x86_64, ok to commit ? > OK for trunk, thanks! I think this is OK to backport to 13 too. Maybe after this we can define the __cpp_lib_null_itetators macro for debug mode? > > > François > > > > > > On 12/03/2024 10:52, Jonathan Wakely wrote: > >> On Tue, 12 Mar 2024 at 01:03, Jonathan Wakely <jwakely@redhat.com> > >> wrote: > >>> On Tue, 12 Mar 2024 at 00:55, Maciej Miera <maciej.miera@gmail.com> > >>> wrote: > >>>> > >>>> > >>>> Wiadomość napisana przez Jonathan Wakely <jwakely@redhat.com> w > >>>> dniu 11.03.2024, o godz. 21:40: > >>>> > >>>> On Mon, 11 Mar 2024 at 20:07, Maciej Miera <maciej.miera@gmail.com> > >>>> wrote: > >>>> > >>>> > >>>> Hello, > >>>> > >>>> I have tried to introduce an extra level of safety to my codebase > >>>> and utilize _GLIBCXX_DEBUG in my test builds in order to catch > >>>> faulty iterators. > >>>> However, I have encountered the following problem: I would like to > >>>> utilize singular, value-initialized iterators as an arbitrary "null > >>>> range”. > >>>> However, this leads to failed assertions in std:: algorithms taking > >>>> such range. > >>>> > >>>> Consider the following code sample with find_if: > >>>> > >>>> #include <map> > >>>> #include <algorithm> > >>>> #include <iterator> > >>>> > >>>> #ifndef __cpp_lib_null_iterators > >>>> #warning "Not standard compliant" > >>>> #endif > >>>> > >>>> int main() > >>>> { > >>>> std::multimap<char, int>::iterator it1{}; > >>>> std::multimap<char, int>::iterator it2{}; > >>>> > >>>> (void) (it1==it2); // OK > >>>> (void) std::find_if( > >>>> it1, it2, [](const auto& el) { return el.second == 8;}); > >>>> } > >>>> > >>>> Compiled with -std=c++20 and -D_GLIBCXX_DEBUG it produces the > >>>> warning "Not standard compliant" > >>>> and the execution results in the following assert failure: > >>>> > >>>> > /opt/compiler-explorer/gcc-12.2.0/include/c++/12.2.0/bits/stl_algo.h:3875: > >>>> > >>>> In function: > >>>> constexpr _IIter std::find_if(_IIter, _IIter, _Predicate) [with > >>>> _IIter = > >>>> gnu_debug::_Safe_iterator<_Rb_tree_iterator<pair<const char, int> >, > >>>> debug::multimap<char, int>, bidirectional_iterator_tag>; > >>>> _Predicate = > >>>> main()::<lambda(const auto:16&)>] > >>>> > >>>> The question is though: is it by design, or is it just a mere > >>>> oversight? The warning actually suggest the first option. > >>>> If it is an intentional design choice, could you provide some > >>>> rationale behind it, please? > >>>> > >>>> > >>>> The macro was not defined because the C++14 rule wasn't implemented > >>>> for debug mode, but that should have been fixed for GCC 11, according > >>>> to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98466 and > >>>> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70303 > >>>> So we should be able to define macro now, except maybe it wasn't fixed > >>>> for the RB tree containers. > >>>> > >>>> > >>>> > >>>> Just to make sure there are no misunderstandings: comparison via == > >>>> works fine. The feature check macro without _GLIBCXX_DEBUG and with > >>>> <iterator> included is also fine. Maybe the need to include a > >>>> header is the issue, but that’s not the core of the problem anyway. > >>> No, it has nothing to do with the headers included. The feature test > >>> macro is defined like so: > >>> > >>> # if (__cplusplus >= 201402L) && (!defined(_GLIBCXX_DEBUG)) > >>> # define __glibcxx_null_iterators 201304L > >>> > >>> It's a very deliberate choice to not define it when _GLIBCXX_DEBUG is > >>> defined. But as I said, I think we should have changed that. > >>> > >>>> The actual question is though, whether passing singular iterators > >>>> to std algorithms (like find_if) should make the asserts at the > >>>> beginning of the algo function fail when compiled with > >>>> _GLIBCXX_DEBUG. IMHO, intuitively it should not, as comparing > >>>> iterators equal would just ensure early exit and return of the same > >>>> singular iterator. > >>>> This seems not to be the case though. The actual message is this: > >>>> Error: the function requires a valid iterator range [first, last). > >>>> What bothers me is whether the empty virtual range limited by two > >>>> same singular iterators is actually valid or not. > >>> Yes, it's valid. So the bug is in the __glibcxx_requires_valid_range > >>> macro. > >> Thanks for the bugzilla report: > >> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114316 > >> We'll get it fixed! > >> ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-17 11:45 ` Jonathan Wakely @ 2024-03-17 16:52 ` François Dumont 2024-03-17 18:14 ` François Dumont 2024-03-18 7:45 ` Jonathan Wakely 0 siblings, 2 replies; 14+ messages in thread From: François Dumont @ 2024-03-17 16:52 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Jonathan Wakely, libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 1082 bytes --] > > OK for trunk, thanks! > > I think this is OK to backport to 13 too. > > Maybe after this we can define the __cpp_lib_null_itetators macro for > debug mode? > After this fix of local_iterator I think we can indeed. In fact the added 11316.cc was already passing for unordered_set<>::local_iterator but simply because we were missing the singular check. Both issues solved with this patch. I found the version.def file to cleanup but no idea how to regenerate version.h from it so I'll let you do it, ok ? libstdc++: Fix _Safe_local_iterator<>::_M_valid_range Unordered container local_iterator range shall not contain any singular iterator unless both iterators are value-initialized. libstdc++-v3/ChangeLog: * include/debug/safe_local_iterator.tcc (_Safe_local_iterator::_M_valid_range): Add _M_value_initialized and _M_singular checks. * testsuite/23_containers/unordered_set/debug/114316.cc: New test case. Ok to commit ? François [-- Attachment #2: safe_local_iterator.txt --] [-- Type: text/plain, Size: 1491 bytes --] diff --git a/libstdc++-v3/include/debug/safe_local_iterator.tcc b/libstdc++-v3/include/debug/safe_local_iterator.tcc index 90e60e37c32..6d546ec040c 100644 --- a/libstdc++-v3/include/debug/safe_local_iterator.tcc +++ b/libstdc++-v3/include/debug/safe_local_iterator.tcc @@ -78,7 +78,13 @@ namespace __gnu_debug _M_valid_range(const _Safe_local_iterator& __rhs, std::pair<difference_type, _Distance_precision>& __dist) const { - if (!_M_can_compare(__rhs)) + if (_M_value_initialized() && __rhs._M_value_initialized()) + { + __dist = { 0, __dp_exact }; + return true; + } + + if (_M_singular() || __rhs._M_singular() || !_M_can_compare(__rhs)) return false; if (bucket() != __rhs.bucket()) diff --git a/libstdc++-v3/testsuite/23_containers/unordered_set/debug/114316.cc b/libstdc++-v3/testsuite/23_containers/unordered_set/debug/114316.cc new file mode 100644 index 00000000000..41b649a9cbd --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/unordered_set/debug/114316.cc @@ -0,0 +1,28 @@ +// { dg-do run { target c++11 } } +// { dg-require-debug-mode "" } + +// PR libstdc++/114316 + +#include <unordered_set> +#include <algorithm> + +#include <testsuite_hooks.h> + +void test01() +{ + std::unordered_set<int>::iterator it{}; + VERIFY( std::find(it, it, 0) == it ); +} + +void test02() +{ + std::unordered_set<int>::local_iterator it{}; + VERIFY( std::find(it, it, 0) == it ); +} + +int main() +{ + test01(); + test02(); + return 0; +} ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-17 16:52 ` François Dumont @ 2024-03-17 18:14 ` François Dumont 2024-03-18 7:45 ` Jonathan Wakely 2024-03-18 7:45 ` Jonathan Wakely 1 sibling, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-17 18:14 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Jonathan Wakely, libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 1865 bytes --] I was a little bit too confident below. After review of all _M_singular usages I found another necessary fix. After this one for sure we will be able to define __cpp_lib_null_iterators even in Debug mode. libstdc++: Fix N3344 behavior on _Safe_iterator::_M_can_advance We shall be able to advance from a 0 offset a value-initialized iterator. libstdc++-v3/ChangeLog: * include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_can_advance): Accept 0 offset advance on value-initialized iterator. * testsuite/23_containers/vector/debug/n3644.cc: New test case. Ok to commit ? François On 17/03/2024 17:52, François Dumont wrote: > >> >> OK for trunk, thanks! >> >> I think this is OK to backport to 13 too. >> >> Maybe after this we can define the __cpp_lib_null_itetators macro for >> debug mode? >> > After this fix of local_iterator I think we can indeed. > > In fact the added 11316.cc was already passing for > unordered_set<>::local_iterator but simply because we were missing the > singular check. Both issues solved with this patch. > > I found the version.def file to cleanup but no idea how to regenerate > version.h from it so I'll let you do it, ok ? > > libstdc++: Fix _Safe_local_iterator<>::_M_valid_range > > Unordered container local_iterator range shall not contain any > singular > iterator unless both iterators are value-initialized. > > libstdc++-v3/ChangeLog: > > * include/debug/safe_local_iterator.tcc > (_Safe_local_iterator::_M_valid_range): Add > _M_value_initialized and > _M_singular checks. > * testsuite/23_containers/unordered_set/debug/114316.cc: > New test case. > > > Ok to commit ? > > François [-- Attachment #2: n3344_patch.txt --] [-- Type: text/plain, Size: 1088 bytes --] diff --git a/libstdc++-v3/include/debug/safe_iterator.tcc b/libstdc++-v3/include/debug/safe_iterator.tcc index 4b2baf2980e..deaa84d0a1f 100644 --- a/libstdc++-v3/include/debug/safe_iterator.tcc +++ b/libstdc++-v3/include/debug/safe_iterator.tcc @@ -86,6 +86,9 @@ namespace __gnu_debug _Safe_iterator<_Iterator, _Sequence, _Category>:: _M_can_advance(difference_type __n, bool __strict) const { + if (this->_M_value_initialized() && __n == 0) + return true; + if (this->_M_singular()) return false; diff --git a/libstdc++-v3/testsuite/23_containers/vector/debug/n3644.cc b/libstdc++-v3/testsuite/23_containers/vector/debug/n3644.cc new file mode 100644 index 00000000000..052c52f26b7 --- /dev/null +++ b/libstdc++-v3/testsuite/23_containers/vector/debug/n3644.cc @@ -0,0 +1,16 @@ +// { dg-do run { target c++11 } } +// { dg-require-debug-mode "" } + +#include <vector> +#include <algorithm> + +#include <testsuite_hooks.h> + +int main() +{ + std::vector<int>::iterator it{}; + auto cpy = it; + std::advance(it, 0); + VERIFY( it == cpy ); + return 0; +} ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-17 18:14 ` François Dumont @ 2024-03-18 7:45 ` Jonathan Wakely 2024-03-18 21:38 ` François Dumont 0 siblings, 1 reply; 14+ messages in thread From: Jonathan Wakely @ 2024-03-18 7:45 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Sun, 17 Mar 2024 at 18:14, François Dumont <frs.dumont@gmail.com> wrote: > > I was a little bit too confident below. After review of all _M_singular > usages I found another necessary fix. > > After this one for sure we will be able to define > __cpp_lib_null_iterators even in Debug mode. > > libstdc++: Fix N3344 behavior on _Safe_iterator::_M_can_advance > > We shall be able to advance from a 0 offset a value-initialized > iterator. > > libstdc++-v3/ChangeLog: > > * include/debug/safe_iterator.tcc > (_Safe_iterator<>::_M_can_advance): > Accept 0 offset advance on value-initialized iterator. > * testsuite/23_containers/vector/debug/n3644.cc: New test case. > > Ok to commit ? OK, thanks. > François > > > On 17/03/2024 17:52, François Dumont wrote: > > > >> > >> OK for trunk, thanks! > >> > >> I think this is OK to backport to 13 too. > >> > >> Maybe after this we can define the __cpp_lib_null_itetators macro for > >> debug mode? > >> > > After this fix of local_iterator I think we can indeed. > > > > In fact the added 11316.cc was already passing for > > unordered_set<>::local_iterator but simply because we were missing the > > singular check. Both issues solved with this patch. > > > > I found the version.def file to cleanup but no idea how to regenerate > > version.h from it so I'll let you do it, ok ? > > > > libstdc++: Fix _Safe_local_iterator<>::_M_valid_range > > > > Unordered container local_iterator range shall not contain any > > singular > > iterator unless both iterators are value-initialized. > > > > libstdc++-v3/ChangeLog: > > > > * include/debug/safe_local_iterator.tcc > > (_Safe_local_iterator::_M_valid_range): Add > > _M_value_initialized and > > _M_singular checks. > > * testsuite/23_containers/unordered_set/debug/114316.cc: > > New test case. > > > > > > Ok to commit ? > > > > François ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-18 7:45 ` Jonathan Wakely @ 2024-03-18 21:38 ` François Dumont 2024-03-19 9:31 ` Jonathan Wakely 0 siblings, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-18 21:38 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Jonathan Wakely, libstdc++, gcc-patches Both committed now. Just to confirm, those 2 last patches should be backported to gcc-13 branch, right ? I might have a try to update version.h but if you want to do it before don't hesitate. François On 18/03/2024 08:45, Jonathan Wakely wrote: > On Sun, 17 Mar 2024 at 18:14, François Dumont <frs.dumont@gmail.com> wrote: >> I was a little bit too confident below. After review of all _M_singular >> usages I found another necessary fix. >> >> After this one for sure we will be able to define >> __cpp_lib_null_iterators even in Debug mode. >> >> libstdc++: Fix N3344 behavior on _Safe_iterator::_M_can_advance >> >> We shall be able to advance from a 0 offset a value-initialized >> iterator. >> >> libstdc++-v3/ChangeLog: >> >> * include/debug/safe_iterator.tcc >> (_Safe_iterator<>::_M_can_advance): >> Accept 0 offset advance on value-initialized iterator. >> * testsuite/23_containers/vector/debug/n3644.cc: New test case. >> >> Ok to commit ? > > OK, thanks. > > >> François >> >> >> On 17/03/2024 17:52, François Dumont wrote: >>>> OK for trunk, thanks! >>>> >>>> I think this is OK to backport to 13 too. >>>> >>>> Maybe after this we can define the __cpp_lib_null_itetators macro for >>>> debug mode? >>>> >>> After this fix of local_iterator I think we can indeed. >>> >>> In fact the added 11316.cc was already passing for >>> unordered_set<>::local_iterator but simply because we were missing the >>> singular check. Both issues solved with this patch. >>> >>> I found the version.def file to cleanup but no idea how to regenerate >>> version.h from it so I'll let you do it, ok ? >>> >>> libstdc++: Fix _Safe_local_iterator<>::_M_valid_range >>> >>> Unordered container local_iterator range shall not contain any >>> singular >>> iterator unless both iterators are value-initialized. >>> >>> libstdc++-v3/ChangeLog: >>> >>> * include/debug/safe_local_iterator.tcc >>> (_Safe_local_iterator::_M_valid_range): Add >>> _M_value_initialized and >>> _M_singular checks. >>> * testsuite/23_containers/unordered_set/debug/114316.cc: >>> New test case. >>> >>> >>> Ok to commit ? >>> >>> François ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-18 21:38 ` François Dumont @ 2024-03-19 9:31 ` Jonathan Wakely 2024-03-19 15:41 ` Jonathan Wakely 0 siblings, 1 reply; 14+ messages in thread From: Jonathan Wakely @ 2024-03-19 9:31 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Mon, 18 Mar 2024 at 21:38, François Dumont wrote: > > Both committed now. > > Just to confirm, those 2 last patches should be backported to gcc-13 > branch, right ? Yes please. > > I might have a try to update version.h but if you want to do it before > don't hesitate. You'll need to have 'autogen' installed to do it (I'm going to update the docs to describe that today). ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-19 9:31 ` Jonathan Wakely @ 2024-03-19 15:41 ` Jonathan Wakely 2024-03-20 5:59 ` François Dumont 0 siblings, 1 reply; 14+ messages in thread From: Jonathan Wakely @ 2024-03-19 15:41 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Tue, 19 Mar 2024 at 09:31, Jonathan Wakely wrote: > > On Mon, 18 Mar 2024 at 21:38, François Dumont wrote: > > > > Both committed now. > > > > Just to confirm, those 2 last patches should be backported to gcc-13 > > branch, right ? > > Yes please. > > > > > I might have a try to update version.h but if you want to do it before > > don't hesitate. > > You'll need to have 'autogen' installed to do it (I'm going to update > the docs to describe that today). I've documented it in a new "Generated files" section at the end of https://gcc.gnu.org/onlinedocs/libstdc++/manual/appendix_porting.html#build_hacking.generated ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-19 15:41 ` Jonathan Wakely @ 2024-03-20 5:59 ` François Dumont 2024-03-20 9:02 ` Jonathan Wakely 0 siblings, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-20 5:59 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Jonathan Wakely, libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 1215 bytes --] Thanks to you doc: libstdc++: [_GLIBCXX_DEBUG] Define __[glibcxx,cpp_lib]_null_iterators _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we can define __glibcxx_null_iterators and __cpp_lib_null_iterators macros like the normal mode. libstdc++-v3/ChangeLog: * version.def (null_iterators): Remove extra_cond. * version.h: Regenerate. Ok to commit ? I already noticed that GCC 13 has no version.h file so no backport question. François On 19/03/2024 16:41, Jonathan Wakely wrote: > On Tue, 19 Mar 2024 at 09:31, Jonathan Wakely wrote: >> On Mon, 18 Mar 2024 at 21:38, François Dumont wrote: >>> Both committed now. >>> >>> Just to confirm, those 2 last patches should be backported to gcc-13 >>> branch, right ? >> Yes please. >> >>> I might have a try to update version.h but if you want to do it before >>> don't hesitate. >> You'll need to have 'autogen' installed to do it (I'm going to update >> the docs to describe that today). > I've documented it in a new "Generated files" section at the end of > https://gcc.gnu.org/onlinedocs/libstdc++/manual/appendix_porting.html#build_hacking.generated > [-- Attachment #2: version_patch.txt --] [-- Type: text/plain, Size: 927 bytes --] diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def index be5af18e818..26e62c6a9b2 100644 --- a/libstdc++-v3/include/bits/version.def +++ b/libstdc++-v3/include/bits/version.def @@ -209,7 +209,6 @@ ftms = { values = { v = 201304; cxxmin = 14; - extra_cond = "!defined(_GLIBCXX_DEBUG)"; }; }; diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h index 9107b45a484..23c8c09ab4b 100644 --- a/libstdc++-v3/include/bits/version.h +++ b/libstdc++-v3/include/bits/version.h @@ -214,7 +214,7 @@ #undef __glibcxx_want_make_reverse_iterator #if !defined(__cpp_lib_null_iterators) -# if (__cplusplus >= 201402L) && (!defined(_GLIBCXX_DEBUG)) +# if (__cplusplus >= 201402L) # define __glibcxx_null_iterators 201304L # if defined(__glibcxx_want_all) || defined(__glibcxx_want_null_iterators) # define __cpp_lib_null_iterators 201304L ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-20 5:59 ` François Dumont @ 2024-03-20 9:02 ` Jonathan Wakely 2024-03-20 18:10 ` François Dumont 0 siblings, 1 reply; 14+ messages in thread From: Jonathan Wakely @ 2024-03-20 9:02 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Wed, 20 Mar 2024 at 05:59, François Dumont wrote: > > Thanks to you doc: > > libstdc++: [_GLIBCXX_DEBUG] Define __[glibcxx,cpp_lib]_null_iterators > > _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we > can define > __glibcxx_null_iterators and __cpp_lib_null_iterators macros like > the normal > mode. > > libstdc++-v3/ChangeLog: > > * version.def (null_iterators): Remove extra_cond. > * version.h: Regenerate. > > Ok to commit ? Please don't bother talking about __glibcxx_null_iterators in the commit message, that's an implementation detail that always mirrors the standard-defined __cpp_lib_null_iterators one. The first line of the commit will be much easier to read without that. OK with that change, thanks. > I already noticed that GCC 13 has no version.h file so no backport question. It has no version.h but it still has the macros: include/std/iterator:# define __cpp_lib_null_iterators 201304L include/std/version:# define __cpp_lib_null_iterators 201304L Those definitions can be made to not depend on _GLIBCXX_DEBUG. ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-20 9:02 ` Jonathan Wakely @ 2024-03-20 18:10 ` François Dumont 2024-03-21 6:20 ` Jonathan Wakely 0 siblings, 1 reply; 14+ messages in thread From: François Dumont @ 2024-03-20 18:10 UTC (permalink / raw) To: Jonathan Wakely; +Cc: Jonathan Wakely, libstdc++, gcc-patches [-- Attachment #1: Type: text/plain, Size: 1731 bytes --] As proposed below I also updated gcc-13 branch. libstdc++: [_GLIBCXX_DEBUG] Define __cpp_lib_null_iterators _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we can define __cpp_lib_null_iterators macros like the normal mode. libstdc++-v3/ChangeLog: * include/std/iterator (__cpp_lib_null_iterators): Define regardless of _GLIBCXX_DEBUG. * include/std/version (__cpp_lib_null_iterators): Likewise. François On 20/03/2024 10:02, Jonathan Wakely wrote: > On Wed, 20 Mar 2024 at 05:59, François Dumont wrote: >> Thanks to you doc: >> >> libstdc++: [_GLIBCXX_DEBUG] Define __[glibcxx,cpp_lib]_null_iterators >> >> _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we >> can define >> __glibcxx_null_iterators and __cpp_lib_null_iterators macros like >> the normal >> mode. >> >> libstdc++-v3/ChangeLog: >> >> * version.def (null_iterators): Remove extra_cond. >> * version.h: Regenerate. >> >> Ok to commit ? > Please don't bother talking about __glibcxx_null_iterators in the > commit message, that's an implementation detail that always mirrors > the standard-defined __cpp_lib_null_iterators one. The first line of > the commit will be much easier to read without that. > > OK with that change, thanks. > >> I already noticed that GCC 13 has no version.h file so no backport question. > It has no version.h but it still has the macros: > > include/std/iterator:# define __cpp_lib_null_iterators 201304L > include/std/version:# define __cpp_lib_null_iterators 201304L > > Those definitions can be made to not depend on _GLIBCXX_DEBUG. > [-- Attachment #2: version_patch.txt --] [-- Type: text/plain, Size: 1073 bytes --] diff --git a/libstdc++-v3/include/std/iterator b/libstdc++-v3/include/std/iterator index 695e18e2c47..a0a8eac570b 100644 --- a/libstdc++-v3/include/std/iterator +++ b/libstdc++-v3/include/std/iterator @@ -67,7 +67,7 @@ #endif #include <bits/range_access.h> -#if __cplusplus >= 201402L && ! defined _GLIBCXX_DEBUG // PR libstdc++/70303 +#if __cplusplus >= 201402L # define __cpp_lib_null_iterators 201304L #endif diff --git a/libstdc++-v3/include/std/version b/libstdc++-v3/include/std/version index bd1bee0190d..ee515c4e66c 100644 --- a/libstdc++-v3/include/std/version +++ b/libstdc++-v3/include/std/version @@ -81,9 +81,7 @@ #define __cpp_lib_integral_constant_callable 201304L #define __cpp_lib_is_final 201402L #define __cpp_lib_make_reverse_iterator 201402L -#ifndef _GLIBCXX_DEBUG // PR libstdc++/70303 -# define __cpp_lib_null_iterators 201304L -#endif +#define __cpp_lib_null_iterators 201304L #define __cpp_lib_robust_nonmodifying_seq_ops 201304L #define __cpp_lib_transformation_trait_aliases 201304L #define __cpp_lib_transparent_operators 201510L ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-20 18:10 ` François Dumont @ 2024-03-21 6:20 ` Jonathan Wakely 0 siblings, 0 replies; 14+ messages in thread From: Jonathan Wakely @ 2024-03-21 6:20 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Wed, 20 Mar 2024 at 18:11, François Dumont wrote: > > As proposed below I also updated gcc-13 branch. Great, thanks. > > libstdc++: [_GLIBCXX_DEBUG] Define __cpp_lib_null_iterators > > _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we > can define > __cpp_lib_null_iterators macros like the normal mode. > > libstdc++-v3/ChangeLog: > > * include/std/iterator (__cpp_lib_null_iterators): Define > regardless of > _GLIBCXX_DEBUG. > * include/std/version (__cpp_lib_null_iterators): Likewise. > > François > > > On 20/03/2024 10:02, Jonathan Wakely wrote: > > On Wed, 20 Mar 2024 at 05:59, François Dumont wrote: > >> Thanks to you doc: > >> > >> libstdc++: [_GLIBCXX_DEBUG] Define __[glibcxx,cpp_lib]_null_iterators > >> > >> _GLIBCXX_DEBUG has now fully N3344 compliant iterator checks, we > >> can define > >> __glibcxx_null_iterators and __cpp_lib_null_iterators macros like > >> the normal > >> mode. > >> > >> libstdc++-v3/ChangeLog: > >> > >> * version.def (null_iterators): Remove extra_cond. > >> * version.h: Regenerate. > >> > >> Ok to commit ? > > Please don't bother talking about __glibcxx_null_iterators in the > > commit message, that's an implementation detail that always mirrors > > the standard-defined __cpp_lib_null_iterators one. The first line of > > the commit will be much easier to read without that. > > > > OK with that change, thanks. > > > >> I already noticed that GCC 13 has no version.h file so no backport question. > > It has no version.h but it still has the macros: > > > > include/std/iterator:# define __cpp_lib_null_iterators 201304L > > include/std/version:# define __cpp_lib_null_iterators 201304L > > > > Those definitions can be made to not depend on _GLIBCXX_DEBUG. > > ^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] 2024-03-17 16:52 ` François Dumont 2024-03-17 18:14 ` François Dumont @ 2024-03-18 7:45 ` Jonathan Wakely 1 sibling, 0 replies; 14+ messages in thread From: Jonathan Wakely @ 2024-03-18 7:45 UTC (permalink / raw) To: François Dumont; +Cc: Jonathan Wakely, libstdc++, gcc-patches On Sun, 17 Mar 2024 at 16:52, François Dumont <frs.dumont@gmail.com> wrote: > > > > > > OK for trunk, thanks! > > > > I think this is OK to backport to 13 too. > > > > Maybe after this we can define the __cpp_lib_null_itetators macro for > > debug mode? > > > After this fix of local_iterator I think we can indeed. > > In fact the added 11316.cc was already passing for > unordered_set<>::local_iterator but simply because we were missing the > singular check. Both issues solved with this patch. > > I found the version.def file to cleanup but no idea how to regenerate > version.h from it so I'll let you do it, ok ? Sure, I can do that. To regenerate it run 'make update-version' in the libstdc++-v3/include build directory. > > libstdc++: Fix _Safe_local_iterator<>::_M_valid_range > > Unordered container local_iterator range shall not contain any singular > iterator unless both iterators are value-initialized. > > libstdc++-v3/ChangeLog: > > * include/debug/safe_local_iterator.tcc > (_Safe_local_iterator::_M_valid_range): Add > _M_value_initialized and > _M_singular checks. > * testsuite/23_containers/unordered_set/debug/114316.cc: > New test case. > > > Ok to commit ? OK. ^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2024-03-21 6:20 UTC | newest] Thread overview: 14+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- [not found] <73AC0523-2237-46FD-9885-7AE3F8663DF2@gmail.com> [not found] ` <CACb0b4=K2UNWaqRa884LWxk29KLqi7MwOXcNUq+a4rm6-a8rsw@mail.gmail.com> [not found] ` <28CE4FD1-FFB0-4300-81CA-C3CB07E436A6@gmail.com> [not found] ` <CACb0b4nbBPtsKybYBS6V=HwQur0Kbjg+nYpCDXAd8x0Bg6pWvw@mail.gmail.com> [not found] ` <CACb0b4kQAvpDkWVW00GwPU+ve3T-TMQxhZrJSKs9jzYK+zN=DQ@mail.gmail.com> 2024-03-14 21:49 ` _LIBCXX_DEBUG value initialized singular iterators assert failures in std algorithms [PR104316] François Dumont 2024-03-16 12:16 ` François Dumont 2024-03-17 11:45 ` Jonathan Wakely 2024-03-17 16:52 ` François Dumont 2024-03-17 18:14 ` François Dumont 2024-03-18 7:45 ` Jonathan Wakely 2024-03-18 21:38 ` François Dumont 2024-03-19 9:31 ` Jonathan Wakely 2024-03-19 15:41 ` Jonathan Wakely 2024-03-20 5:59 ` François Dumont 2024-03-20 9:02 ` Jonathan Wakely 2024-03-20 18:10 ` François Dumont 2024-03-21 6:20 ` Jonathan Wakely 2024-03-18 7:45 ` Jonathan Wakely
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).