[libcxx-commits] [libcxx] r359596 - Support overaligned types in `aligned_storage`.

Eric Fiselier via libcxx-commits libcxx-commits at lists.llvm.org
Tue Apr 30 11:44:49 PDT 2019


Author: ericwf
Date: Tue Apr 30 11:44:45 2019
New Revision: 359596

URL: http://llvm.org/viewvc/llvm-project?rev=359596&view=rev
Log:
Support overaligned types in `aligned_storage`.

Summary:
The current implementation of aligned storage was written before we had `alignas`, so it used a list of builtin types to force the alignment. But this doesn't work overaligned requests.

This patch adds a fallback case supporting over-alignment. It only affects case that were previously ill-formed.

Reviewers: rsmith, ldionne, dlj, mclow.lists

Reviewed By: mclow.lists

Subscribers: mclow.lists, dexonsmith, libcxx-commits

Differential Revision: https://reviews.llvm.org/D61301

Modified:
    libcxx/trunk/include/type_traits
    libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/aligned_storage.pass.cpp

Modified: libcxx/trunk/include/type_traits
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/include/type_traits?rev=359596&r1=359595&r2=359596&view=diff
==============================================================================
--- libcxx/trunk/include/type_traits (original)
+++ libcxx/trunk/include/type_traits Tue Apr 30 11:44:45 2019
@@ -1768,6 +1768,9 @@ typedef
     __nat
     > > > > > > > > > > __all_types;
 
+template <size_t _Align>
+struct _ALIGNAS(_Align) __fallback_overaligned {};
+
 template <class _TL, size_t _Align> struct __find_pod;
 
 template <class _Hp, size_t _Align>
@@ -1776,7 +1779,7 @@ struct __find_pod<__type_list<_Hp, __nat
     typedef typename conditional<
                              _Align == _Hp::value,
                              typename _Hp::type,
-                             void
+                             __fallback_overaligned<_Align>
                          >::type type;
 };
 
@@ -1813,7 +1816,6 @@ template <size_t _Len, size_t _Align = _
 struct _LIBCPP_TEMPLATE_VIS aligned_storage
 {
     typedef typename __find_pod<__all_types, _Align>::type _Aligner;
-    static_assert(!is_void<_Aligner>::value, "");
     union type
     {
         _Aligner __align;

Modified: libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/aligned_storage.pass.cpp
URL: http://llvm.org/viewvc/llvm-project/libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/aligned_storage.pass.cpp?rev=359596&r1=359595&r2=359596&view=diff
==============================================================================
--- libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/aligned_storage.pass.cpp (original)
+++ libcxx/trunk/test/std/utilities/meta/meta.trans/meta.trans.other/aligned_storage.pass.cpp Tue Apr 30 11:44:45 2019
@@ -285,6 +285,14 @@ int main(int, char**)
     static_assert(std::alignment_of<T1>::value == 8, "");
     static_assert(sizeof(T1) == 16, "");
     }
+  {
+    const int Align = 65536;
+    typedef typename std::aligned_storage<1, Align>::type T1;
+    static_assert(std::is_trivial<T1>::value, "");
+    static_assert(std::is_standard_layout<T1>::value, "");
+    static_assert(std::alignment_of<T1>::value == Align, "");
+    static_assert(sizeof(T1) == Align, "");
+  }
 
   return 0;
 }




More information about the libcxx-commits mailing list