Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions stl/inc/__msvc_formatter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -401,11 +401,12 @@ constexpr bool enable_nonlocking_formatter_optimization<basic_string_view<_CharT

template <class _Ty1, class _Ty2>
constexpr bool enable_nonlocking_formatter_optimization<pair<_Ty1, _Ty2>> =
enable_nonlocking_formatter_optimization<_Ty1> && enable_nonlocking_formatter_optimization<_Ty2>;
enable_nonlocking_formatter_optimization<remove_cvref_t<_Ty1>>
&& enable_nonlocking_formatter_optimization<remove_cvref_t<_Ty2>>;

template <class... _Ts>
constexpr bool enable_nonlocking_formatter_optimization<tuple<_Ts...>> =
(enable_nonlocking_formatter_optimization<_Ts> && ...);
(enable_nonlocking_formatter_optimization<remove_cvref_t<_Ts>> && ...);

template <class _CharT>
struct _Fill_align_and_width_specs {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,29 @@ static_assert(enable_nonlocking_formatter_optimization<long double>);
static_assert(enable_nonlocking_formatter_optimization<nullptr_t>);
static_assert(enable_nonlocking_formatter_optimization<void*>);
static_assert(enable_nonlocking_formatter_optimization<const void*>);
static_assert(enable_nonlocking_formatter_optimization<pair<int, int>>);
static_assert(!enable_nonlocking_formatter_optimization<pair<unoptimized, int>>);
static_assert(!enable_nonlocking_formatter_optimization<pair<int, unoptimized>>);
static_assert(enable_nonlocking_formatter_optimization<tuple<int, int>>);
static_assert(!enable_nonlocking_formatter_optimization<tuple<unoptimized, int>>);
static_assert(!enable_nonlocking_formatter_optimization<tuple<int, unoptimized>>);

// Extended to test LWG-4399 "enable_nonlocking_formatter_optimization for pair and tuple needs remove_cvref_t"
template <template <class, class> class PairOrTuple, class T, class U, bool Expected>
constexpr void test_lwg_4399_impl() {
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<T, U>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<T&, U>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<T, U&>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<const T, U>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<T, const U>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<const T&, U>> == Expected);
static_assert(enable_nonlocking_formatter_optimization<PairOrTuple<T, const U&>> == Expected);
}

template <class T, class U, bool Expected>
constexpr bool test_lwg_4399() {
test_lwg_4399_impl<pair, T, U, Expected>();
test_lwg_4399_impl<tuple, T, U, Expected>();
return true;
}

static_assert(test_lwg_4399<int, int, true>());
static_assert(test_lwg_4399<unoptimized, int, false>());
static_assert(test_lwg_4399<int, unoptimized, false>());

// Validate that various ranges are unoptimized
static_assert(!enable_nonlocking_formatter_optimization<list<int>>);
Expand Down