typename basic_format_context<_Out, _CharT>::iterator
format(_Rg&& __rg, basic_format_context<_Out, _CharT>& __fc) const
{
- using __maybe_const_range
- = __format::__maybe_const_range<_Rg, _CharT>;
- return _M_format<__maybe_const_range>(__rg, __fc);
+ using _Range = remove_reference_t<_Rg>;
+ if constexpr (__format::__const_formattable_range<_Range, _CharT>)
+ {
+ using _CRef = ranges::range_reference_t<const _Range>;
+ if constexpr (same_as<remove_cvref_t<_CRef>, _Tp>)
+ return _M_format<const _Range>(__rg, __fc);
+ }
+ return _M_format(__rg, __fc);
}
private:
// { dg-do run { target c++23 } }
+#include <flat_map>
#include <format>
#include <testsuite_hooks.h>
#include <vector>
VERIFY( res == "+<01; 02; 11; 12>+" );
}
+struct MyFlatMap : std::flat_map<int, int>
+{
+ using std::flat_map<int, int>::flat_map;
+};
+
+template<typename CharT>
+struct std::formatter<MyFlatMap, CharT>
+ // This cannot apply format BitVector const&, because formatted type would
+ // be std::pair<int const&, int const&>, and formatter for
+ // pair<int const&, int> cannot format it.
+ : std::range_formatter<MyFlatMap::reference>
+{};
+
+void test_const_ref_type_mismatch()
+{
+ MyFlatMap m{{1, 11}, {2, 22}};
+ std::string res = std::format("{:m}", m);
+ VERIFY( res == "{1: 11, 2: 22}" );
+}
+
template<typename T, typename CharT>
using VectorFormatter = std::formatter<std::vector<T>, CharT>;
test_outputs<std::range_formatter>();
test_outputs<VectorFormatter>();
test_nested();
+ test_const_ref_type_mismatch();
}