[gcc r16-8801] libstdc++: Mandate power of two alignment for std::is_sufficiently_aligned.

Tomasz Kaminski tkaminsk@gcc.gnu.org
Wed Apr 22 12:44:16 GMT 2026


https://gcc.gnu.org/g:93a125db9c2f096fe8e5de6f3fe4f45ab6e2071f

commit r16-8801-g93a125db9c2f096fe8e5de6f3fe4f45ab6e2071f
Author: Tomasz Kamiński <tkaminsk@redhat.com>
Date:   Wed Apr 22 13:26:30 2026 +0200

    libstdc++: Mandate power of two alignment for std::is_sufficiently_aligned.
    
    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/20_util/is_sufficiently_aligned/2_neg.cc: New test.
    
    Reviewed-by: Jonathan Wakely <jwakely@redhat.com>
    Signed-off-by: Tomasz Kamiński <tkaminsk@redhat.com>

Diff:
---
 libstdc++-v3/include/bits/align.h                            |  5 ++++-
 .../testsuite/20_util/is_sufficiently_aligned/2_neg.cc       | 12 ++++++++++++
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/libstdc++-v3/include/bits/align.h b/libstdc++-v3/include/bits/align.h
index 1a14e2822165..fd3cf931f448 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/20_util/is_sufficiently_aligned/2_neg.cc b/libstdc++-v3/testsuite/20_util/is_sufficiently_aligned/2_neg.cc
new file mode 100644
index 000000000000..9db69b67ef6d
--- /dev/null
+++ b/libstdc++-v3/testsuite/20_util/is_sufficiently_aligned/2_neg.cc
@@ -0,0 +1,12 @@
+// { dg-do compile { target c++26 } }
+
+#include <memory>
+
+void
+test01(int* ptr)
+{
+  (void)std::is_sufficiently_aligned<5>(ptr); // { dg-error "here" }
+  (void)std::is_sufficiently_aligned<7>(ptr); // { dg-error "here" }
+}
+
+// { dg-error "static assertion failed" "" { target *-*-* } 0 }


More information about the Libstdc++-cvs mailing list