EricWF created this revision.
EricWF added a reviewer: mclow.lists.

This patch fixes llvm.org/PR35491

The fix attempts to maintain ABI compatibility by replacing the array with a 
instance of `aligned_storage`.


https://reviews.llvm.org/D41223

Files:
  include/array
  test/std/containers/sequences/array/array.cons/default.pass.cpp


Index: test/std/containers/sequences/array/array.cons/default.pass.cpp
===================================================================
--- test/std/containers/sequences/array/array.cons/default.pass.cpp
+++ test/std/containers/sequences/array/array.cons/default.pass.cpp
@@ -14,6 +14,10 @@
 #include <array>
 #include <cassert>
 
+struct NoDefault {
+  NoDefault(int) {}
+};
+
 int main()
 {
     {
@@ -28,4 +32,9 @@
         C c;
         assert(c.size() == 0);
     }
+  {
+    typedef std::array<NoDefault, 0> C;
+    C c;
+    assert(c.size() == 0);
+  }
 }
Index: include/array
===================================================================
--- include/array
+++ include/array
@@ -134,7 +134,12 @@
     typedef std::reverse_iterator<iterator>       reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
-    value_type __elems_[_Size > 0 ? _Size : 1];
+    typedef typename conditional<_Size == 0,
+        typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type,
+        value_type[_Size == 0 ? 1 : _Size]
+      >::type _StorageType;
+
+    _StorageType __elems_;
 
     // No explicit construct/copy/destroy for aggregate type
     _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u)


Index: test/std/containers/sequences/array/array.cons/default.pass.cpp
===================================================================
--- test/std/containers/sequences/array/array.cons/default.pass.cpp
+++ test/std/containers/sequences/array/array.cons/default.pass.cpp
@@ -14,6 +14,10 @@
 #include <array>
 #include <cassert>
 
+struct NoDefault {
+  NoDefault(int) {}
+};
+
 int main()
 {
     {
@@ -28,4 +32,9 @@
         C c;
         assert(c.size() == 0);
     }
+  {
+    typedef std::array<NoDefault, 0> C;
+    C c;
+    assert(c.size() == 0);
+  }
 }
Index: include/array
===================================================================
--- include/array
+++ include/array
@@ -134,7 +134,12 @@
     typedef std::reverse_iterator<iterator>       reverse_iterator;
     typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
 
-    value_type __elems_[_Size > 0 ? _Size : 1];
+    typedef typename conditional<_Size == 0,
+        typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type,
+        value_type[_Size == 0 ? 1 : _Size]
+      >::type _StorageType;
+
+    _StorageType __elems_;
 
     // No explicit construct/copy/destroy for aggregate type
     _LIBCPP_INLINE_VISIBILITY void fill(const value_type& __u)
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to