Fix initialization of array<const T, 0> with GCC.

Previously, when handling zero-sized array of const objects we
used a const version of aligned_storage_t, which is not an array type.
However, GCC complains about initialization of the form: array<const T, 0> arr = {};

This patch fixes that bug by making the dummy object used to represent
the zero-sized array an array itself. This avoids GCC's complaints
about the uninitialized const member.

llvm-svn: 324194
Cr-Mirrored-From: sso://chromium.googlesource.com/_direct/external/github.com/llvm/llvm-project
Cr-Mirrored-Commit: c6b3c7bb635352c7d228140ed0816befe2096944
diff --git a/include/array b/include/array
index 4a89ea9..068ab50 100644
--- a/include/array
+++ b/include/array
@@ -146,21 +146,19 @@
 template <class _Tp>
 struct __array_traits<_Tp, 0> {
   typedef typename aligned_storage<sizeof(_Tp), alignment_of<_Tp>::value>::type
-      _NonConstStorageT;
+      _NonConstStorageT[1];
   typedef typename conditional<is_const<_Tp>::value, const _NonConstStorageT,
                                _NonConstStorageT>::type _StorageT;
-
   typedef typename remove_const<_Tp>::type _NonConstTp;
+
   _LIBCPP_INLINE_VISIBILITY
-  static _NonConstTp* __data(_NonConstStorageT& __store) {
-    _StorageT *__ptr = std::addressof(__store);
-    return reinterpret_cast<_NonConstTp*>(__ptr);
+  static _NonConstTp* __data(_NonConstStorageT &__store) {
+    return reinterpret_cast<_NonConstTp*>(__store);
   }
 
   _LIBCPP_INLINE_VISIBILITY
-  static const _Tp* __data(const _StorageT& __store) {
-    const _StorageT *__ptr = std::addressof(__store);
-    return reinterpret_cast<const _Tp*>(__ptr);
+  static const _Tp* __data(const _StorageT &__store) {
+    return reinterpret_cast<const _Tp*>(__store);
   }
 
   _LIBCPP_INLINE_VISIBILITY