Skip to content

Commit

Permalink
[libc++][format] Fixes invalid usage of m type.
Browse files Browse the repository at this point in the history
The m type in a range formatter may only be used when a pair or a tuple
with two elements is used. This was not correctly validated as reported
in llvm.org/PR60995.

Reviewed By: ldionne, #libc

Differential Revision: https://reviews.llvm.org/D145309

(cherry picked from commit 347a65a)
  • Loading branch information
mordante authored and tstellar committed Mar 8, 2023
1 parent c7d3410 commit 59d896f
Show file tree
Hide file tree
Showing 3 changed files with 6 additions and 7 deletions.
5 changes: 2 additions & 3 deletions libcxx/include/__format/concepts.h
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,8 @@ concept formattable = __formattable<_Tp, _CharT>;
// TODO FMT Add a test to validate we fail when using that concept after P2165
// has been implemented.
template <class _Tp>
concept __fmt_pair_like = __is_specialization_v<_Tp, pair> ||
// Use a requires since tuple_size_v may fail to instantiate,
(__is_specialization_v<_Tp, tuple> && requires { tuple_size_v<_Tp> == 2; });
concept __fmt_pair_like =
__is_specialization_v<_Tp, pair> || (__is_specialization_v<_Tp, tuple> && tuple_size_v<_Tp> == 2);

# endif //_LIBCPP_STD_VER > 20
#endif //_LIBCPP_STD_VER > 17
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1260,7 +1260,7 @@ void test_tuple_int(TestFunction check, ExceptionTest check_exception) {
check(SV("__(42), (99)___"), SV("{:_^15n}"), input);

// *** type ***
check(SV("__{(42), (99)}___"), SV("{:_^17m}"), input);
check_exception("The range-format-spec type m requires two elements for a pair or tuple", SV("{:m}"), input);
check_exception("The range-format-spec type s requires formatting a character type", SV("{:s}"), input);
check_exception("The range-format-spec type ?s requires formatting a character type", SV("{:?s}"), input);

Expand Down Expand Up @@ -1366,7 +1366,7 @@ void test_tuple_int_int_int(TestFunction check, ExceptionTest check_exception) {
check(SV("__(1, 10, 100), (42, 99, 0)___"), SV("{:_^30n}"), input);

// *** type ***
check(SV("__{(1, 10, 100), (42, 99, 0)}___"), SV("{:_^32m}"), input);
check_exception("The range-format-spec type m requires two elements for a pair or tuple", SV("{:m}"), input);
check_exception("The range-format-spec type s requires formatting a character type", SV("{:s}"), input);
check_exception("The range-format-spec type ?s requires formatting a character type", SV("{:?s}"), input);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1083,7 +1083,7 @@ void test_tuple_int(TestFunction check, ExceptionTest check_exception) {
check(SV("__(42), (99)___"), SV("{:_^15n}"), input);

// *** type ***
check(SV("__{(42), (99)}___"), SV("{:_^17m}"), input);
check_exception("The range-format-spec type m requires two elements for a pair or tuple", SV("{:m}"), input);
check_exception("The range-format-spec type s requires formatting a character type", SV("{:s}"), input);
check_exception("The range-format-spec type ?s requires formatting a character type", SV("{:?s}"), input);
for (std::basic_string_view<CharT> fmt : fmt_invalid_types<CharT>("s"))
Expand Down Expand Up @@ -1184,7 +1184,7 @@ void test_tuple_int_int_int(TestFunction check, ExceptionTest check_exception) {
check(SV("__(42, 99, 0), (1, 10, 100)___"), SV("{:_^30n}"), input);

// *** type ***
check(SV("__{(42, 99, 0), (1, 10, 100)}___"), SV("{:_^32m}"), input);
check_exception("The range-format-spec type m requires two elements for a pair or tuple", SV("{:m}"), input);
check_exception("The range-format-spec type s requires formatting a character type", SV("{:s}"), input);
check_exception("The range-format-spec type ?s requires formatting a character type", SV("{:?s}"), input);
for (std::basic_string_view<CharT> fmt : fmt_invalid_types<CharT>("s"))
Expand Down

0 comments on commit 59d896f

Please sign in to comment.