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 > >
