[PATCH 2/2] libstdc++: Define __cpp_lib_format_ranges in format header [PR109162]
Jonathan Wakely
jwakely@redhat.com
Tue Apr 22 15:41:29 GMT 2025
On Tue, 22 Apr 2025 at 13:53, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
>
> As P2286R8 and P2585R1 as now fully implemented, we now define
> __cpp_lib_format_ranges feature test macro with __cpp_lib_format_ranges.
> This macro is provided only in <format>.
>
> Uses of internal __glibcxx_format_ranges are also updated.
>
> PR libstdc++/109162
>
> libstdc++-v3/ChangeLog:
>
> * include/bits/version.def (format_ranges): Remove no_stdname and
> update value.
> * include/bits/version.h: Regenerate.
> * src/c++23/std.cc.in: Replace __glibcxx_format_ranges with
> __cpp_lib_format_ranges.
> * testsuite/std/format/formatter/lwg3944.cc: Likewise.
> * testsuite/std/format/parse_ctx.cc: Likewise.
> * testsuite/std/format/string.cc: Likewise.
> * testsuite/std/format/ranges/feature_test.cc: New test.
> ---
> This is followup to be merged as separate commit with:
> [PATCH v2] libstdc++: Implement formatters for queue, priority_queue and stack [PR109162]
>
> OK for trunk and 15.2 with previous patch, once 15.1 will be released?
Yes, thanks.
>
> libstdc++-v3/include/bits/version.def | 3 +--
> libstdc++-v3/include/bits/version.h | 3 ++-
> libstdc++-v3/src/c++23/std.cc.in | 6 ++----
> libstdc++-v3/testsuite/std/format/formatter/lwg3944.cc | 2 +-
> libstdc++-v3/testsuite/std/format/parse_ctx.cc | 2 +-
> libstdc++-v3/testsuite/std/format/ranges/feature_test.cc | 9 +++++++++
> libstdc++-v3/testsuite/std/format/string.cc | 2 +-
> 7 files changed, 17 insertions(+), 10 deletions(-)
> create mode 100644 libstdc++-v3/testsuite/std/format/ranges/feature_test.cc
>
> diff --git a/libstdc++-v3/include/bits/version.def b/libstdc++-v3/include/bits/version.def
> index 0afaf0dec24..737b3f421bf 100644
> --- a/libstdc++-v3/include/bits/version.def
> +++ b/libstdc++-v3/include/bits/version.def
> @@ -1416,9 +1416,8 @@ ftms = {
> // 202207 P2286R8 Formatting Ranges
> // 202207 P2585R1 Improving default container formatting
> // LWG3750 Too many papers bump __cpp_lib_format
> - no_stdname = true; // TODO remove
> values = {
> - v = 1; // TODO 202207
> + v = 202207;
> cxxmin = 23;
> hosted = yes;
> };
> diff --git a/libstdc++-v3/include/bits/version.h b/libstdc++-v3/include/bits/version.h
> index 980fee641e9..59ff0cee043 100644
> --- a/libstdc++-v3/include/bits/version.h
> +++ b/libstdc++-v3/include/bits/version.h
> @@ -1562,8 +1562,9 @@
>
> #if !defined(__cpp_lib_format_ranges)
> # if (__cplusplus >= 202100L) && _GLIBCXX_HOSTED
> -# define __glibcxx_format_ranges 1L
> +# define __glibcxx_format_ranges 202207L
> # if defined(__glibcxx_want_all) || defined(__glibcxx_want_format_ranges)
> +# define __cpp_lib_format_ranges 202207L
> # endif
> # endif
> #endif /* !defined(__cpp_lib_format_ranges) && defined(__glibcxx_want_format_ranges) */
> diff --git a/libstdc++-v3/src/c++23/std.cc.in b/libstdc++-v3/src/c++23/std.cc.in
> index 5e18ad73908..6da6d382914 100644
> --- a/libstdc++-v3/src/c++23/std.cc.in
> +++ b/libstdc++-v3/src/c++23/std.cc.in
> @@ -1315,8 +1315,7 @@ export namespace std
> using std::format_to_n;
> using std::format_to_n_result;
> using std::formatted_size;
> -// FIXME __cpp_lib_format_ranges
> -#if __cplusplus > 202002L
> +#if __cpp_lib_format_ranges
> using std::formattable;
> #endif
> using std::formatter;
> @@ -1332,8 +1331,7 @@ export namespace std
> using std::wformat_context;
> using std::wformat_parse_context;
> using std::wformat_string;
> -// FIXME __cpp_lib_format_ranges
> -#ifdef __glibcxx_format_ranges
> +#ifdef __cpp_lib_format_ranges
> using std::format_kind;
> using std::range_format;
> using std::range_formatter;
> diff --git a/libstdc++-v3/testsuite/std/format/formatter/lwg3944.cc b/libstdc++-v3/testsuite/std/format/formatter/lwg3944.cc
> index 1f3edc9cb03..07e63af5652 100644
> --- a/libstdc++-v3/testsuite/std/format/formatter/lwg3944.cc
> +++ b/libstdc++-v3/testsuite/std/format/formatter/lwg3944.cc
> @@ -18,7 +18,7 @@ void test_lwg3944()
> std::format(L"{}", "hello"); // { dg-error "here" }
> std::format(L"{}", std::string_view("hello")); // { dg-error "here" }
> std::format(L"{}", std::string("hello")); // { dg-error "here" }
> -#ifdef __glibcxx_format_ranges
> +#ifdef __cpp_lib_format_ranges
> // LWG 3944 does not change this, it's still valid.
> std::format(L"{}", std::vector{'h', 'e', 'l', 'l', 'o'});
> #endif
> diff --git a/libstdc++-v3/testsuite/std/format/parse_ctx.cc b/libstdc++-v3/testsuite/std/format/parse_ctx.cc
> index b338ac7b762..b5dd7cdba78 100644
> --- a/libstdc++-v3/testsuite/std/format/parse_ctx.cc
> +++ b/libstdc++-v3/testsuite/std/format/parse_ctx.cc
> @@ -108,7 +108,7 @@ is_std_format_spec_for(std::string_view spec)
> }
> }
>
> -#if __glibcxx_format_ranges
> +#if __cpp_lib_format_ranges
> constexpr bool escaped_strings_supported = true;
> #else
> constexpr bool escaped_strings_supported = false;
> diff --git a/libstdc++-v3/testsuite/std/format/ranges/feature_test.cc b/libstdc++-v3/testsuite/std/format/ranges/feature_test.cc
> new file mode 100644
> index 00000000000..80d2cea80ca
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/std/format/ranges/feature_test.cc
> @@ -0,0 +1,9 @@
> +// { dg-do preprocess { target c++23 } }
> +
> +#include <format>
> +
> +#ifndef __cpp_lib_format_ranges
> +# error "Feature-test macro __cpp_lib_format_ranges missing in <format>"
> +#elif __cpp_lib_format_ranges != 202207L
> +# error "Feature-test macro __cpp_lib_format_ranges has wrong value in <format>"
> +#endif
> diff --git a/libstdc++-v3/testsuite/std/format/string.cc b/libstdc++-v3/testsuite/std/format/string.cc
> index 76614d4bc3e..ee987a15ec3 100644
> --- a/libstdc++-v3/testsuite/std/format/string.cc
> +++ b/libstdc++-v3/testsuite/std/format/string.cc
> @@ -62,7 +62,7 @@ test_indexing()
> VERIFY( ! is_format_string_for("{} {0}", 1) );
> }
>
> -#if __glibcxx_format_ranges
> +#if __cpp_lib_format_ranges
> constexpr bool escaped_strings_supported = true;
> #else
> constexpr bool escaped_strings_supported = false;
> --
> 2.49.0
>
More information about the Libstdc++
mailing list