Fix size and alignment of array<T, 0>.
An array T[1] isn't necessarily the same say when it's a member of a struct. This patch addresses that problem and corrects the tests to deal with it. llvm-svn: 324545
This commit is contained in:
parent
06ac8cfbd1
commit
1a78ae3c89
|
@ -582,6 +582,7 @@ namespace std {
|
||||||
#define __alignof__ __alignof
|
#define __alignof__ __alignof
|
||||||
#define _LIBCPP_NORETURN __declspec(noreturn)
|
#define _LIBCPP_NORETURN __declspec(noreturn)
|
||||||
#define _ALIGNAS(x) __declspec(align(x))
|
#define _ALIGNAS(x) __declspec(align(x))
|
||||||
|
#define _ALIGNAS_TYPE(x) alignas(x)
|
||||||
#define _LIBCPP_HAS_NO_VARIADICS
|
#define _LIBCPP_HAS_NO_VARIADICS
|
||||||
|
|
||||||
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
|
#define _LIBCPP_BEGIN_NAMESPACE_STD namespace std {
|
||||||
|
|
|
@ -244,10 +244,11 @@ struct _LIBCPP_TEMPLATE_VIS array<_Tp, 0>
|
||||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||||
|
|
||||||
|
|
||||||
typedef typename conditional<is_const<_Tp>::value, const char,
|
typedef typename conditional<is_const<_Tp>::value, const char,
|
||||||
char>::type _CharType;
|
char>::type _CharType;
|
||||||
_ALIGNAS(alignment_of<_Tp[1]>::value) _CharType __elems_[sizeof(_Tp[1])];
|
|
||||||
|
struct _ArrayInStructT { _Tp __data_[1]; };
|
||||||
|
_ALIGNAS_TYPE(_ArrayInStructT) _CharType __elems_[sizeof(_ArrayInStructT)];
|
||||||
|
|
||||||
// No explicit construct/copy/destroy for aggregate type
|
// No explicit construct/copy/destroy for aggregate type
|
||||||
_LIBCPP_INLINE_VISIBILITY void fill(const value_type&) {
|
_LIBCPP_INLINE_VISIBILITY void fill(const value_type&) {
|
||||||
|
|
|
@ -21,12 +21,26 @@
|
||||||
|
|
||||||
#include "test_macros.h"
|
#include "test_macros.h"
|
||||||
|
|
||||||
|
|
||||||
|
template <class T, size_t Size>
|
||||||
|
struct MyArray {
|
||||||
|
T elems[Size];
|
||||||
|
};
|
||||||
|
|
||||||
template <class T, size_t Size>
|
template <class T, size_t Size>
|
||||||
void test() {
|
void test() {
|
||||||
typedef T CArrayT[Size == 0 ? 1 : Size];
|
typedef T CArrayT[Size == 0 ? 1 : Size];
|
||||||
typedef std::array<T, Size> ArrayT;
|
typedef std::array<T, Size> ArrayT;
|
||||||
static_assert(sizeof(CArrayT) == sizeof(ArrayT), "");
|
typedef MyArray<T, Size == 0 ? 1 : Size> MyArrayT;
|
||||||
static_assert(TEST_ALIGNOF(CArrayT) == TEST_ALIGNOF(ArrayT), "");
|
static_assert(sizeof(ArrayT) == sizeof(CArrayT), "");
|
||||||
|
static_assert(sizeof(ArrayT) == sizeof(MyArrayT), "");
|
||||||
|
static_assert(TEST_ALIGNOF(ArrayT) == TEST_ALIGNOF(MyArrayT), "");
|
||||||
|
#if defined(_LIBCPP_VERSION)
|
||||||
|
ArrayT a;
|
||||||
|
((void)a);
|
||||||
|
static_assert(sizeof(ArrayT) == sizeof(a.__elems_), "");
|
||||||
|
static_assert(TEST_ALIGNOF(ArrayT) == __alignof__(a.__elems_), "");
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
@ -44,6 +58,8 @@ struct TEST_ALIGNAS(TEST_ALIGNOF(std::max_align_t) * 2) TestType2 {
|
||||||
char data[1000];
|
char data[1000];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//static_assert(sizeof(void*) == 4, "");
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
test_type<char>();
|
test_type<char>();
|
||||||
test_type<int>();
|
test_type<int>();
|
||||||
|
|
Loading…
Reference in New Issue