aboutsummaryrefslogtreecommitdiff
path: root/libstdc++-v3
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2024-11-11 11:54:00 +0000
committerJonathan Wakely <redi@gcc.gnu.org>2024-11-11 18:57:16 +0000
commit128f6a6d7af9cf187d59c1dbd9e59f5b782e17c8 (patch)
treed0ed287555769a925dede95da203bc4ec08bc90b /libstdc++-v3
parentd8992f70a59b178de85305c542eb45d1676bf0a9 (diff)
downloadgcc-128f6a6d7af9cf187d59c1dbd9e59f5b782e17c8.zip
gcc-128f6a6d7af9cf187d59c1dbd9e59f5b782e17c8.tar.gz
gcc-128f6a6d7af9cf187d59c1dbd9e59f5b782e17c8.tar.bz2
libstdc++: Fix typos in iterator increment for std::text_encoding [PR117520]
The intended behaviour for std::text_encoding::aliases_view's iterator is that it incrementing or decrementing too far sets it to a value-initialized state, or fails an assertion when those are enabled. There were typos that used == instead of = which meant that instead of becoming singular or aborting, an out-of-range increment just did nothing. This meant erroneous operations were well-defined and didn't produce any undefined behaviour, but were not diagnosed with assertions enabled, as had been intended. This change fixes the bugs and adds more tests to verify the intended behaviour. libstdc++-v3/ChangeLog: PR libstdc++/117520 * include/std/text_encoding (aliases_view:_Iterator::operator+=): Fix typos that caused == to be used instead of =. (aliases_view::_Iterator): Fix friend declaration. * testsuite/std/text_encoding/members.cc: Adjust expected behaviour of invalid subscript. Add tests for other erroneous operations on iterators.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r--libstdc++-v3/include/std/text_encoding6
-rw-r--r--libstdc++-v3/testsuite/std/text_encoding/members.cc19
2 files changed, 20 insertions, 5 deletions
diff --git a/libstdc++-v3/include/std/text_encoding b/libstdc++-v3/include/std/text_encoding
index 48742dc..6fcaed1 100644
--- a/libstdc++-v3/include/std/text_encoding
+++ b/libstdc++-v3/include/std/text_encoding
@@ -575,7 +575,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
&& _M_rep[__n - 1]._M_id == _M_id) [[likely]]
_M_rep += __n;
else
- *this == _Iterator{};
+ *this = _Iterator{};
}
else if (__n < 0)
{
@@ -583,7 +583,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
&& _M_rep[__n]._M_id == _M_id) [[likely]]
_M_rep += __n;
else
- *this == _Iterator{};
+ *this = _Iterator{};
}
}
if (__n != 0)
@@ -645,7 +645,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
}
private:
- friend class text_encoding;
+ friend struct text_encoding;
constexpr explicit
_Iterator(const _Rep* __r) noexcept
diff --git a/libstdc++-v3/testsuite/std/text_encoding/members.cc b/libstdc++-v3/testsuite/std/text_encoding/members.cc
index adbd74a..2536532 100644
--- a/libstdc++-v3/testsuite/std/text_encoding/members.cc
+++ b/libstdc++-v3/testsuite/std/text_encoding/members.cc
@@ -70,10 +70,25 @@ test_every_id()
auto end = aliases.end();
VERIFY( (begin + std::ranges::distance(aliases)) == end );
#ifndef _GLIBCXX_ASSERTIONS
- // This is an error, but with assertions disabled is guaranteed safe:
+ // These ops violate preconditions, but as libstdc++ extensions they are
+ // guaranteed to either assert or have well-defined behaviour.
+
+ // This erroneously returns ""sv:
VERIFY( begin[std::ranges::distance(aliases)] == ""sv );
// Likewise:
- VERIFY( begin[999999] == *begin );
+ VERIFY( begin[999999] == ""sv );
+
+ auto iter = begin;
+ std::ranges::advance(iter, end);
+ // Erroneously sets iter to a value-initialized state.
+ ++iter;
+ VERIFY( iter == decltype(iter){} );
+ VERIFY( *iter == ""sv );
+
+ iter = begin;
+ // Erroneously sets iter to a value-initialized state.
+ --iter;
+ VERIFY( iter == decltype(iter){} );
#endif
}
}