AlignOfTest.cpp revision 3967f503f4ea623d3300a785f5f1c333230f24a9
15df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//===- llvm/unittest/Support/AlignOfTest.cpp - Alignment utility tests ----===//
25df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//
35df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//                     The LLVM Compiler Infrastructure
45df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//
55df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul// This file is distributed under the University of Illinois Open Source
65df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul// License. See LICENSE.TXT for details.
75df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//
85df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul//===----------------------------------------------------------------------===//
95df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "llvm/Support/AlignOf.h"
115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "llvm/Support/Compiler.h"
125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#include "gtest/gtest.h"
145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulusing namespace llvm;
165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulnamespace {
185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul// Define some fixed alignment types to use in these tests.
205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#if __cplusplus == 201103L || __has_feature(cxx_alignas)
215df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char alignas(1) A1;
225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char alignas(2) A2;
235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char alignas(4) A4;
245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char alignas(8) A8;
255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#elif defined(__clang__) || defined(__GNUC__)
265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char A1 __attribute__((aligned(1)));
275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char A2 __attribute__((aligned(2)));
285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char A4 __attribute__((aligned(4)));
295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef char A8 __attribute__((aligned(8)));
305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#elif defined(_MSC_VER)
315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef __declspec(align(1)) char A1;
325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef __declspec(align(2)) char A2;
335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef __declspec(align(4)) char A4;
345df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paultypedef __declspec(align(8)) char A8;
355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#else
365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul# error No supported align as directive.
37bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl#endif
385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
39bcc6eddd335e97d49ed2ef3a1440f94d58dce12dJon Smirl// Wrap the forced aligned types in structs to hack around compiler bugs.
405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct SA1 { A1 a; };
415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct SA2 { A2 a; };
425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct SA4 { A4 a; };
435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct SA8 { A8 a; };
445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
455df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S1 {};
465df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S2 { char a; };
475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S3 { int x; };
485df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S4 { double y; };
495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S5 { A1 a1; A2 a2; A4 a4; A8 a8; };
505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct S6 { double f(); };
515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D1 : S1 {};
52462183fe4cb6df6d90632d9e2cee881c8d26b1cbAlan Hourihanestruct D2 : S6 { float g(); };
535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D3 : S2 {};
545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D4 : S2 { int x; };
555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D5 : S3 { char c; };
565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D6 : S2, S3 {};
575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D7 : S1, S3 {};
585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D8 : S1, D4, D5 { double x[2]; };
595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct D9 : S1, D1 { S1 s1; };
605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct V1 { virtual ~V1(); };
615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paulstruct V2 { int x; virtual ~V2(); };
625562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholtstruct V3 : V1 { virtual ~V3(); };
635562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholtstruct V4 : virtual V2 { int y; virtual ~V4(); };
645562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholtstruct V5 : V4, V3 { double z; virtual ~V5(); };
658e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerstruct V6 : S1 { virtual ~V6(); };
668e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerstruct V7 : virtual V2, virtual V6 { virtual ~V7(); };
678e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerstruct V8 : V5, virtual V6, V7 { double zz; virtual ~V8(); };
688e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger
698e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger// Ensure alignment is a compile-time constant.
708e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerchar LLVM_ATTRIBUTE_UNUSED test_arr1
718e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<char>::Alignment > 0]
728e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<short>::Alignment > 0]
738e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<int>::Alignment > 0]
748e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<long>::Alignment > 0]
758e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<long long>::Alignment > 0]
768e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<float>::Alignment > 0]
777a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<double>::Alignment > 0]
785562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<long double>::Alignment > 0]
795562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<void *>::Alignment > 0]
807a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<int *>::Alignment > 0]
815562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<double (*)(double)>::Alignment > 0]
828e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<double (S6::*)()>::Alignment > 0];
838e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerchar LLVM_ATTRIBUTE_UNUSED test_arr2
848e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<A1>::Alignment > 0]
857a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<A2>::Alignment > 0]
865562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<A4>::Alignment > 0]
877a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<A8>::Alignment > 0]
887a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<SA1>::Alignment > 0]
897a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<SA2>::Alignment > 0]
907a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<SA4>::Alignment > 0]
917a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<SA8>::Alignment > 0];
927a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholtchar LLVM_ATTRIBUTE_UNUSED test_arr3
938e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<S1>::Alignment > 0]
948e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<S2>::Alignment > 0]
957a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<S3>::Alignment > 0]
965562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<S4>::Alignment > 0]
977a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<S5>::Alignment > 0]
987a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<S6>::Alignment > 0];
998e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheideggerchar LLVM_ATTRIBUTE_UNUSED test_arr4
1008e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<D1>::Alignment > 0]
1015562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<D2>::Alignment > 0]
1025562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<D3>::Alignment > 0]
1035562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<D4>::Alignment > 0]
1047a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<D5>::Alignment > 0]
1057a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<D6>::Alignment > 0]
1067a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<D7>::Alignment > 0]
1075562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<D8>::Alignment > 0]
1085562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  [AlignOf<D9>::Alignment > 0];
1095562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholtchar LLVM_ATTRIBUTE_UNUSED test_arr5
1108e3926575264d31b3caacb9cbb606f8f2914f57dRoland Scheidegger  [AlignOf<V1>::Alignment > 0]
1117a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V2>::Alignment > 0]
1127a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V3>::Alignment > 0]
1137a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V4>::Alignment > 0]
1147a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V5>::Alignment > 0]
1157a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V6>::Alignment > 0]
1167a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V7>::Alignment > 0]
1177a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  [AlignOf<V8>::Alignment > 0];
1185562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
1195562fe653cf88454bbf2c50f77a8b56b0dafe01bEric AnholtTEST(AlignOfTest, BasicAlignmentInvariants) {
1205562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // For a very strange reason, many compilers do not support this. Both Clang
1215562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // and GCC fail to align these properly.
1227a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_EQ(1u, alignOf<A1>());
1237a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt#if 0
1247a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_EQ(2u, alignOf<A2>());
1257a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_EQ(4u, alignOf<A4>());
1265562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(8u, alignOf<A8>());
1277a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt#endif
1285562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
1295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // But once wrapped in structs, the alignment is correctly managed.
1305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(1u, alignOf<SA1>());
1315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(2u, alignOf<SA2>());
1325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(4u, alignOf<SA4>());
1335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(8u, alignOf<SA8>());
1345562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
1355562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(1u, alignOf<char>());
1365562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<char>(),   alignOf<short>());
1375562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<short>(),  alignOf<int>());
1385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(alignOf<int>(),    alignOf<long>());
1395562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<long>(),   alignOf<long long>());
1405562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<char>(),   alignOf<float>());
1415562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<float>(),  alignOf<double>());
1425562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<char>(),   alignOf<long double>());
1435562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<char>(),   alignOf<void *>());
1445562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<void *>(), alignOf<int *>());
1455562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<char>(),   alignOf<S1>());
1465562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<S2>());
1475562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<S3>());
1485562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<S4>());
1495562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<S5>());
1505562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<S6>());
1515562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D1>());
1525562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D2>());
1535562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D3>());
15422d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling  EXPECT_LE(alignOf<S1>(),     alignOf<D4>());
1555562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D5>());
1565562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D6>());
1575562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D7>());
1585562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<D8>());
15922d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling  EXPECT_LE(alignOf<S1>(),     alignOf<D9>());
1605562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<S1>(),     alignOf<V1>());
16122d1acf2ee25280c3294c2cfded232e612ffac2eFelix Kuehling  EXPECT_LE(alignOf<V1>(),     alignOf<V2>());
1625562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<V1>(),     alignOf<V3>());
1635562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<V1>(),     alignOf<V4>());
1645562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<V1>(),     alignOf<V5>());
1655562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<V1>(),     alignOf<V6>());
1665562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(alignOf<V1>(),     alignOf<V7>());
1675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(alignOf<V1>(),     alignOf<V8>());
1685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
1695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian PaulTEST(AlignOfTest, BasicAlignedArray) {
1715562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // Note: this code exclusively uses the struct-wrapped arbitrarily aligned
1725562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // types because of the bugs mentioned above where GCC and Clang both
1735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // disregard the arbitrary alignment specifier until the type is used to
1745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // declare a member of a struct.
1755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(1u, alignOf<AlignedCharArray<SA1>::union_type>());
1765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_LE(2u, alignOf<AlignedCharArray<SA2>::union_type>());
1777a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_LE(4u, alignOf<AlignedCharArray<SA4>::union_type>());
1787a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_LE(8u, alignOf<AlignedCharArray<SA8>::union_type>());
1797a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt
1807a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_LE(1u, sizeof(AlignedCharArray<SA1>::union_type));
1817a086dc05e665a78f7e9d069aa4fc70e844b8988Eric Anholt  EXPECT_LE(2u, sizeof(AlignedCharArray<SA2>::union_type));
1825562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(4u, sizeof(AlignedCharArray<SA4>::union_type));
1835562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_LE(8u, sizeof(AlignedCharArray<SA8>::union_type));
1845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
1855562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(1u, (alignOf<AlignedCharArray<SA1>::union_type>()));
1865562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(2u, (alignOf<AlignedCharArray<SA1, SA2>::union_type>()));
1875562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(4u, (alignOf<AlignedCharArray<SA1, SA2, SA4>::union_type>()));
1885562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(8u, (alignOf<AlignedCharArray<SA1, SA2, SA4, SA8>::union_type>()));
1895562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
1905562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(1u, sizeof(AlignedCharArray<SA1>::union_type));
1915562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(2u, sizeof(AlignedCharArray<SA1, SA2>::union_type));
1925562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(4u, sizeof(AlignedCharArray<SA1, SA2, SA4>::union_type));
1935562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(8u, sizeof(AlignedCharArray<SA1, SA2, SA4, SA8>::union_type));
1945562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
1955562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(1u, (alignOf<AlignedCharArray<SA1[1]>::union_type>()));
1965562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(2u, (alignOf<AlignedCharArray<SA1[2], SA2[1]>::union_type>()));
1975562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(4u, (alignOf<AlignedCharArray<SA1[42], SA2[55],
1985562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt                                          SA4[13]>::union_type>()));
1995562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(8u, (alignOf<AlignedCharArray<SA1[2], SA2[1],
2005562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt                                          SA4, SA8>::union_type>()));
2015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(1u,  sizeof(AlignedCharArray<SA1[1]>::union_type));
2035562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(2u,  sizeof(AlignedCharArray<SA1[2], SA2[1]>::union_type));
2045562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(4u,  sizeof(AlignedCharArray<SA1[3], SA2[2], SA4>::union_type));
2055562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(16u, sizeof(AlignedCharArray<SA1, SA2[3],
2065562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt                                         SA4[3], SA8>::union_type));
2075562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt
2085562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // For other tests we simply assert that the alignment of the union mathes
2095562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // that of the fundamental type and hope that we have any weird type
2105562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  // productions that would trigger bugs.
2115562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<char>(), alignOf<AlignedCharArray<char>::union_type>());
2125562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<short>(), alignOf<AlignedCharArray<short>::union_type>());
2135562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<int>(), alignOf<AlignedCharArray<int>::union_type>());
2145562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<long>(), alignOf<AlignedCharArray<long>::union_type>());
2155562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<long long>(),
2165562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt            alignOf<AlignedCharArray<long long>::union_type>());
2175562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<float>(), alignOf<AlignedCharArray<float>::union_type>());
2185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<double>(), alignOf<AlignedCharArray<double>::union_type>());
2195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<long double>(),
2205562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt            alignOf<AlignedCharArray<long double>::union_type>());
2215562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<void *>(), alignOf<AlignedCharArray<void *>::union_type>());
2225562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<int *>(), alignOf<AlignedCharArray<int *>::union_type>());
2235562fe653cf88454bbf2c50f77a8b56b0dafe01bEric Anholt  EXPECT_EQ(alignOf<double (*)(double)>(),
2245df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            alignOf<AlignedCharArray<double (*)(double)>::union_type>());
2255df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<double (S6::*)()>(),
2265df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            alignOf<AlignedCharArray<double (S6::*)()>::union_type>());
2275df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S1>(), alignOf<AlignedCharArray<S1>::union_type>());
2285df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S2>(), alignOf<AlignedCharArray<S2>::union_type>());
2295df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S3>(), alignOf<AlignedCharArray<S3>::union_type>());
2305df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S4>(), alignOf<AlignedCharArray<S4>::union_type>());
2315df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S5>(), alignOf<AlignedCharArray<S5>::union_type>());
2325df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<S6>(), alignOf<AlignedCharArray<S6>::union_type>());
2335df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D1>(), alignOf<AlignedCharArray<D1>::union_type>());
234ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl  EXPECT_EQ(alignOf<D2>(), alignOf<AlignedCharArray<D2>::union_type>());
2355df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D3>(), alignOf<AlignedCharArray<D3>::union_type>());
2365df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D4>(), alignOf<AlignedCharArray<D4>::union_type>());
2375df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D5>(), alignOf<AlignedCharArray<D5>::union_type>());
2385df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D6>(), alignOf<AlignedCharArray<D6>::union_type>());
2395df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D7>(), alignOf<AlignedCharArray<D7>::union_type>());
2405df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D8>(), alignOf<AlignedCharArray<D8>::union_type>());
2415df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<D9>(), alignOf<AlignedCharArray<D9>::union_type>());
2425df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<V1>(), alignOf<AlignedCharArray<V1>::union_type>());
2435df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<V2>(), alignOf<AlignedCharArray<V2>::union_type>());
2445df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<V3>(), alignOf<AlignedCharArray<V3>::union_type>());
2456f3cc6a5226fd4b5d44cca91e2f76216ecaff831Eric Anholt  EXPECT_EQ(alignOf<V4>(), alignOf<AlignedCharArray<V4>::union_type>());
2466f3cc6a5226fd4b5d44cca91e2f76216ecaff831Eric Anholt  EXPECT_EQ(alignOf<V5>(), alignOf<AlignedCharArray<V5>::union_type>());
2475df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<V6>(), alignOf<AlignedCharArray<V6>::union_type>());
2486f3cc6a5226fd4b5d44cca91e2f76216ecaff831Eric Anholt  EXPECT_EQ(alignOf<V7>(), alignOf<AlignedCharArray<V7>::union_type>());
2495df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2505df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // Some versions of MSVC get this wrong somewhat disturbingly. The failure
2515df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // appears to be benign: alignOf<V8>() produces a preposterous value: 12
2525df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef _MSC_VER
2535df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(alignOf<V8>(), alignOf<AlignedCharArray<V8>::union_type>());
2545df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
2555df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
2565df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char), sizeof(AlignedCharArray<char>::union_type));
2575df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[1]), sizeof(AlignedCharArray<char[1]>::union_type));
2585df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[2]), sizeof(AlignedCharArray<char[2]>::union_type));
2595df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[3]), sizeof(AlignedCharArray<char[3]>::union_type));
2605df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[4]), sizeof(AlignedCharArray<char[4]>::union_type));
2615df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[5]), sizeof(AlignedCharArray<char[5]>::union_type));
2625df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[8]), sizeof(AlignedCharArray<char[8]>::union_type));
2635df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[13]), sizeof(AlignedCharArray<char[13]>::union_type));
2645df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[16]), sizeof(AlignedCharArray<char[16]>::union_type));
2655df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[21]), sizeof(AlignedCharArray<char[21]>::union_type));
2665df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(char[32]), sizeof(AlignedCharArray<char[32]>::union_type));
2675df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(short), sizeof(AlignedCharArray<short>::union_type));
2685df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(int), sizeof(AlignedCharArray<int>::union_type));
2695df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(long), sizeof(AlignedCharArray<long>::union_type));
2705df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(long long),
2715df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            sizeof(AlignedCharArray<long long>::union_type));
2725df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(float), sizeof(AlignedCharArray<float>::union_type));
2735df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(double), sizeof(AlignedCharArray<double>::union_type));
2745df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(long double),
2755df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            sizeof(AlignedCharArray<long double>::union_type));
2765df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(void *), sizeof(AlignedCharArray<void *>::union_type));
2775df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(int *), sizeof(AlignedCharArray<int *>::union_type));
2785df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(double (*)(double)),
2795df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            sizeof(AlignedCharArray<double (*)(double)>::union_type));
2805df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(double (S6::*)()),
2815df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul            sizeof(AlignedCharArray<double (S6::*)()>::union_type));
2825df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S1), sizeof(AlignedCharArray<S1>::union_type));
2835df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S2), sizeof(AlignedCharArray<S2>::union_type));
2845df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S3), sizeof(AlignedCharArray<S3>::union_type));
2855df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S4), sizeof(AlignedCharArray<S4>::union_type));
2865df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S5), sizeof(AlignedCharArray<S5>::union_type));
2875df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(S6), sizeof(AlignedCharArray<S6>::union_type));
2885df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D1), sizeof(AlignedCharArray<D1>::union_type));
2895df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D2), sizeof(AlignedCharArray<D2>::union_type));
2905df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D3), sizeof(AlignedCharArray<D3>::union_type));
2915df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D4), sizeof(AlignedCharArray<D4>::union_type));
2925df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D5), sizeof(AlignedCharArray<D5>::union_type));
2935df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D6), sizeof(AlignedCharArray<D6>::union_type));
2945df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D7), sizeof(AlignedCharArray<D7>::union_type));
2955df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D8), sizeof(AlignedCharArray<D8>::union_type));
2965df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9), sizeof(AlignedCharArray<D9>::union_type));
2975df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[1]), sizeof(AlignedCharArray<D9[1]>::union_type));
2985df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[2]), sizeof(AlignedCharArray<D9[2]>::union_type));
2995df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[3]), sizeof(AlignedCharArray<D9[3]>::union_type));
3005df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[4]), sizeof(AlignedCharArray<D9[4]>::union_type));
3015df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[5]), sizeof(AlignedCharArray<D9[5]>::union_type));
3025df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[8]), sizeof(AlignedCharArray<D9[8]>::union_type));
3035df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[13]), sizeof(AlignedCharArray<D9[13]>::union_type));
3045df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[16]), sizeof(AlignedCharArray<D9[16]>::union_type));
3055df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[21]), sizeof(AlignedCharArray<D9[21]>::union_type));
3065df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(D9[32]), sizeof(AlignedCharArray<D9[32]>::union_type));
3075df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V1), sizeof(AlignedCharArray<V1>::union_type));
3085df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V2), sizeof(AlignedCharArray<V2>::union_type));
3095df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V3), sizeof(AlignedCharArray<V3>::union_type));
3105df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V4), sizeof(AlignedCharArray<V4>::union_type));
3115df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V5), sizeof(AlignedCharArray<V5>::union_type));
3125df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V6), sizeof(AlignedCharArray<V6>::union_type));
3135df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V7), sizeof(AlignedCharArray<V7>::union_type));
3145df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul
3155df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // Some versions of MSVC also get this wrong. The failure again appears to be
3165df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  // benign: sizeof(V8) is only 52 bytes, but our array reserves 56.
3175df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#ifndef _MSC_VER
3185df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul  EXPECT_EQ(sizeof(V8), sizeof(AlignedCharArray<V8>::union_type));
3195df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul#endif
3205df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
321ae4a1cc0666860bf5cc37a5cb549afc9aa5448b0Jon Smirl
3225df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul}
3235df82c82bd53db90eb72c5aad4dd20cf6f1116b1Brian Paul