[libcxx-commits] [libcxx] 2d653b7 - [libcxx][test] array and basic_string_view iterators are not portably pointers
Casey Carter via libcxx-commits
libcxx-commits at lists.llvm.org
Mon Feb 21 10:54:15 PST 2022
Author: Casey Carter
Date: 2022-02-21T10:54:08-08:00
New Revision: 2d653b7e5b351b152b2c2bddef93c75f84042e15
URL: https://github.com/llvm/llvm-project/commit/2d653b7e5b351b152b2c2bddef93c75f84042e15
DIFF: https://github.com/llvm/llvm-project/commit/2d653b7e5b351b152b2c2bddef93c75f84042e15.diff
LOG: [libcxx][test] array and basic_string_view iterators are not portably pointers
Fixup tests that believe them to be so. Most notably including some heavy refactoring in `std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp`, which now detects pointers and validates that `iterator_concept` is present only for pointers.
Differential Revision: https://reviews.llvm.org/D117368
Added:
Modified:
libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp
libcxx/test/std/iterators/iterator.requirements/iterator.cust/iterator.cust.move/iter_move.pass.cpp
libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
libcxx/test/std/strings/string.view/string.view.deduct/iterator_sentinel.pass.cpp
libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
Removed:
################################################################################
diff --git a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp
index ed0b4210b95c2..8857b5895e3be 100644
--- a/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.primitives/iterator.traits/cxx20_iterator_traits.compile.pass.cpp
@@ -53,169 +53,116 @@ constexpr bool has_iterator_concept_v = requires {
typename Traits::iterator_concept;
};
-template <class Iter, class Category>
-constexpr bool testIOIterator() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, void>);
- static_assert(std::same_as<typename Traits::
diff erence_type, std::ptr
diff _t>);
- static_assert(std::same_as<typename Traits::reference, void>);
- static_assert(std::same_as<typename Traits::pointer, void>);
- static_assert(!has_iterator_concept_v<Traits>);
-
- return true;
-}
-
-template <class Iter, class ValueType, class Category>
-constexpr bool testConstWithoutConcept() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, ValueType>);
- static_assert(std::same_as<typename Traits::
diff erence_type, std::ptr
diff _t>);
- static_assert(std::same_as<typename Traits::reference, const ValueType&>);
- static_assert(std::same_as<typename Traits::pointer, const ValueType*>);
- static_assert(!has_iterator_concept_v<Traits>);
-
- return true;
-}
-
-template <class Iter, class ValueType, class Category, class IterConcept>
-constexpr bool testConstWithConcept() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, ValueType>);
- static_assert(std::same_as<typename Traits::
diff erence_type, std::ptr
diff _t>);
- static_assert(std::same_as<typename Traits::reference, const ValueType&>);
- static_assert(std::same_as<typename Traits::pointer, const ValueType*>);
- static_assert(std::same_as<typename Traits::iterator_concept, IterConcept>);
-
- return true;
-}
-
-template <class Iter, class ValueType, class Category>
-constexpr bool testWithoutConcept() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, ValueType>);
- static_assert(std::same_as<typename Traits::
diff erence_type, std::ptr
diff _t>);
- static_assert(std::same_as<typename Traits::reference, ValueType&>);
- static_assert(std::same_as<typename Traits::pointer, ValueType*>);
- static_assert(!has_iterator_concept_v<Traits>);
-
- return true;
-}
-
-template <class Iter, class ValueType, class Category, class IterConcept>
-constexpr bool testWithConcept() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, ValueType>);
- static_assert(std::same_as<typename Traits::
diff erence_type, std::ptr
diff _t>);
- static_assert(std::same_as<typename Traits::reference, ValueType&>);
- static_assert(std::same_as<typename Traits::pointer, ValueType*>);
- static_assert(std::same_as<typename Traits::iterator_concept, IterConcept>);
-
- return true;
-}
-
-template <class Iter, class ValueType, class DiffType, class RefType, class PtrType, class Category>
-constexpr bool testWithoutConcept() {
+template <class Iter, class Category, class ValueType, class DiffType, class RefType, class PtrType>
+constexpr bool test() {
using Traits = std::iterator_traits<Iter>;
static_assert(std::same_as<typename Traits::iterator_category, Category>);
static_assert(std::same_as<typename Traits::value_type, ValueType>);
static_assert(std::same_as<typename Traits::
diff erence_type, DiffType>);
static_assert(std::same_as<typename Traits::reference, RefType>);
static_assert(std::same_as<typename Traits::pointer, PtrType>);
- static_assert(!has_iterator_concept_v<Traits>);
+ if constexpr (std::is_pointer_v<Iter>) {
+ static_assert(std::same_as<typename Traits::iterator_concept, std::contiguous_iterator_tag>);
+ } else {
+ static_assert(!has_iterator_concept_v<Traits>);
+ }
return true;
}
-template <class Iter, class ValueType, class DiffType, class RefType, class PtrType, class Category, class IterConcept>
-constexpr bool testWithConcept() {
- using Traits = std::iterator_traits<Iter>;
- static_assert(std::same_as<typename Traits::iterator_category, Category>);
- static_assert(std::same_as<typename Traits::value_type, ValueType>);
- static_assert(std::same_as<typename Traits::
diff erence_type, DiffType>);
- static_assert(std::same_as<typename Traits::reference, RefType>);
- static_assert(std::same_as<typename Traits::pointer, PtrType>);
- static_assert(std::same_as<typename Traits::iterator_concept, IterConcept>);
+template <class Iter, class Category>
+constexpr bool testIOIterator() {
+ return test<Iter, Category, void, std::ptr
diff _t, void, void>();
+}
- return true;
+template <class Iter, class Category, class ValueType>
+constexpr bool testConst() {
+ return test<Iter, Category, ValueType, std::ptr
diff _t, const ValueType&, const ValueType*>();
+}
+
+template <class Iter, class Category, class ValueType>
+constexpr bool testMutable() {
+ return test<Iter, Category, ValueType, std::ptr
diff _t, ValueType&, ValueType*>();
}
// Standard types.
-// These tests depend on implementation details of libc++,
-// e.g. that std::array::iterator is a raw pointer type but std::string::iterator is not.
-// The Standard does not specify whether iterator_traits<It>::iterator_concept exists for any particular non-pointer type.
+// The Standard does not specify whether iterator_traits<It>::iterator_concept
+// exists for any particular non-pointer type, we assume it is present
+// only for pointers.
//
-static_assert(testWithConcept<std::array<int, 10>::iterator, int, std::random_access_iterator_tag, std::contiguous_iterator_tag>());
-static_assert(testConstWithConcept<std::array<int, 10>::const_iterator, int, std::random_access_iterator_tag, std::contiguous_iterator_tag>());
-static_assert(testWithoutConcept<std::string::iterator, char, std::random_access_iterator_tag>());
-static_assert(testConstWithoutConcept<std::string::const_iterator, char, std::random_access_iterator_tag>());
-static_assert(testConstWithConcept<std::string_view::iterator, char, std::random_access_iterator_tag, std::contiguous_iterator_tag>());
-static_assert(testConstWithConcept<std::string_view::const_iterator, char, std::random_access_iterator_tag, std::contiguous_iterator_tag>());
-static_assert(testWithoutConcept<std::vector<int>::iterator, int, std::random_access_iterator_tag>());
-static_assert(testConstWithoutConcept<std::vector<int>::const_iterator, int, std::random_access_iterator_tag>());
-
-static_assert(testWithoutConcept<std::deque<int>::iterator, int, std::random_access_iterator_tag>());
-static_assert(testConstWithoutConcept<std::deque<int>::const_iterator, int, std::random_access_iterator_tag>());
-static_assert(testWithoutConcept<std::forward_list<int>::iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::forward_list<int>::const_iterator, int, std::forward_iterator_tag>());
-static_assert(testWithoutConcept<std::list<int>::iterator, int, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::list<int>::const_iterator, int, std::bidirectional_iterator_tag>());
-
-static_assert(testWithoutConcept<std::map<int, int>::iterator, std::pair<const int, int>, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::map<int, int>::const_iterator, std::pair<const int, int>, std::bidirectional_iterator_tag>());
-static_assert(testWithoutConcept<std::multimap<int, int>::iterator, std::pair<const int, int>, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::multimap<int, int>::const_iterator, std::pair<const int, int>, std::bidirectional_iterator_tag>());
-
-static_assert(testConstWithoutConcept<std::set<int>::iterator, int, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::set<int>::const_iterator, int, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::multiset<int>::iterator, int, std::bidirectional_iterator_tag>());
-static_assert(testConstWithoutConcept<std::multiset<int>::const_iterator, int, std::bidirectional_iterator_tag>());
-
-static_assert(testWithoutConcept<std::unordered_map<int, int>::iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_map<int, int>::const_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testWithoutConcept<std::unordered_map<int, int>::local_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_map<int, int>::const_local_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testWithoutConcept<std::unordered_multimap<int, int>::iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multimap<int, int>::const_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testWithoutConcept<std::unordered_multimap<int, int>::local_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multimap<int, int>::const_local_iterator, std::pair<const int, int>, std::forward_iterator_tag>());
-
-static_assert(testConstWithoutConcept<std::unordered_set<int>::iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_set<int>::const_iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_set<int>::local_iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_set<int>::const_local_iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multiset<int>::iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multiset<int>::const_iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multiset<int>::local_iterator, int, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::unordered_multiset<int>::const_local_iterator, int, std::forward_iterator_tag>());
-
-static_assert(testWithoutConcept<std::reverse_iterator<int*>, int, std::random_access_iterator_tag>());
+static_assert(testMutable<std::array<int, 10>::iterator, std::random_access_iterator_tag, int>());
+static_assert(testConst<std::array<int, 10>::const_iterator, std::random_access_iterator_tag, int>());
+static_assert(testMutable<std::string::iterator, std::random_access_iterator_tag, char>());
+static_assert(testConst<std::string::const_iterator, std::random_access_iterator_tag, char>());
+static_assert(testConst<std::string_view::iterator, std::random_access_iterator_tag, char>());
+static_assert(testConst<std::string_view::const_iterator, std::random_access_iterator_tag, char>());
+static_assert(testMutable<std::vector<int>::iterator, std::random_access_iterator_tag, int>());
+static_assert(testConst<std::vector<int>::const_iterator, std::random_access_iterator_tag, int>());
+
+static_assert(testMutable<std::deque<int>::iterator, std::random_access_iterator_tag, int>());
+static_assert(testConst<std::deque<int>::const_iterator, std::random_access_iterator_tag, int>());
+static_assert(testMutable<std::forward_list<int>::iterator, std::forward_iterator_tag, int>());
+static_assert(testConst<std::forward_list<int>::const_iterator, std::forward_iterator_tag, int>());
+static_assert(testMutable<std::list<int>::iterator, std::bidirectional_iterator_tag, int>());
+static_assert(testConst<std::list<int>::const_iterator, std::bidirectional_iterator_tag, int>());
+
+static_assert(testMutable<std::map<int, int>::iterator, std::bidirectional_iterator_tag, std::pair<const int, int>>());
+static_assert(testConst<std::map<int, int>::const_iterator, std::bidirectional_iterator_tag, std::pair<const int, int>>());
+static_assert(testMutable<std::multimap<int, int>::iterator, std::bidirectional_iterator_tag, std::pair<const int, int>>());
+static_assert(testConst<std::multimap<int, int>::const_iterator, std::bidirectional_iterator_tag, std::pair<const int, int>>());
+
+static_assert(testConst<std::set<int>::iterator, std::bidirectional_iterator_tag, int>());
+static_assert(testConst<std::set<int>::const_iterator, std::bidirectional_iterator_tag, int>());
+static_assert(testConst<std::multiset<int>::iterator, std::bidirectional_iterator_tag, int>());
+static_assert(testConst<std::multiset<int>::const_iterator, std::bidirectional_iterator_tag, int>());
+
+#ifdef _MSVC_STL_VERSION
+using unordered_iterator_category = std::bidirectional_iterator_tag;
+#else // ^^^ MSVC STL / other vvv
+using unordered_iterator_category = std::forward_iterator_tag;
+#endif // _MSVC_STL_VERSION
+
+static_assert(testMutable<std::unordered_map<int, int>::iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testConst<std::unordered_map<int, int>::const_iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testMutable<std::unordered_map<int, int>::local_iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testConst<std::unordered_map<int, int>::const_local_iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testMutable<std::unordered_multimap<int, int>::iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testConst<std::unordered_multimap<int, int>::const_iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testMutable<std::unordered_multimap<int, int>::local_iterator, unordered_iterator_category, std::pair<const int, int>>());
+static_assert(testConst<std::unordered_multimap<int, int>::const_local_iterator, unordered_iterator_category, std::pair<const int, int>>());
+
+static_assert(testConst<std::unordered_set<int>::iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_set<int>::const_iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_set<int>::local_iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_set<int>::const_local_iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_multiset<int>::iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_multiset<int>::const_iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_multiset<int>::local_iterator, unordered_iterator_category, int>());
+static_assert(testConst<std::unordered_multiset<int>::const_local_iterator, unordered_iterator_category, int>());
+
+static_assert(testMutable<std::reverse_iterator<int*>, std::random_access_iterator_tag, int>());
static_assert(testIOIterator<std::back_insert_iterator<std::vector<int>>, std::output_iterator_tag>());
static_assert(testIOIterator<std::front_insert_iterator<std::vector<int>>, std::output_iterator_tag>());
static_assert(testIOIterator<std::insert_iterator<std::vector<int>>, std::output_iterator_tag>());
-static_assert(testConstWithoutConcept<std::istream_iterator<int, char>, int, std::input_iterator_tag>());
+static_assert(testConst<std::istream_iterator<int, char>, std::input_iterator_tag, int>());
#if !defined(TEST_HAS_NO_LOCALIZATION)
-static_assert(testWithoutConcept<std::istreambuf_iterator<char>, char, long long, char, char*, std::input_iterator_tag>());
-static_assert(testWithoutConcept<std::move_iterator<int*>, int, std::ptr
diff _t, int&&, int*, std::random_access_iterator_tag>());
+// libc++-specific since pointer type is unspecified:
+LIBCPP_STATIC_ASSERT(test<std::istreambuf_iterator<char>, std::input_iterator_tag, char, long long, char, char*>());
+static_assert(test<std::move_iterator<int*>, std::random_access_iterator_tag, int, std::ptr
diff _t, int&&, int*>());
static_assert(testIOIterator<std::ostream_iterator<int, char>, std::output_iterator_tag>());
static_assert(testIOIterator<std::ostreambuf_iterator<int, char>, std::output_iterator_tag>());
-static_assert(testConstWithoutConcept<std::cregex_iterator, std::cmatch, std::forward_iterator_tag>());
-static_assert(testConstWithoutConcept<std::cregex_token_iterator, std::csub_match, std::forward_iterator_tag>());
+static_assert(testConst<std::cregex_iterator, std::forward_iterator_tag, std::cmatch>());
+static_assert(testConst<std::cregex_token_iterator, std::forward_iterator_tag, std::csub_match>());
#endif // !TEST_HAS_NO_LOCALIZATION
#ifndef TEST_HAS_NO_FILESYSTEM_LIBRARY
-static_assert(testWithoutConcept<std::filesystem::directory_iterator, std::filesystem::directory_entry, std::ptr
diff _t,
- const std::filesystem::directory_entry&, const std::filesystem::directory_entry*,
- std::input_iterator_tag>());
-static_assert(testWithoutConcept<std::filesystem::recursive_directory_iterator, std::filesystem::directory_entry,
- std::ptr
diff _t, const std::filesystem::directory_entry&,
- const std::filesystem::directory_entry*, std::input_iterator_tag>());
+static_assert(test<std::filesystem::directory_iterator, std::input_iterator_tag, std::filesystem::directory_entry,
+ std::ptr
diff _t, const std::filesystem::directory_entry&, const std::filesystem::directory_entry*>());
+static_assert(test<std::filesystem::recursive_directory_iterator, std::input_iterator_tag,
+ std::filesystem::directory_entry, std::ptr
diff _t, const std::filesystem::directory_entry&,
+ const std::filesystem::directory_entry*>());
#endif
// Local test iterators.
diff --git a/libcxx/test/std/iterators/iterator.requirements/iterator.cust/iterator.cust.move/iter_move.pass.cpp b/libcxx/test/std/iterators/iterator.requirements/iterator.cust/iterator.cust.move/iter_move.pass.cpp
index 39ecab6641e54..b53caead03f6e 100644
--- a/libcxx/test/std/iterators/iterator.requirements/iterator.cust/iterator.cust.move/iter_move.pass.cpp
+++ b/libcxx/test/std/iterators/iterator.requirements/iterator.cust/iterator.cust.move/iter_move.pass.cpp
@@ -51,8 +51,8 @@ class iterator_wrapper {
I base_ = I{};
};
-template <typename I>
-constexpr void unqualified_lookup_move(I first_, I last_, I result_first_, I result_last_) {
+template <typename It, typename Out>
+constexpr void unqualified_lookup_move(It first_, It last_, Out result_first_, Out result_last_) {
auto first = ::check_unqualified_lookup::unqualified_lookup_wrapper{std::move(first_)};
auto last = ::check_unqualified_lookup::unqualified_lookup_wrapper{std::move(last_)};
auto result_first = ::check_unqualified_lookup::unqualified_lookup_wrapper{std::move(result_first_)};
@@ -65,8 +65,8 @@ constexpr void unqualified_lookup_move(I first_, I last_, I result_first_, I res
}
}
-template <typename I>
-constexpr void lvalue_move(I first_, I last_, I result_first_, I result_last_) {
+template <typename It, typename Out>
+constexpr void lvalue_move(It first_, It last_, Out result_first_, Out result_last_) {
auto first = iterator_wrapper{std::move(first_)};
auto last = ::iterator_wrapper{std::move(last_)};
auto result_first = iterator_wrapper{std::move(result_first_)};
@@ -80,8 +80,8 @@ constexpr void lvalue_move(I first_, I last_, I result_first_, I result_last_) {
}
}
-template <typename I>
-constexpr void rvalue_move(I first_, I last_, I result_first_, I result_last_) {
+template <typename It, typename Out>
+constexpr void rvalue_move(It first_, It last_, Out result_first_, Out result_last_) {
auto first = iterator_wrapper{std::move(first_)};
auto last = iterator_wrapper{std::move(last_)};
auto result_first = iterator_wrapper{std::move(result_first_)};
diff --git a/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp b/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
index 931eac89aede3..4aae72d33cd8d 100644
--- a/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
+++ b/libcxx/test/std/strings/string.view/string.view.cons/from_iterator_sentinel.pass.cpp
@@ -20,25 +20,33 @@
#include "make_string.h"
#include "test_iterators.h"
-template<class CharT, class Sentinel>
-constexpr void test() {
- auto val = MAKE_STRING_VIEW(CharT, "test");
- auto sv = std::basic_string_view<CharT>(val.begin(), Sentinel(val.end()));
- ASSERT_SAME_TYPE(decltype(sv), std::basic_string_view<CharT>);
- assert(sv.size() == val.size());
+template<class It, class Sentinel, class CharT>
+constexpr void test_construction(std::basic_string_view<CharT> val) {
+ auto sv = std::basic_string_view<CharT>(It(val.data()), Sentinel(It(val.data() + val.size())));
assert(sv.data() == val.data());
+ assert(sv.size() == val.size());
+}
+
+template<class CharT>
+constexpr void test_with_char() {
+ const auto val = MAKE_STRING_VIEW(CharT, "test");
+ test_construction<CharT*, CharT*>(val);
+ test_construction<CharT*, const CharT*>(val);
+ test_construction<const CharT*, CharT*>(val);
+ test_construction<const CharT*, sized_sentinel<const CharT*>>(val);
+ test_construction<contiguous_iterator<const CharT*>, contiguous_iterator<const CharT*>>(val);
+ test_construction<contiguous_iterator<const CharT*>, sized_sentinel<contiguous_iterator<const CharT*>>>(val);
}
constexpr bool test() {
- test<char, char*>();
+ test_with_char<char>();
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
- test<wchar_t, wchar_t*>();
+ test_with_char<wchar_t>();
#endif
- test<char8_t, char8_t*>();
- test<char16_t, char16_t*>();
- test<char32_t, char32_t*>();
- test<char, const char*>();
- test<char, sized_sentinel<const char*>>();
+ test_with_char<char8_t>();
+ test_with_char<char16_t>();
+ test_with_char<char32_t>();
+
return true;
}
@@ -54,7 +62,7 @@ template <class CharT>
void test_throwing() {
auto val = MAKE_STRING_VIEW(CharT, "test");
try {
- (void)std::basic_string_view<CharT>(val.begin(), ThrowingSentinel<CharT>());
+ (void)std::basic_string_view<CharT>(val.data(), ThrowingSentinel<CharT>());
assert(false);
} catch (int i) {
assert(i == 42);
@@ -89,4 +97,3 @@ int main(int, char**) {
return 0;
}
-
diff --git a/libcxx/test/std/strings/string.view/string.view.deduct/iterator_sentinel.pass.cpp b/libcxx/test/std/strings/string.view/string.view.deduct/iterator_sentinel.pass.cpp
index e0ff5f6c0cd53..e39917528cf79 100644
--- a/libcxx/test/std/strings/string.view/string.view.deduct/iterator_sentinel.pass.cpp
+++ b/libcxx/test/std/strings/string.view/string.view.deduct/iterator_sentinel.pass.cpp
@@ -20,25 +20,33 @@
#include "test_macros.h"
#include "test_iterators.h"
-template<class CharT, class Sentinel>
-constexpr void test() {
- auto val = MAKE_STRING_VIEW(CharT, "test");
- auto sv = std::basic_string_view(val.begin(), Sentinel(val.end()));
+template<class It, class Sentinel, class CharT>
+constexpr void test_ctad(std::basic_string_view<CharT> val) {
+ auto sv = std::basic_string_view(It(val.data()), Sentinel(It(val.data() + val.size())));
ASSERT_SAME_TYPE(decltype(sv), std::basic_string_view<CharT>);
- assert(sv.size() == val.size());
assert(sv.data() == val.data());
+ assert(sv.size() == val.size());
+}
+
+template<class CharT>
+constexpr void test_with_char() {
+ const auto val = MAKE_STRING_VIEW(CharT, "test");
+ test_ctad<CharT*, CharT*>(val);
+ test_ctad<CharT*, const CharT*>(val);
+ test_ctad<const CharT*, CharT*>(val);
+ test_ctad<const CharT*, sized_sentinel<const CharT*>>(val);
+ test_ctad<contiguous_iterator<const CharT*>, contiguous_iterator<const CharT*>>(val);
+ test_ctad<contiguous_iterator<const CharT*>, sized_sentinel<contiguous_iterator<const CharT*>>>(val);
}
constexpr void test() {
- test<char, char*>();
+ test_with_char<char>();
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
- test<wchar_t, wchar_t*>();
+ test_with_char<wchar_t>();
#endif
- test<char8_t, char8_t*>();
- test<char16_t, char16_t*>();
- test<char32_t, char32_t*>();
- test<char, const char*>();
- test<char, sized_sentinel<const char*>>();
+ test_with_char<char8_t>();
+ test_with_char<char16_t>();
+ test_with_char<char32_t>();
}
int main(int, char**) {
@@ -46,4 +54,3 @@ int main(int, char**) {
return 0;
}
-
diff --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
index 7bb0d3e26610c..8a42a547f9452 100644
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/advance_to.pass.cpp
@@ -26,10 +26,10 @@ constexpr void test(const CharT* fmt) {
std::basic_format_parse_context<CharT> context(fmt);
context.advance_to(context.begin() + 1);
- assert(context.begin() == &fmt[1]);
+ assert(std::to_address(context.begin()) == fmt + 1);
context.advance_to(context.begin() + 1);
- assert(context.begin() == &fmt[2]);
+ assert(std::to_address(context.begin()) == fmt + 2);
context.advance_to(context.begin() + 1);
assert(context.begin() == context.end());
@@ -39,10 +39,10 @@ constexpr void test(const CharT* fmt) {
std::basic_format_parse_context context(view);
context.advance_to(context.begin() + 1);
- assert(std::to_address(context.begin()) == std::to_address(view.begin()) + 1);
+ assert(std::to_address(context.begin()) == fmt + 1);
context.advance_to(context.begin() + 1);
- assert(std::to_address(context.begin()) == std::to_address(view.begin()) + 2);
+ assert(std::to_address(context.begin()) == fmt + 2);
context.advance_to(context.begin() + 1);
assert(context.begin() == context.end());
diff --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
index fd209e611c6bc..d01f25625d582 100644
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/begin.pass.cpp
@@ -24,7 +24,7 @@ template <class CharT>
constexpr void test(const CharT* fmt) {
{
std::basic_format_parse_context<CharT> context(fmt);
- assert(context.begin() == &fmt[0]);
+ assert(std::to_address(context.begin()) == &fmt[0]);
ASSERT_NOEXCEPT(context.begin());
}
{
diff --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
index 195f07742a016..771fc7131beff 100644
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/ctor.pass.cpp
@@ -47,8 +47,8 @@ constexpr void test(const CharT* fmt) {
{
std::basic_format_parse_context<CharT> context(fmt);
- assert(context.begin() == &fmt[0]);
- assert(context.end() == &fmt[3]);
+ assert(std::to_address(context.begin()) == &fmt[0]);
+ assert(std::to_address(context.end()) == &fmt[3]);
}
{
std::basic_string_view view{fmt};
diff --git a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
index 9a878ef42ba18..9e7ca7e391c48 100644
--- a/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
+++ b/libcxx/test/std/utilities/format/format.formatter/format.parse.ctx/end.pass.cpp
@@ -24,7 +24,7 @@ template <class CharT>
constexpr void test(const CharT* fmt) {
{
std::basic_format_parse_context<CharT> context(fmt);
- assert(context.end() == &fmt[3]);
+ assert(std::to_address(context.end()) == &fmt[3]);
ASSERT_NOEXCEPT(context.end());
}
{
More information about the libcxx-commits
mailing list