Home | History | Annotate | Download | only in meta.trans.other
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // type_traits
     11 
     12 // aligned_storage
     13 
     14 #include <type_traits>
     15 
     16 int main()
     17 {
     18     {
     19     typedef std::aligned_storage<10, 1 >::type T1;
     20 #if _LIBCPP_STD_VER > 11
     21     static_assert(std::is_same<std::aligned_storage_t<10, 1>, T1>::value, "" );
     22 #endif
     23     static_assert(std::alignment_of<T1>::value == 1, "");
     24     static_assert(sizeof(T1) == 10, "");
     25     }
     26     {
     27     typedef std::aligned_storage<10, 2 >::type T1;
     28 #if _LIBCPP_STD_VER > 11
     29     static_assert(std::is_same<std::aligned_storage_t<10, 2>, T1>::value, "" );
     30 #endif
     31     static_assert(std::alignment_of<T1>::value == 2, "");
     32     static_assert(sizeof(T1) == 10, "");
     33     }
     34     {
     35     typedef std::aligned_storage<10, 4 >::type T1;
     36 #if _LIBCPP_STD_VER > 11
     37     static_assert(std::is_same<std::aligned_storage_t<10, 4>, T1>::value, "" );
     38 #endif
     39     static_assert(std::alignment_of<T1>::value == 4, "");
     40     static_assert(sizeof(T1) == 12, "");
     41     }
     42     {
     43     typedef std::aligned_storage<10, 8 >::type T1;
     44 #if _LIBCPP_STD_VER > 11
     45     static_assert(std::is_same<std::aligned_storage_t<10, 8>, T1>::value, "" );
     46 #endif
     47     static_assert(std::alignment_of<T1>::value == 8, "");
     48     static_assert(sizeof(T1) == 16, "");
     49     }
     50     {
     51     typedef std::aligned_storage<10, 16 >::type T1;
     52 #if _LIBCPP_STD_VER > 11
     53     static_assert(std::is_same<std::aligned_storage_t<10, 16>, T1>::value, "" );
     54 #endif
     55     static_assert(std::alignment_of<T1>::value == 16, "");
     56     static_assert(sizeof(T1) == 16, "");
     57     }
     58     {
     59     typedef std::aligned_storage<10, 32 >::type T1;
     60 #if _LIBCPP_STD_VER > 11
     61     static_assert(std::is_same<std::aligned_storage_t<10, 32>, T1>::value, "" );
     62 #endif
     63     static_assert(std::alignment_of<T1>::value == 32, "");
     64     static_assert(sizeof(T1) == 32, "");
     65     }
     66     {
     67     typedef std::aligned_storage<20, 32 >::type T1;
     68 #if _LIBCPP_STD_VER > 11
     69     static_assert(std::is_same<std::aligned_storage_t<20, 32>, T1>::value, "" );
     70 #endif
     71     static_assert(std::alignment_of<T1>::value == 32, "");
     72     static_assert(sizeof(T1) == 32, "");
     73     }
     74     {
     75     typedef std::aligned_storage<40, 32 >::type T1;
     76 #if _LIBCPP_STD_VER > 11
     77     static_assert(std::is_same<std::aligned_storage_t<40, 32>, T1>::value, "" );
     78 #endif
     79     static_assert(std::alignment_of<T1>::value == 32, "");
     80     static_assert(sizeof(T1) == 64, "");
     81     }
     82     {
     83     typedef std::aligned_storage<12, 16 >::type T1;
     84 #if _LIBCPP_STD_VER > 11
     85     static_assert(std::is_same<std::aligned_storage_t<12, 16>, T1>::value, "" );
     86 #endif
     87     static_assert(std::alignment_of<T1>::value == 16, "");
     88     static_assert(sizeof(T1) == 16, "");
     89     }
     90     {
     91     typedef std::aligned_storage<1>::type T1;
     92 #if _LIBCPP_STD_VER > 11
     93     static_assert(std::is_same<std::aligned_storage_t<1>, T1>::value, "" );
     94 #endif
     95     static_assert(std::alignment_of<T1>::value == 1, "");
     96     static_assert(sizeof(T1) == 1, "");
     97     }
     98     {
     99     typedef std::aligned_storage<2>::type T1;
    100 #if _LIBCPP_STD_VER > 11
    101     static_assert(std::is_same<std::aligned_storage_t<2>, T1>::value, "" );
    102 #endif
    103     static_assert(std::alignment_of<T1>::value == 2, "");
    104     static_assert(sizeof(T1) == 2, "");
    105     }
    106     {
    107     typedef std::aligned_storage<3>::type T1;
    108 #if _LIBCPP_STD_VER > 11
    109     static_assert(std::is_same<std::aligned_storage_t<3>, T1>::value, "" );
    110 #endif
    111     static_assert(std::alignment_of<T1>::value == 2, "");
    112     static_assert(sizeof(T1) == 4, "");
    113     }
    114     {
    115     typedef std::aligned_storage<4>::type T1;
    116 #if _LIBCPP_STD_VER > 11
    117     static_assert(std::is_same<std::aligned_storage_t<4>, T1>::value, "" );
    118 #endif
    119     static_assert(std::alignment_of<T1>::value == 4, "");
    120     static_assert(sizeof(T1) == 4, "");
    121     }
    122     {
    123     typedef std::aligned_storage<5>::type T1;
    124 #if _LIBCPP_STD_VER > 11
    125     static_assert(std::is_same<std::aligned_storage_t<5>, T1>::value, "" );
    126 #endif
    127     static_assert(std::alignment_of<T1>::value == 4, "");
    128     static_assert(sizeof(T1) == 8, "");
    129     }
    130     {
    131     typedef std::aligned_storage<7>::type T1;
    132 #if _LIBCPP_STD_VER > 11
    133     static_assert(std::is_same<std::aligned_storage_t<7>, T1>::value, "" );
    134 #endif
    135     static_assert(std::alignment_of<T1>::value == 4, "");
    136     static_assert(sizeof(T1) == 8, "");
    137     }
    138     {
    139     typedef std::aligned_storage<8>::type T1;
    140 #if _LIBCPP_STD_VER > 11
    141     static_assert(std::is_same<std::aligned_storage_t<8>, T1>::value, "" );
    142 #endif
    143     static_assert(std::alignment_of<T1>::value == 8, "");
    144     static_assert(sizeof(T1) == 8, "");
    145     }
    146     {
    147     typedef std::aligned_storage<9>::type T1;
    148 #if _LIBCPP_STD_VER > 11
    149     static_assert(std::is_same<std::aligned_storage_t<9>, T1>::value, "" );
    150 #endif
    151     static_assert(std::alignment_of<T1>::value == 8, "");
    152     static_assert(sizeof(T1) == 16, "");
    153     }
    154     {
    155     typedef std::aligned_storage<15>::type T1;
    156 #if _LIBCPP_STD_VER > 11
    157     static_assert(std::is_same<std::aligned_storage_t<15>, T1>::value, "" );
    158 #endif
    159     static_assert(std::alignment_of<T1>::value == 8, "");
    160     static_assert(sizeof(T1) == 16, "");
    161     }
    162     // The expected values for the tests below (modulo the last one) are
    163     // platform-specific which alignof deals with. In particular, the maximum
    164     // alignment value on ARM is 8 bytes as opposed to 16 bytes on some other
    165     // architectures that support 128 bit memory accesses.
    166     {
    167     typedef std::aligned_storage<16>::type T1;
    168 #if _LIBCPP_STD_VER > 11
    169     static_assert(std::is_same<std::aligned_storage_t<16>, T1>::value, "" );
    170 #endif
    171     static_assert(std::alignment_of<T1>::value == alignof(T1), "");
    172     static_assert(sizeof(T1) == 16, "");
    173     }
    174     {
    175     typedef std::aligned_storage<17>::type T1;
    176 #if _LIBCPP_STD_VER > 11
    177     static_assert(std::is_same<std::aligned_storage_t<17>, T1>::value, "" );
    178 #endif
    179     static_assert(std::alignment_of<T1>::value == alignof(T1), "");
    180     static_assert(sizeof(T1) == 16 + alignof(T1), "");
    181     }
    182     {
    183     typedef std::aligned_storage<10>::type T1;
    184 #if _LIBCPP_STD_VER > 11
    185     static_assert(std::is_same<std::aligned_storage_t<10>, T1>::value, "" );
    186 #endif
    187     static_assert(std::alignment_of<T1>::value == 8, "");
    188     static_assert(sizeof(T1) == 16, "");
    189     }
    190 }
    191