[PATCH] libstdc++: Mandate power of two alignment for std::is_sufficiently_aligned.

Jonathan Wakely jwakely@redhat.com
Wed Apr 22 11:46:11 GMT 2026


On Wed, 22 Apr 2026 at 12:39, Tomasz Kamiński <tkaminsk@redhat.com> wrote:
>
> This implements LWG4290. Missing Mandates clauses on is_sufficiently_aligned.
>
> libstdc++-v3/ChangeLog:
>
>         * include/bits/align.h (is_sufficiently_aligned): Mandate
>         that _Align is power of two.
>         * testsuite/std/time/format/simple.cc: New test.

Did you 'git add' the wrong test?

> ---
> No adding resolve issue comment, as this is C++26 feature.
>
> Tested on x86_64-linux. OK for trunk?
>
>  libstdc++-v3/include/bits/align.h                |  5 ++++-
>  libstdc++-v3/testsuite/std/time/format/simple.cc | 11 +++++++++++
>  2 files changed, 15 insertions(+), 1 deletion(-)
>  create mode 100644 libstdc++-v3/testsuite/std/time/format/simple.cc
>
> diff --git a/libstdc++-v3/include/bits/align.h b/libstdc++-v3/include/bits/align.h
> index 1a14e282216..3c8355d0e07 100644
> --- a/libstdc++-v3/include/bits/align.h
> +++ b/libstdc++-v3/include/bits/align.h
> @@ -116,7 +116,10 @@ align(size_t __align, size_t __size, void*& __ptr, size_t& __space) noexcept
>      [[nodiscard,__gnu__::__always_inline__]]
>      inline bool
>      is_sufficiently_aligned(_Tp* __ptr)
> -    { return reinterpret_cast<__UINTPTR_TYPE__>(__ptr) % _Align == 0; }
> +    {
> +      static_assert(std::has_single_bit(_Align));
> +      return reinterpret_cast<__UINTPTR_TYPE__>(__ptr) % _Align == 0;
> +    }
>  #endif // __glibcxx_is_sufficiently_aligned
>
>  _GLIBCXX_END_NAMESPACE_VERSION
> diff --git a/libstdc++-v3/testsuite/std/time/format/simple.cc b/libstdc++-v3/testsuite/std/time/format/simple.cc
> new file mode 100644
> index 00000000000..db25a460bf7
> --- /dev/null
> +++ b/libstdc++-v3/testsuite/std/time/format/simple.cc
> @@ -0,0 +1,11 @@
> +// { dg-do run { target c++20 } }
> +// { dg-timeout-factor 2 }
> +
> +#include <chrono>
> +#include <vector>
> +#include <testsuite_hooks.h>
> +
> +int main()
> +{
> +  auto s = std::format("{:%F %T}", std::chrono::system_clock::now());
> +}
> --
> 2.53.0
>



More information about the Libstdc++ mailing list