[PATCH] libstdc++: Support constexpr formatting for vector<bool>::reference.
Jonathan Wakely
jwakely@redhat.com
Mon Aug 17 10:18:30 GMT 2026
On Thu, 6 Aug 2026 at 12:08, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
> This specialization was made constexpr as part of P3391R2, "constexpr
> format", and was missed in r17-1162-g42f9bf2e3c56ae.
>
> libstdc++-v3/ChangeLog:
>
> * include/std/vector (formatter<_Bit_reference, _CharT>::format)
> [__glibcxx_constexpr_format]: Declare as constexpr.
> * testsuite/23_containers/vector/bool/format.cc
> [__glibcxx_constexpr_format]: Run test suite at compile
> time.
> ---
> Noted this when I expanded constexpr queue/priority_queue to
> make their formatters constexpr here:
> https://gcc.gnu.org/pipermail/libstdc++/2026-August/067451.html
>
> Testing on x86_64-linux. Modified test passed with all standard
> modes. OK for trunk when all test passes?
>
OK
>
> libstdc++-v3/include/std/vector | 3 +++
> .../23_containers/vector/bool/format.cc | 26 ++++++++++++++++---
> 2 files changed, 25 insertions(+), 4 deletions(-)
>
> diff --git a/libstdc++-v3/include/std/vector
> b/libstdc++-v3/include/std/vector
> index 86e42b22ea5..aeb7edce710 100644
> --- a/libstdc++-v3/include/std/vector
> +++ b/libstdc++-v3/include/std/vector
> @@ -148,6 +148,9 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
> // Standard declares this as template accepting unconstrained
> // FormatContext type.
> template<typename _Out>
> +#ifdef __glibcxx_constexpr_format // C++ >= 26 && HOSTED && CXX11 string
> + constexpr
> +#endif
> typename basic_format_context<_Out, _CharT>::iterator
> format(const _GLIBCXX_STD_C::_Bit_reference& __u,
> basic_format_context<_Out, _CharT>& __fc) const
> diff --git a/libstdc++-v3/testsuite/23_containers/vector/bool/format.cc
> b/libstdc++-v3/testsuite/23_containers/vector/bool/format.cc
> index 833727f4b41..856687c49f6 100644
> --- a/libstdc++-v3/testsuite/23_containers/vector/bool/format.cc
> +++ b/libstdc++-v3/testsuite/23_containers/vector/bool/format.cc
> @@ -5,12 +5,18 @@
> #include <vector>
> #include <testsuite_hooks.h>
>
> +#ifdef __glibcxx_constexpr_format
> +# define CONSTEXPR constexpr
> +#else
> +# define CONSTEXPR
> +#endif
> +
> static_assert(!std::formattable<std::vector<bool>::reference, int>);
> static_assert(!std::formattable<std::vector<bool>::reference, char32_t>);
>
> static_assert(std::enable_nonlocking_formatter_optimization<std::vector<bool>::reference>);
>
> template<typename... Args>
> -bool
> +CONSTEXPR bool
> is_format_string_for(const char* str, Args&&... args)
> {
> try {
> @@ -24,7 +30,7 @@ is_format_string_for(const char* str, Args&&... args)
> #define WIDEN_(C, S) ::std::__format::_Widen<C>(S, L##S)
> #define WIDEN(S) WIDEN_(CharT, S)
>
> -void
> +CONSTEXPR void
> test_format_string()
> {
> std::vector<bool> v(1, true);
> @@ -36,7 +42,7 @@ test_format_string()
> }
>
> template<typename CharT>
> -void
> +CONSTEXPR void
> test_output()
> {
> std::basic_string<CharT> res;
> @@ -65,9 +71,21 @@ test_output()
> VERIFY( res == WIDEN("[1, 0]") );
> }
>
> -int main()
> +CONSTEXPR bool
> +test_all()
> {
> test_format_string();
> test_output<char>();
> test_output<wchar_t>();
> +
> + return true;
> +}
> +
> +#ifdef __glibcxx_constexpr_format
> +static_assert(test_all());
> +#endif
> +
> +int main()
> +{
> + test_all();
> }
> --
> 2.55.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://gcc.gnu.org/pipermail/libstdc++/attachments/20260817/2971ac5e/attachment-0001.htm>
More information about the Libstdc++
mailing list