diff options
author | Jonathan Wakely <jwakely@redhat.com> | 2020-02-24 11:45:20 +0000 |
---|---|---|
committer | Jonathan Wakely <jwakely@redhat.com> | 2020-02-24 12:15:05 +0000 |
commit | 3841739c29a54c0141c3156cdd47891c258b2b88 (patch) | |
tree | f69a311e19e72e8d4c1c05f38ba4af4f8dd12b8e /libstdc++-v3/include | |
parent | 7f5617b00445dcc861a498a4cecc8aaa59e05b8c (diff) | |
download | gcc-3841739c29a54c0141c3156cdd47891c258b2b88.zip gcc-3841739c29a54c0141c3156cdd47891c258b2b88.tar.gz gcc-3841739c29a54c0141c3156cdd47891c258b2b88.tar.bz2 |
libstdc++: enable_view has false positives (LWG 3326)
* include/std/ranges (__deep_const_range, __enable_view_impl): Remove.
(ranges::enable_view): Simplify (LWG 3326).
* include/bits/range_access.h (ranges::enable_view): Declare.
* include/bits/regex.h (__enable_view_impl): Remove partial
specialization.
* include/bits/stl_multiset.h (__enable_view_impl): Likewise.
* include/bits/stl_set.h (__enable_view_impl): Likewise.
* include/bits/unordered_set.h (__enable_view_impl): Likewise.
* include/debug/multiset.h (__enable_view_impl): Likewise.
* include/debug/set.h (__enable_view_impl): Likewise.
* include/debug/unordered_set (__enable_view_impl): Likewise.
* include/experimental/string_view (ranges::enable_view): Define
partial specialization.
* include/std/span (ranges::enable_view): Likewise.
* include/std/string_view (ranges::enable_view): Likewise.
* testsuite/std/ranges/view.cc: Check satisfaction of updated concept.
Diffstat (limited to 'libstdc++-v3/include')
-rw-r--r-- | libstdc++-v3/include/bits/range_access.h | 3 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/regex.h | 10 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_multiset.h | 11 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/stl_set.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/unordered_set.h | 15 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/multiset.h | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/set.h | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/debug/unordered_set | 16 | ||||
-rw-r--r-- | libstdc++-v3/include/experimental/string_view | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/std/ranges | 19 | ||||
-rw-r--r-- | libstdc++-v3/include/std/span | 7 | ||||
-rw-r--r-- | libstdc++-v3/include/std/string_view | 6 |
12 files changed, 20 insertions, 107 deletions
diff --git a/libstdc++-v3/include/bits/range_access.h b/libstdc++-v3/include/bits/range_access.h index eb91ade..8b276fd 100644 --- a/libstdc++-v3/include/bits/range_access.h +++ b/libstdc++-v3/include/bits/range_access.h @@ -346,6 +346,9 @@ namespace ranges template<typename _Tp> inline constexpr bool enable_borrowed_range = false; + template<typename _Tp> + extern const bool enable_view; + namespace __detail { template<integral _Tp> diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h index 3307e1c..dcae83e 100644 --- a/libstdc++-v3/include/bits/regex.h +++ b/libstdc++-v3/include/bits/regex.h @@ -2058,16 +2058,6 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11 _GLIBCXX_END_NAMESPACE_CXX11 -#if __cplusplus > 201703L -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Bi_iter, typename _Alloc> - inline constexpr bool __enable_view_impl<match_results<_Bi_iter, _Alloc>> - = false; -} // namespace ranges::__detail -#endif // C++20 - // [28.11.2] Function template regex_match /** * @name Matching, Searching, and Replacing diff --git a/libstdc++-v3/include/bits/stl_multiset.h b/libstdc++-v3/include/bits/stl_multiset.h index b8b8291..ab62df1 100644 --- a/libstdc++-v3/include/bits/stl_multiset.h +++ b/libstdc++-v3/include/bits/stl_multiset.h @@ -1038,17 +1038,6 @@ _GLIBCXX_END_NAMESPACE_CONTAINER _S_get_tree(_GLIBCXX_STD_C::multiset<_Val, _Cmp2, _Alloc>& __set) { return __set._M_t; } }; - -#if __cplusplus > 201703L -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Key, typename _Compare, typename _Alloc> - inline constexpr bool - __enable_view_impl<_GLIBCXX_STD_C::multiset<_Key, _Compare, _Alloc>> - = false; -} // namespace ranges::__detail -#endif // C++20 #endif // C++17 _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/bits/stl_set.h b/libstdc++-v3/include/bits/stl_set.h index 5f3e78d..4f8d631 100644 --- a/libstdc++-v3/include/bits/stl_set.h +++ b/libstdc++-v3/include/bits/stl_set.h @@ -1051,15 +1051,6 @@ _GLIBCXX_END_NAMESPACE_CONTAINER _S_get_tree(_GLIBCXX_STD_C::multiset<_Val, _Cmp2, _Alloc>& __set) { return __set._M_t; } }; -#if __cplusplus > 201703L -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Key, typename _Compare, typename _Alloc> - inline constexpr bool - __enable_view_impl<_GLIBCXX_STD_C::set<_Key, _Compare, _Alloc>> = false; -} // namespace ranges::__detail -#endif // C++20 #endif // C++17 _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/bits/unordered_set.h b/libstdc++-v3/include/bits/unordered_set.h index 824eedb..9c2cd45 100644 --- a/libstdc++-v3/include/bits/unordered_set.h +++ b/libstdc++-v3/include/bits/unordered_set.h @@ -1771,21 +1771,6 @@ _GLIBCXX_END_NAMESPACE_CONTAINER _S_get_table(unordered_multiset<_Val, _Hash2, _Eq2, _Alloc>& __set) { return __set._M_h; } }; - -#if __cplusplus > 201703L -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Val, typename _Hash, typename _Eq, typename _Alloc> - inline constexpr bool - __enable_view_impl<_GLIBCXX_STD_C::unordered_set<_Val, _Hash, _Eq, - _Alloc>> = false; - template<typename _Val, typename _Hash, typename _Eq, typename _Alloc> - inline constexpr bool - __enable_view_impl<_GLIBCXX_STD_C::unordered_multiset<_Val, _Hash, _Eq, - _Alloc>> = false; -} // namespace ranges::__detail -#endif // C++20 #endif // C++17 _GLIBCXX_END_NAMESPACE_VERSION diff --git a/libstdc++-v3/include/debug/multiset.h b/libstdc++-v3/include/debug/multiset.h index f5b974c..fcbba33 100644 --- a/libstdc++-v3/include/debug/multiset.h +++ b/libstdc++-v3/include/debug/multiset.h @@ -630,19 +630,6 @@ namespace __debug { return __x.swap(__y); } } // namespace __debug - -#if __cplusplus > 201703L -_GLIBCXX_BEGIN_NAMESPACE_VERSION -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Key, typename _Compare, typename _Alloc> - inline constexpr bool - __enable_view_impl<std::__debug::multiset<_Key, _Compare, _Alloc>> - = false; -} // namespace ranges::__detail -_GLIBCXX_END_NAMESPACE_VERSION -#endif // C++20 } // namespace std #endif diff --git a/libstdc++-v3/include/debug/set.h b/libstdc++-v3/include/debug/set.h index f3f9047..093ff12 100644 --- a/libstdc++-v3/include/debug/set.h +++ b/libstdc++-v3/include/debug/set.h @@ -641,18 +641,6 @@ namespace __debug { return __x.swap(__y); } } // namespace __debug - -#if __cplusplus > 201703L -_GLIBCXX_BEGIN_NAMESPACE_VERSION -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Key, typename _Compare, typename _Alloc> - inline constexpr bool - __enable_view_impl<std::__debug::set<_Key, _Compare, _Alloc>> = false; -} // namespace ranges::__detail -_GLIBCXX_END_NAMESPACE_VERSION -#endif // C++20 } // namespace std #endif diff --git a/libstdc++-v3/include/debug/unordered_set b/libstdc++-v3/include/debug/unordered_set index 040ae7f..9941bbe 100644 --- a/libstdc++-v3/include/debug/unordered_set +++ b/libstdc++-v3/include/debug/unordered_set @@ -1183,22 +1183,6 @@ namespace __debug { return !(__x == __y); } } // namespace __debug -#if __cplusplus > 201703L -_GLIBCXX_BEGIN_NAMESPACE_VERSION -namespace ranges::__detail -{ - template<typename _Tp> extern inline const bool __enable_view_impl; - template<typename _Val, typename _Hash, typename _Eq, typename _Alloc> - inline constexpr bool - __enable_view_impl<std::__debug::unordered_set<_Val, _Hash, _Eq, _Alloc>> - = false; - template<typename _Val, typename _Hash, typename _Eq, typename _Alloc> - inline constexpr bool - __enable_view_impl<std::__debug::unordered_multiset<_Val, _Hash, _Eq, - _Alloc>> = false; -} // namespace ranges::__detail -_GLIBCXX_END_NAMESPACE_VERSION -#endif // C++20 } // namespace std #endif // C++11 diff --git a/libstdc++-v3/include/experimental/string_view b/libstdc++-v3/include/experimental/string_view index 4396501..629db57 100644 --- a/libstdc++-v3/include/experimental/string_view +++ b/libstdc++-v3/include/experimental/string_view @@ -694,12 +694,16 @@ namespace experimental #if __cpp_lib_concepts namespace ranges { - template<typename> extern inline const bool enable_borrowed_range; // Opt-in to borrowed_range concept template<typename _CharT, typename _Traits> inline constexpr bool enable_borrowed_range<experimental::basic_string_view<_CharT, _Traits>> = true; + + // Opt-in to view concept + template<typename _CharT, typename _Traits> + inline constexpr bool + enable_view<experimental::basic_string_view<_CharT, _Traits>> = true; } #endif diff --git a/libstdc++-v3/include/std/ranges b/libstdc++-v3/include/std/ranges index 8c925fa..0b2057c 100644 --- a/libstdc++-v3/include/std/ranges +++ b/libstdc++-v3/include/std/ranges @@ -65,25 +65,8 @@ namespace ranges struct view_base { }; - namespace __detail - { - template<typename _Tp> - concept __deep_const_range = range<_Tp> && range<const _Tp> - && same_as<range_reference_t<_Tp>, range_reference_t<const _Tp>>; - - template<typename _Tp> - inline constexpr bool __enable_view_impl - = derived_from<_Tp, view_base> || (!__deep_const_range<_Tp>); - - template<typename _Tp> - inline constexpr bool __enable_view_impl<std::initializer_list<_Tp>> - = false; - - } // namespace __detail - template<typename _Tp> - inline constexpr bool enable_view - = __detail::__enable_view_impl<remove_cv_t<_Tp>>; + inline constexpr bool enable_view = derived_from<_Tp, view_base>; template<typename _Tp> concept view diff --git a/libstdc++-v3/include/std/span b/libstdc++-v3/include/std/span index 16b09a1..f658adb 100644 --- a/libstdc++-v3/include/std/span +++ b/libstdc++-v3/include/std/span @@ -447,11 +447,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION namespace ranges { - template<typename> extern inline const bool enable_borrowed_range; // Opt-in to borrowed_range concept template<typename _ElementType, size_t _Extent> inline constexpr bool enable_borrowed_range<span<_ElementType, _Extent>> = true; + + // Opt-in to view concept + template<typename _ElementType, size_t _Extent> + inline constexpr bool + enable_view<span<_ElementType, _Extent>> + = _Extent == 0 || _Extent == dynamic_extent; } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view index 16687f6..ea5d547 100644 --- a/libstdc++-v3/include/std/string_view +++ b/libstdc++-v3/include/std/string_view @@ -727,11 +727,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION #if __cpp_lib_concepts namespace ranges { - template<typename> extern inline const bool enable_borrowed_range; // Opt-in to borrowed_range concept template<typename _CharT, typename _Traits> inline constexpr bool enable_borrowed_range<basic_string_view<_CharT, _Traits>> = true; + + // Opt-in to view concept + template<typename _CharT, typename _Traits> + inline constexpr bool + enable_view<basic_string_view<_CharT, _Traits>> = true; } #endif _GLIBCXX_END_NAMESPACE_VERSION |