|
| 1 | +//===----------------------------------------------------------------------===// |
| 2 | +// |
| 3 | +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | +// See https://llvm.org/LICENSE.txt for license information. |
| 5 | +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | +// |
| 7 | +//===----------------------------------------------------------------------===// |
| 8 | + |
| 9 | +// UNSUPPORTED: c++03 |
| 10 | + |
| 11 | +// UNSUPPORTED: libcpp-abi-no-compressed-pair-padding |
| 12 | + |
| 13 | +#include <tuple> |
| 14 | +#include <type_traits> |
| 15 | + |
| 16 | +#include "test_macros.h" |
| 17 | + |
| 18 | +struct S {}; |
| 19 | + |
| 20 | +struct Final final {}; |
| 21 | + |
| 22 | +struct NonEmpty { |
| 23 | + int i; |
| 24 | + char c; |
| 25 | +}; |
| 26 | + |
| 27 | +struct NonEmptyFinal final { |
| 28 | + int i; |
| 29 | + char c; |
| 30 | +}; |
| 31 | + |
| 32 | +struct TEST_ALIGNAS(16) Overaligned {}; |
| 33 | +struct TEST_ALIGNAS(16) OveralignedFinal final {}; |
| 34 | + |
| 35 | +static_assert(std::is_empty<std::tuple<>>::value, ""); |
| 36 | +static_assert(!std::is_empty<std::tuple<S>>::value, ""); |
| 37 | +static_assert(!std::is_empty<std::tuple<S&>>::value, ""); |
| 38 | +static_assert(!std::is_empty<std::tuple<S&&>>::value, ""); |
| 39 | +static_assert(!std::is_empty<std::tuple<Final>>::value, ""); |
| 40 | +static_assert(!std::is_empty<std::tuple<NonEmpty>>::value, ""); |
| 41 | +static_assert(!std::is_empty<std::tuple<NonEmptyFinal>>::value, ""); |
| 42 | +static_assert(!std::is_empty<std::tuple<Overaligned>>::value, ""); |
| 43 | +static_assert(!std::is_empty<std::tuple<OveralignedFinal>>::value, ""); |
| 44 | + |
| 45 | +static_assert(sizeof(std::tuple<S>) == 1, ""); |
| 46 | +static_assert(sizeof(std::tuple<S&>) == sizeof(void*), ""); |
| 47 | +static_assert(sizeof(std::tuple<S&&>) == sizeof(void*), ""); |
| 48 | +static_assert(sizeof(std::tuple<Final>) == 1, ""); |
| 49 | +static_assert(sizeof(std::tuple<NonEmpty>) == 8, ""); |
| 50 | +static_assert(sizeof(std::tuple<NonEmptyFinal>) == 8, ""); |
| 51 | +static_assert(sizeof(std::tuple<Overaligned>) == 16, ""); |
| 52 | +static_assert(sizeof(std::tuple<OveralignedFinal>) == 16, ""); |
| 53 | + |
| 54 | +static_assert(sizeof(std::tuple<S, S>) == 2, ""); |
| 55 | +static_assert(sizeof(std::tuple<S&, S>) == sizeof(void*), ""); |
| 56 | +static_assert(sizeof(std::tuple<S&&, S>) == sizeof(void*), ""); |
| 57 | +static_assert(sizeof(std::tuple<Final, S>) == 1, ""); |
| 58 | +static_assert(sizeof(std::tuple<NonEmpty, S>) == 8, ""); |
| 59 | +static_assert(sizeof(std::tuple<NonEmptyFinal, S>) == 8, ""); |
| 60 | +static_assert(sizeof(std::tuple<Overaligned, S>) == 16, ""); |
| 61 | +static_assert(sizeof(std::tuple<OveralignedFinal, S>) == 16, ""); |
| 62 | + |
| 63 | +static_assert(sizeof(std::tuple<S, S&>) == sizeof(void*), ""); |
| 64 | +static_assert(sizeof(std::tuple<S&, S&>) == 2 * sizeof(void*), ""); |
| 65 | +static_assert(sizeof(std::tuple<S&&, S&>) == 2 * sizeof(void*), ""); |
| 66 | +static_assert(sizeof(std::tuple<Final, S&>) == 2 * sizeof(void*), ""); |
| 67 | +static_assert(sizeof(std::tuple<NonEmpty, S&>) == 8 + sizeof(void*), ""); |
| 68 | +static_assert(sizeof(std::tuple<NonEmptyFinal, S&>) == 8 + sizeof(void*), ""); |
| 69 | +static_assert(sizeof(std::tuple<Overaligned, S&>) == 16, ""); |
| 70 | +static_assert(sizeof(std::tuple<OveralignedFinal, S&>) == 32, ""); |
| 71 | + |
| 72 | +static_assert(sizeof(std::tuple<S, S&&>) == sizeof(void*), ""); |
| 73 | +static_assert(sizeof(std::tuple<S&, S&&>) == 2 * sizeof(void*), ""); |
| 74 | +static_assert(sizeof(std::tuple<S&&, S&&>) == 2 * sizeof(void*), ""); |
| 75 | +static_assert(sizeof(std::tuple<Final, S&&>) == 2 * sizeof(void*), ""); |
| 76 | +static_assert(sizeof(std::tuple<NonEmpty, S&&>) == 8 + sizeof(void*), ""); |
| 77 | +static_assert(sizeof(std::tuple<NonEmptyFinal, S&&>) == 8 + sizeof(void*), ""); |
| 78 | +static_assert(sizeof(std::tuple<Overaligned, S&&>) == 16, ""); |
| 79 | +static_assert(sizeof(std::tuple<OveralignedFinal, S&&>) == 32, ""); |
| 80 | + |
| 81 | +static_assert(sizeof(std::tuple<S, Final>) == 1, ""); |
| 82 | +static_assert(sizeof(std::tuple<S&, Final>) == 2 * sizeof(void*), ""); |
| 83 | +static_assert(sizeof(std::tuple<S&&, Final>) == 2 * sizeof(void*), ""); |
| 84 | +static_assert(sizeof(std::tuple<Final, Final>) == 2, ""); |
| 85 | +static_assert(sizeof(std::tuple<NonEmpty, Final>) == 12, ""); |
| 86 | +static_assert(sizeof(std::tuple<NonEmptyFinal, Final>) == 12, ""); |
| 87 | +static_assert(sizeof(std::tuple<Overaligned, Final>) == 16, ""); |
| 88 | +static_assert(sizeof(std::tuple<OveralignedFinal, Final>) == 32, ""); |
| 89 | + |
| 90 | +static_assert(sizeof(std::tuple<S, NonEmpty>) == 8, ""); |
| 91 | +static_assert(sizeof(std::tuple<S&, NonEmpty>) == sizeof(void*) + 8, ""); |
| 92 | +static_assert(sizeof(std::tuple<S&&, NonEmpty>) == sizeof(void*) + 8, ""); |
| 93 | +static_assert(sizeof(std::tuple<Final, NonEmpty>) == 12, ""); |
| 94 | +static_assert(sizeof(std::tuple<NonEmpty, NonEmpty>) == 16, ""); |
| 95 | +static_assert(sizeof(std::tuple<NonEmptyFinal, NonEmpty>) == 16, ""); |
| 96 | +static_assert(sizeof(std::tuple<Overaligned, NonEmpty>) == 16, ""); |
| 97 | +static_assert(sizeof(std::tuple<OveralignedFinal, NonEmpty>) == 32, ""); |
| 98 | + |
| 99 | +static_assert(sizeof(std::tuple<S, NonEmptyFinal>) == 8, ""); |
| 100 | +static_assert(sizeof(std::tuple<S&, NonEmptyFinal>) == sizeof(void*) + 8, ""); |
| 101 | +static_assert(sizeof(std::tuple<S&&, NonEmptyFinal>) == sizeof(void*) + 8, ""); |
| 102 | +static_assert(sizeof(std::tuple<Final, NonEmptyFinal>) == 12, ""); |
| 103 | +static_assert(sizeof(std::tuple<NonEmpty, NonEmptyFinal>) == 16, ""); |
| 104 | +static_assert(sizeof(std::tuple<NonEmptyFinal, NonEmptyFinal>) == 16, ""); |
| 105 | +static_assert(sizeof(std::tuple<Overaligned, NonEmptyFinal>) == 16, ""); |
| 106 | +static_assert(sizeof(std::tuple<OveralignedFinal, NonEmptyFinal>) == 32, ""); |
| 107 | + |
| 108 | +static_assert(sizeof(std::tuple<S, Overaligned>) == 16, ""); |
| 109 | +static_assert(sizeof(std::tuple<S&, Overaligned>) == 16, ""); |
| 110 | +static_assert(sizeof(std::tuple<S&&, Overaligned>) == 16, ""); |
| 111 | +static_assert(sizeof(std::tuple<Final, Overaligned>) == 16, ""); |
| 112 | +static_assert(sizeof(std::tuple<NonEmpty, Overaligned>) == 16, ""); |
| 113 | +static_assert(sizeof(std::tuple<NonEmptyFinal, Overaligned>) == 16, ""); |
| 114 | +static_assert(sizeof(std::tuple<Overaligned, Overaligned>) == 32, ""); |
| 115 | +static_assert(sizeof(std::tuple<OveralignedFinal, Overaligned>) == 16, ""); |
| 116 | + |
| 117 | +static_assert(sizeof(std::tuple<S, OveralignedFinal>) == 16, ""); |
| 118 | +static_assert(sizeof(std::tuple<S&, OveralignedFinal>) == 32, ""); |
| 119 | +static_assert(sizeof(std::tuple<S&&, OveralignedFinal>) == 32, ""); |
| 120 | +static_assert(sizeof(std::tuple<Final, OveralignedFinal>) == 32, ""); |
| 121 | +static_assert(sizeof(std::tuple<NonEmpty, OveralignedFinal>) == 32, ""); |
| 122 | +static_assert(sizeof(std::tuple<NonEmptyFinal, OveralignedFinal>) == 32, ""); |
| 123 | +static_assert(sizeof(std::tuple<Overaligned, OveralignedFinal>) == 16, ""); |
| 124 | +static_assert(sizeof(std::tuple<OveralignedFinal, OveralignedFinal>) == 32, ""); |
0 commit comments