Skip to content

Commit 63ae509

Browse files
[libc++][test] Don't include test_format_context.h in parse.pass.cpp (#83734)
The `parse.pass.cpp` tests doen't need to call `test_format_context_create` to create a `basic_format_context`, so they shouldn't include `test_format_context.h`. The `to_address` mechanism works around the iterator debugging mechanisms of MSVC STL. Related to [LWG3989](https://cplusplus.github.io/LWG/issue3989). Discovered when implementing `formatter<tuple>` in MSVC STL. With the inclusion removed, `std/utilities/format/format.tuple/parse.pass.cpp` when using enhanced MSVC STL (and `/utf-8` option for MSVC).
1 parent f14224d commit 63ae509

File tree

19 files changed

+57
-28
lines changed

19 files changed

+57
-28
lines changed

libcxx/test/std/containers/container.adaptors/container.adaptors.format/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
#include <cassert>
2828
#include <concepts>
2929
#include <format>
30+
#include <memory>
3031
#include <queue>
3132
#include <stack>
3233

33-
#include "test_format_context.h"
3434
#include "test_macros.h"
3535
#include "make_string.h"
3636

@@ -44,7 +44,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4444
static_assert(std::semiregular<decltype(formatter)>);
4545

4646
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
47-
assert(it == fmt.end() - offset);
47+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
48+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4849
}
4950

5051
template <class StringViewT>

libcxx/test/std/containers/sequences/vector.bool/vector.bool.fmt/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@
2525
#include <cassert>
2626
#include <concepts>
2727
#include <format>
28+
#include <memory>
2829
#include <vector>
2930

30-
#include "test_format_context.h"
3131
#include "test_macros.h"
3232
#include "make_string.h"
3333

@@ -41,7 +41,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4141
static_assert(std::semiregular<decltype(formatter)>);
4242

4343
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
44-
assert(it == fmt.end() - offset);
44+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
45+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4546
}
4647

4748
template <class CharT>

libcxx/test/std/thread/thread.threads/thread.thread.class/thread.thread.id/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424

2525
#include <cassert>
2626
#include <concepts>
27+
#include <memory>
2728
#include <thread>
2829

29-
#include "test_format_context.h"
3030
#include "test_macros.h"
3131
#include "make_string.h"
3232

@@ -40,7 +40,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4040
static_assert(std::semiregular<decltype(formatter)>);
4141

4242
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
43-
assert(it == fmt.end() - offset);
43+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
44+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4445
}
4546

4647
template <class CharT>

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.bool.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <cassert>
2323
#include <concepts>
2424
#include <iterator>
25+
#include <memory>
2526
#include <type_traits>
2627

