diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2021-06-04 20:25:39 +0100 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2021-06-04 21:33:53 +0100 |
commit | 3e5f2425f80aedd00f28235022a2755eb46f310d (patch) | |
tree | d629e785f5d1254166bae2313c16727247b863ae | |
parent | c7070b31e12c18905ed0a60aaedd7a071aab5c60 (diff) | |
download | gcc-3e5f2425f80aedd00f28235022a2755eb46f310d.zip gcc-3e5f2425f80aedd00f28235022a2755eb46f310d.tar.gz gcc-3e5f2425f80aedd00f28235022a2755eb46f310d.tar.bz2 |
libstdc++: Fix helper concept for ranges::data [PR 100824]
We need to decay the result of t.data() before checking if it's a
pointer.
Signed-off-by: Jonathan Wakely <jwakely@redhat.com>
libstdc++-v3/ChangeLog:
PR libstdc++/100824
* include/bits/ranges_base.h (__member_data): Use __decay_copy.
* testsuite/std/ranges/access/data.cc: Add testcase from PR.
-rw-r--r-- | libstdc++-v3/include/bits/ranges_base.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/std/ranges/access/data.cc | 6 |
2 files changed, 9 insertions, 3 deletions
diff --git a/libstdc++-v3/include/bits/ranges_base.h b/libstdc++-v3/include/bits/ranges_base.h index 17a421a..61d91eb 100644 --- a/libstdc++-v3/include/bits/ranges_base.h +++ b/libstdc++-v3/include/bits/ranges_base.h @@ -495,8 +495,10 @@ namespace ranges && is_object_v<remove_pointer_t<_Tp>>; template<typename _Tp> - concept __member_data - = requires(_Tp& __t) { { __t.data() } -> __pointer_to_object; }; + concept __member_data = requires(_Tp& __t) + { + { __cust_access::__decay_copy(__t.data()) } -> __pointer_to_object; + }; template<typename _Tp> concept __begin_data = requires(_Tp& __t) diff --git a/libstdc++-v3/testsuite/std/ranges/access/data.cc b/libstdc++-v3/testsuite/std/ranges/access/data.cc index 237bbcc..4f16f44 100644 --- a/libstdc++-v3/testsuite/std/ranges/access/data.cc +++ b/libstdc++-v3/testsuite/std/ranges/access/data.cc @@ -92,8 +92,12 @@ test03() // ranges::data should treat the subexpression as an lvalue VERIFY( std::ranges::data(std::move(r)) == &R3::i ); VERIFY( std::ranges::data(std::move(c)) == &R3::l ); -} + // PR libstdc++/100824 comment 3 + // Check for member data() should use decay-copy + struct A { int*&& data(); }; + static_assert( has_data<A&> ); +} int main() |