Re: [PATCH] libstdc++: Support constexpr formatting for vector<bool>::reference.

Jonathan Wakely <[email protected]>
Newsgroups gmane.comp.gcc.patches,gmane.comp.gcc.libstdc++.devel
Message-ID <CACb0b4n8PLmm0kMc6aJn3OBbu3KXkjwVOFy0Zt-z2umtKOKbjw@mail.gmail.com>
On Thu, 6 Aug 2026 at 12:08, Tomasz Kamiński <[email protected]> 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
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.