2728
#include "test_format_context.h"
@@ -38,7 +39,8 @@ void test(StringT expected, StringViewT fmt, bool arg, std::size_t offset) {
3839
static_assert(std::semiregular<decltype(formatter)>);
3940

4041
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
41-
assert(it == fmt.end() - offset);
42+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
43+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4244

4345
StringT result;
4446
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.c_string.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <cassert>
2222
#include <concepts>
2323
#include <iterator>
24+
#include <memory>
2425
#include <type_traits>
2526

2627
#include "test_format_context.h"
@@ -38,7 +39,8 @@ void test(StringT expected, StringViewT fmt, const CharT* a, std::size_t offset)
3839
static_assert(std::semiregular<decltype(formatter)>);
3940

4041
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
41-
assert(it == fmt.end() - offset);
42+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
43+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4244

4345
StringT result;
4446
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.char.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
#include <cassert>
2323
#include <concepts>
2424
#include <iterator>
25+
#include <memory>
2526
#include <type_traits>
2627

2728
#include "test_format_context.h"
@@ -39,7 +40,8 @@ void test(StringT expected, StringViewT fmt, ArgumentT arg, std::size_t offset)
3940
static_assert(std::semiregular<decltype(formatter)>);
4041

4142
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
42-
assert(it == fmt.end() - offset);
43+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
44+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4345

4446
StringT result;
4547
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.char_array.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <cassert>
2222
#include <concepts>
2323
#include <iterator>
24+
#include <memory>
2425
#include <type_traits>
2526

2627
#include "test_format_context.h"
@@ -51,7 +52,8 @@ struct Tester {
5152
static_assert(std::semiregular<decltype(formatter)>);
5253

5354
std::same_as<typename std::basic_string_view<CharT>::iterator> auto it = formatter.parse(parse_ctx);
54-
assert(it == fmt.end() - offset);
55+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
56+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
5557

5658
std::basic_string<CharT> result;
5759
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.floating_point.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <charconv>
3535
#include <concepts>
3636
#include <iterator>
37+
#include <memory>
3738
#include <string>
3839
#include <type_traits>
3940

@@ -50,7 +51,8 @@ void test(std::basic_string_view<CharT> fmt, ArithmeticT arg, std::basic_string<
5051
static_assert(std::semiregular<decltype(formatter)>);
5152

5253
std::same_as<typename std::basic_string_view<CharT>::iterator> auto it = formatter.parse(parse_ctx);
53-
assert(it == fmt.end() - offset);
54+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
55+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
5456

5557
std::basic_string<CharT> result;
5658
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.handle.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include <charconv>
2222
#include <concepts>
2323
#include <iterator>
24+
#include <memory>
2425
#include <string>
2526
#include <type_traits>
2627

@@ -43,7 +44,8 @@ void test(std::string expected, std::string_view fmt, color arg, std::size_t off
4344
static_assert(std::semiregular<decltype(formatter)>);
4445

4546
std::same_as<typename std::string_view::iterator> auto it = formatter.parse(parse_ctx);
46-
assert(it == fmt.end() - offset);
47+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
48+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4749

4850
std::string result;
4951
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.pointer.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <charconv>
2828
#include <concepts>
2929
#include <iterator>
30+
#include <memory>
3031
#include <string>
3132
#include <type_traits>
3233

@@ -44,7 +45,8 @@ void test(StringT expected, StringViewT fmt, PointerT arg, std::size_t offset) {
4445
static_assert(std::semiregular<decltype(formatter)>);
4546

4647
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
47-
assert(it == fmt.end() - offset);
48+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
49+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4850

4951
StringT result;
5052
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.signed_integral.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <cassert>
3131
#include <concepts>
3232
#include <iterator>
33+
#include <memory>
3334
#include <type_traits>
3435

3536
#include "test_format_context.h"
@@ -46,7 +47,8 @@ void test(StringT expected, StringViewT fmt, ArithmeticT arg, std::size_t offset
4647
static_assert(std::semiregular<decltype(formatter)>);
4748

4849
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
49-
assert(it == fmt.end() - offset);
50+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
51+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
5052

5153
StringT result;
5254
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.string.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#include <cassert>
2424
#include <concepts>
2525
#include <iterator>
26+
#include <memory>
2627
#include <type_traits>
2728

2829
#include "make_string.h"
@@ -46,7 +47,8 @@ void test(StringT expected, StringViewT fmt, StringT a, std::size_t offset) {
4647
static_assert(std::semiregular<decltype(formatter)>);
4748

4849
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
49-
assert(it == fmt.end() - offset);
50+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
51+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
5052

5153
StringT result;
5254
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.formatter/format.formatter.spec/formatter.unsigned_integral.pass.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
#include <cassert>
3131
#include <concepts>
3232
#include <iterator>
33+
#include <memory>
3334
#include <type_traits>
3435

3536
#include "test_format_context.h"
@@ -46,7 +47,8 @@ void test(StringT expected, StringViewT fmt, ArithmeticT arg, std::size_t offset
4647
static_assert(std::semiregular<decltype(formatter)>);
4748

4849
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
49-
assert(it == fmt.end() - offset);
50+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
51+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
5052

5153
StringT result;
5254
auto out = std::back_inserter(result);

libcxx/test/std/utilities/format/format.range/format.range.fmtdef/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222
#include <cassert>
2323
#include <concepts>
2424
#include <format>
25+
#include <memory>
2526

26-
#include "test_format_context.h"
2727
#include "test_macros.h"
2828
#include "make_string.h"
2929

@@ -37,7 +37,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
3737
static_assert(std::semiregular<decltype(formatter)>);
3838

3939
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
40-
assert(it == fmt.end() - offset);
40+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
41+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4142
}
4243

4344
template <class CharT>

libcxx/test/std/utilities/format/format.range/format.range.fmtmap/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#include <concepts>
2626
#include <format>
2727
#include <map>
28+
#include <memory>
2829

29-
#include "test_format_context.h"
3030
#include "test_macros.h"
3131
#include "make_string.h"
3232

@@ -40,7 +40,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4040
static_assert(std::semiregular<decltype(formatter)>);
4141

4242
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
43-
assert(it == fmt.end() - offset);
43+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
44+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4445
}
4546

4647
template <class CharT>

libcxx/test/std/utilities/format/format.range/format.range.fmtset/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
#include <cassert>
2525
#include <concepts>
2626
#include <format>
27+
#include <memory>
2728
#include <set>
2829

29-
#include "test_format_context.h"
3030
#include "test_macros.h"
3131
#include "make_string.h"
3232

@@ -40,7 +40,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4040
static_assert(std::semiregular<decltype(formatter)>);
4141

4242
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
43-
assert(it == fmt.end() - offset);
43+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
44+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4445
}
4546

4647
template <class CharT>

libcxx/test/std/utilities/format/format.range/format.range.fmtstr/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@
2323
#include <cassert>
2424
#include <concepts>
2525
#include <format>
26+
#include <memory>
2627

2728
#include "format.functions.tests.h"
28-
#include "test_format_context.h"
2929
#include "test_macros.h"
3030

3131
template <class FormatterT, class StringViewT>
@@ -36,7 +36,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
3636
static_assert(std::semiregular<decltype(formatter)>);
3737

3838
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
39-
assert(it == fmt.end() - offset);
39+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
40+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4041
}
4142

4243
template <class StringViewT>

libcxx/test/std/utilities/format/format.range/format.range.formatter/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@
2525
#include <cassert>
2626
#include <concepts>
2727
#include <format>
28+
#include <memory>
2829

29-
#include "test_format_context.h"
3030
#include "test_macros.h"
3131
#include "make_string.h"
3232

@@ -40,7 +40,8 @@ constexpr void test_parse(StringViewT fmt, std::size_t offset) {
4040
static_assert(std::semiregular<decltype(formatter)>);
4141

4242
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
43-
assert(it == fmt.end() - offset);
43+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
44+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4445
}
4546

4647
template <class CharT>

libcxx/test/std/utilities/format/format.tuple/parse.pass.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,10 @@
2424
#include <cassert>
2525
#include <concepts>
2626
#include <format>
27+
#include <memory>
2728
#include <tuple>
2829
#include <utility>
2930

30-
#include "test_format_context.h"
3131
#include "test_macros.h"
3232
#include "make_string.h"
3333

@@ -41,7 +41,8 @@ constexpr void test(StringViewT fmt, std::size_t offset) {
4141
static_assert(std::semiregular<decltype(formatter)>);
4242

4343
std::same_as<typename StringViewT::iterator> auto it = formatter.parse(parse_ctx);
44-
assert(it == fmt.end() - offset);
44+
// std::to_address works around LWG3989 and MSVC STL's iterator debugging mechanism.
45+
assert(std::to_address(it) == std::to_address(fmt.end()) - offset);
4546
}
4647

4748
template <class CharT, class Arg>

0 commit comments

Comments
 (0)