@@ -687,6 +687,64 @@ TEST(core_test, is_formattable) {
687
687
static_assert (!fmt::is_formattable<unformattable_scoped_enum>::value, " " );
688
688
}
689
689
690
+ #if FMT_USE_CONCEPTS
691
+ TEST (core_test, formattable) {
692
+ static_assert (fmt::formattable<char >);
693
+ static_assert (fmt::formattable<char &>);
694
+ static_assert (fmt::formattable<char &&>);
695
+ static_assert (fmt::formattable<const char >);
696
+ static_assert (fmt::formattable<const char &>);
697
+ static_assert (fmt::formattable<const char &&>);
698
+
699
+ static_assert (fmt::formattable<fmt::basic_string_view<char >>);
700
+ static_assert (fmt::formattable<fmt::basic_string_view<char >&>);
701
+ static_assert (fmt::formattable<fmt::basic_string_view<char >&&>);
702
+ static_assert (fmt::formattable<const fmt::basic_string_view<char >>);
703
+ static_assert (fmt::formattable<const fmt::basic_string_view<char >&>);
704
+ static_assert (fmt::formattable<const fmt::basic_string_view<char >&&>);
705
+
706
+ static_assert (!fmt::formattable<wchar_t >);
707
+ # ifdef __cpp_char8_t
708
+ static_assert (!fmt::formattable<char8_t >);
709
+ # endif
710
+ static_assert (!fmt::formattable<char16_t >);
711
+ static_assert (!fmt::formattable<char32_t >);
712
+ static_assert (!fmt::formattable<signed char *>);
713
+ static_assert (!fmt::formattable<unsigned char *>);
714
+ static_assert (!fmt::formattable<const signed char *>);
715
+ static_assert (!fmt::formattable<const unsigned char *>);
716
+ static_assert (!fmt::formattable<const wchar_t *>);
717
+ static_assert (!fmt::formattable<const wchar_t [3 ]>);
718
+ static_assert (!fmt::formattable<fmt::basic_string_view<wchar_t >>);
719
+ static_assert (fmt::formattable<enabled_formatter>);
720
+ static_assert (!fmt::formattable<enabled_ptr_formatter*>);
721
+ static_assert (!fmt::formattable<disabled_formatter>);
722
+ static_assert (!fmt::formattable<disabled_formatter_convertible>);
723
+
724
+ static_assert (fmt::formattable<const_formattable&>);
725
+ static_assert (fmt::formattable<const const_formattable&>);
726
+
727
+ static_assert (fmt::formattable<nonconst_formattable&>);
728
+ # if !FMT_MSC_VERSION || FMT_MSC_VERSION >= 1910
729
+ static_assert (!fmt::formattable<const nonconst_formattable&>);
730
+ # endif
731
+
732
+ static_assert (!fmt::formattable<convertible_to_pointer>);
733
+ const auto f = convertible_to_pointer_formattable ();
734
+ auto str = std::string ();
735
+ fmt::format_to (std::back_inserter (str), " {}" , f);
736
+ EXPECT_EQ (str, " test" );
737
+
738
+ static_assert (!fmt::formattable<void (*)()>);
739
+
740
+ struct s ;
741
+ static_assert (!fmt::formattable<int (s::*)>);
742
+ static_assert (!fmt::formattable<int (s::*)()>);
743
+ static_assert (!fmt::formattable<unformattable_scoped_enum>);
744
+ static_assert (!fmt::formattable<unformattable_scoped_enum>);
745
+ }
746
+ #endif
747
+
690
748
TEST (core_test, format_to) {
691
749
auto s = std::string ();
692
750
fmt::format_to (std::back_inserter (s), " {}" , 42 );
@@ -757,6 +815,9 @@ struct implicitly_convertible_to_string_view {
757
815
TEST (core_test, no_implicit_conversion_to_string_view) {
758
816
EXPECT_FALSE (
759
817
fmt::is_formattable<implicitly_convertible_to_string_view>::value);
818
+ #if FMT_USE_CONCEPTS
819
+ static_assert (!fmt::formattable<implicitly_convertible_to_string_view>);
820
+ #endif
760
821
}
761
822
762
823
#ifdef FMT_USE_STRING_VIEW
@@ -767,6 +828,9 @@ struct implicitly_convertible_to_std_string_view {
767
828
TEST (core_test, no_implicit_conversion_to_std_string_view) {
768
829
EXPECT_FALSE (
769
830
fmt::is_formattable<implicitly_convertible_to_std_string_view>::value);
831
+ # if FMT_USE_CONCEPTS
832
+ static_assert (!fmt::formattable<implicitly_convertible_to_std_string_view>);
833
+ # endif
770
834
}
771
835
#endif
772
836
@@ -781,6 +845,9 @@ TEST(core_test, format_explicitly_convertible_to_string_view) {
781
845
// default because it may introduce ODR violations.
782
846
static_assert (
783
847
!fmt::is_formattable<explicitly_convertible_to_string_view>::value, " " );
848
+ # if FMT_USE_CONCEPTS
849
+ static_assert (!fmt::formattable<explicitly_convertible_to_string_view>);
850
+ # endif
784
851
}
785
852
786
853
# ifdef FMT_USE_STRING_VIEW
@@ -794,6 +861,9 @@ TEST(core_test, format_explicitly_convertible_to_std_string_view) {
794
861
static_assert (
795
862
!fmt::is_formattable<explicitly_convertible_to_std_string_view>::value,
796
863
" " );
864
+ # if FMT_USE_CONCEPTS
865
+ static_assert (!fmt::formattable<explicitly_convertible_to_std_string_view>);
866
+ # endif
797
867
}
798
868
# endif
799
869
#endif
0 commit comments