Home | History | Annotate | Download | only in meta.type.synop
      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 // <experimental/type_traits>
     11 
     12 #include <experimental/type_traits>
     13 
     14 #if _LIBCPP_STD_VER > 11
     15 
     16 namespace ex = std::experimental;
     17 
     18 struct non_literal_type { non_literal_type() {} };
     19 struct empty_type {};
     20 
     21 struct polymorphic_type
     22 {
     23     virtual void foo() {}
     24 };
     25 
     26 struct abstract_type
     27 {
     28     virtual void foo() = 0;
     29 };
     30 
     31 struct final_type final {};
     32 
     33 struct virtual_dtor_type
     34 {
     35     virtual ~virtual_dtor_type() {}
     36 };
     37 
     38 void type_properties_test()
     39 {
     40     {
     41         typedef const int T;
     42         static_assert(ex::is_const_v<T>, "");
     43         static_assert(std::is_same<decltype(ex::is_const_v<T>), const bool>::value, "");
     44         static_assert(ex::is_const_v<T> == std::is_const<T>::value, "");
     45     }
     46     {
     47         typedef int T;
     48         static_assert(!ex::is_const_v<T>, "");
     49         static_assert(ex::is_const_v<T> == std::is_const<T>::value, "");
     50     }
     51     {
     52         typedef volatile int T;
     53         static_assert(ex::is_volatile_v<T>, "");
     54         static_assert(std::is_same<decltype(ex::is_volatile_v<T>), const bool>::value, "");
     55         static_assert(ex::is_volatile_v<T> == std::is_volatile<T>::value, "");
     56     }
     57     {
     58         typedef int T;
     59         static_assert(!ex::is_volatile_v<T>, "");
     60         static_assert(ex::is_volatile_v<T> == std::is_volatile<T>::value, "");
     61     }
     62     {
     63         typedef int T;
     64         static_assert(ex::is_trivial_v<T>, "");
     65         static_assert(std::is_same<decltype(ex::is_trivial_v<T>), const bool>::value, "");
     66         static_assert(ex::is_trivial_v<T> == std::is_trivial<T>::value, "");
     67     }
     68     {
     69         typedef int & T;
     70         static_assert(!ex::is_trivial_v<T>, "");
     71         static_assert(ex::is_trivial_v<T> == std::is_trivial<T>::value, "");
     72     }
     73     {
     74         typedef int T;
     75         static_assert(ex::is_trivially_copyable_v<T>, "");
     76         static_assert(std::is_same<decltype(ex::is_trivially_copyable_v<T>), const bool>::value, "");
     77         static_assert(ex::is_trivially_copyable_v<T> == std::is_trivially_copyable<T>::value, "");
     78     }
     79     {
     80         typedef int & T;
     81         static_assert(!ex::is_trivially_copyable_v<T>, "");
     82         static_assert(ex::is_trivially_copyable_v<T> == std::is_trivially_copyable<T>::value, "");
     83     }
     84     {
     85         typedef int T;
     86         static_assert(ex::is_standard_layout_v<T>, "");
     87         static_assert(std::is_same<decltype(ex::is_standard_layout_v<T>), const bool>::value, "");
     88         static_assert(ex::is_standard_layout_v<T> == std::is_standard_layout<T>::value, "");
     89     }
     90     {
     91         typedef int & T;
     92         static_assert(!ex::is_standard_layout_v<T>, "");
     93         static_assert(ex::is_standard_layout_v<T> == std::is_standard_layout<T>::value, "");
     94     }
     95     {
     96         typedef int T;
     97         static_assert(ex::is_pod_v<T>, "");
     98         static_assert(std::is_same<decltype(ex::is_pod_v<T>), const bool>::value, "");
     99         static_assert(ex::is_pod_v<T> == std::is_pod<T>::value, "");
    100     }
    101     {
    102         typedef int & T;
    103         static_assert(!ex::is_pod_v<T>, "");
    104         static_assert(ex::is_pod_v<T> == std::is_pod<T>::value, "");
    105     }
    106     {
    107         typedef int T;
    108         static_assert(ex::is_literal_type_v<T>, "");
    109         static_assert(std::is_same<decltype(ex::is_literal_type_v<T>), const bool>::value, "");
    110         static_assert(ex::is_literal_type_v<T> == std::is_literal_type<T>::value, "");
    111     }
    112     {
    113         typedef non_literal_type T;
    114         static_assert(!ex::is_literal_type_v<T>, "");
    115         static_assert(ex::is_literal_type_v<T> == std::is_literal_type<T>::value, "");
    116     }
    117     {
    118         typedef empty_type T;
    119         static_assert(ex::is_empty_v<T>, "");
    120         static_assert(std::is_same<decltype(ex::is_empty_v<T>), const bool>::value, "");
    121         static_assert(ex::is_empty_v<T> == std::is_empty<T>::value, "");
    122     }
    123     {
    124         typedef int T;
    125         static_assert(!ex::is_empty_v<T>, "");
    126         static_assert(ex::is_empty_v<T> == std::is_empty<T>::value, "");
    127     }
    128     {
    129         typedef polymorphic_type T;
    130         static_assert(ex::is_polymorphic_v<T>, "");
    131         static_assert(std::is_same<decltype(ex::is_polymorphic_v<T>), const bool>::value, "");
    132         static_assert(ex::is_polymorphic_v<T> == std::is_polymorphic<T>::value, "");
    133     }
    134     {
    135         typedef int T;
    136         static_assert(!ex::is_polymorphic_v<T>, "");
    137         static_assert(ex::is_polymorphic_v<T> == std::is_polymorphic<T>::value, "");
    138     }
    139     {
    140         typedef abstract_type T;
    141         static_assert(ex::is_abstract_v<T>, "");
    142         static_assert(std::is_same<decltype(ex::is_abstract_v<T>), const bool>::value, "");
    143         static_assert(ex::is_abstract_v<T> == std::is_abstract<T>::value, "");
    144     }
    145     {
    146         typedef int T;
    147         static_assert(!ex::is_abstract_v<T>, "");
    148         static_assert(ex::is_abstract_v<T> == std::is_abstract<T>::value, "");
    149     }
    150     {
    151         typedef final_type T;
    152         static_assert(ex::is_final_v<T>, "");
    153         static_assert(std::is_same<decltype(ex::is_final_v<T>), const bool>::value, "");
    154         static_assert(ex::is_final_v<T> == std::is_final<T>::value, "");
    155     }
    156     {
    157         typedef int T;
    158         static_assert(!ex::is_final_v<T>, "");
    159         static_assert(ex::is_final_v<T> == std::is_final<T>::value, "");
    160     }
    161     {
    162         typedef int T;
    163         static_assert(ex::is_signed_v<T>, "");
    164         static_assert(std::is_same<decltype(ex::is_signed_v<T>), const bool>::value, "");
    165         static_assert(ex::is_signed_v<T> == std::is_signed<T>::value, "");
    166     }
    167     {
    168         typedef unsigned T;
    169         static_assert(!ex::is_signed_v<T>, "");
    170         static_assert(ex::is_signed_v<T> == std::is_signed<T>::value, "");
    171     }
    172     {
    173         typedef unsigned T;
    174         static_assert(ex::is_unsigned_v<T>, "");
    175         static_assert(std::is_same<decltype(ex::is_unsigned_v<T>), const bool>::value, "");
    176         static_assert(ex::is_unsigned_v<T> == std::is_unsigned<T>::value, "");
    177     }
    178     {
    179         typedef int T;
    180         static_assert(!ex::is_unsigned_v<T>, "");
    181         static_assert(ex::is_unsigned_v<T> == std::is_unsigned<T>::value, "");
    182     }
    183 }
    184 
    185 void is_constructible_and_assignable_test()
    186 {
    187     {
    188         typedef int T;
    189         static_assert(ex::is_constructible_v<T, int>, "");
    190         static_assert(std::is_same<decltype(ex::is_constructible_v<T, int>), const bool>::value, "");
    191         static_assert(ex::is_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    192     }
    193     {
    194         typedef void T;
    195         static_assert(!ex::is_constructible_v<T, int>, "");
    196         static_assert(ex::is_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    197     }
    198     {
    199         typedef int T;
    200         static_assert(ex::is_default_constructible_v<T>, "");
    201         static_assert(std::is_same<decltype(ex::is_default_constructible_v<T>), const bool>::value, "");
    202         static_assert(ex::is_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    203     }
    204     {
    205         typedef int & T;
    206         static_assert(!ex::is_default_constructible_v<T>, "");
    207         static_assert(ex::is_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    208     }
    209     {
    210         typedef int T;
    211         static_assert(ex::is_copy_constructible_v<T>, "");
    212         static_assert(std::is_same<decltype(ex::is_copy_constructible_v<T>), const bool>::value, "");
    213         static_assert(ex::is_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    214     }
    215     {
    216         typedef void T;
    217         static_assert(!ex::is_copy_constructible_v<T>, "");
    218         static_assert(ex::is_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    219     }
    220     {
    221         typedef int T;
    222         static_assert(ex::is_move_constructible_v<T>, "");
    223         static_assert(std::is_same<decltype(ex::is_move_constructible_v<T>), const bool>::value, "");
    224         static_assert(ex::is_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    225     }
    226     {
    227         typedef void T;
    228         static_assert(!ex::is_move_constructible_v<T>, "");
    229         static_assert(ex::is_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    230     }
    231     {
    232         typedef int & T;
    233         typedef int U;
    234         static_assert(ex::is_assignable_v<T, U>, "");
    235         static_assert(std::is_same<decltype(ex::is_assignable_v<T, U>), const bool>::value, "");
    236         static_assert(ex::is_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    237     }
    238     {
    239         typedef int & T;
    240         typedef void U;
    241         static_assert(!ex::is_assignable_v<T, U>, "");
    242         static_assert(ex::is_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    243     }
    244     {
    245         typedef int T;
    246         static_assert(ex::is_copy_assignable_v<T>, "");
    247         static_assert(std::is_same<decltype(ex::is_copy_assignable_v<T>), const bool>::value, "");
    248         static_assert(ex::is_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    249     }
    250     {
    251         typedef void T;
    252         static_assert(!ex::is_copy_assignable_v<T>, "");
    253         static_assert(ex::is_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    254     }
    255     {
    256         typedef int T;
    257         static_assert(ex::is_move_assignable_v<T>, "");
    258         static_assert(std::is_same<decltype(ex::is_move_assignable_v<T>), const bool>::value, "");
    259         static_assert(ex::is_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    260     }
    261     {
    262         typedef void T;
    263         static_assert(!ex::is_move_assignable_v<T>, "");
    264         static_assert(ex::is_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    265     }
    266     {
    267         typedef int T;
    268         static_assert(ex::is_destructible_v<T>, "");
    269         static_assert(std::is_same<decltype(ex::is_destructible_v<T>), const bool>::value, "");
    270         static_assert(ex::is_destructible_v<T> == std::is_destructible<T>::value, "");
    271     }
    272     {
    273         typedef void T;
    274         static_assert(!ex::is_destructible_v<T>, "");
    275         static_assert(ex::is_destructible_v<T> == std::is_destructible<T>::value, "");
    276     }
    277 }
    278 
    279 void is_trivially_constructible_and_assignable_test()
    280 {
    281     {
    282         typedef int T;
    283         static_assert(ex::is_trivially_constructible_v<T, int>, "");
    284         static_assert(std::is_same<decltype(ex::is_trivially_constructible_v<T, int>), const bool>::value, "");
    285         static_assert(ex::is_trivially_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    286     }
    287     {
    288         typedef void T;
    289         static_assert(!ex::is_trivially_constructible_v<T, int>, "");
    290         static_assert(ex::is_trivially_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    291     }
    292     {
    293         typedef int T;
    294         static_assert(ex::is_trivially_default_constructible_v<T>, "");
    295         static_assert(std::is_same<decltype(ex::is_trivially_default_constructible_v<T>), const bool>::value, "");
    296         static_assert(ex::is_trivially_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    297     }
    298     {
    299         typedef int & T;
    300         static_assert(!ex::is_trivially_default_constructible_v<T>, "");
    301         static_assert(ex::is_trivially_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    302     }
    303     {
    304         typedef int T;
    305         static_assert(ex::is_trivially_copy_constructible_v<T>, "");
    306         static_assert(std::is_same<decltype(ex::is_trivially_copy_constructible_v<T>), const bool>::value, "");
    307         static_assert(ex::is_trivially_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    308     }
    309     {
    310         typedef void T;
    311         static_assert(!ex::is_trivially_copy_constructible_v<T>, "");
    312         static_assert(ex::is_trivially_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    313     }
    314     {
    315         typedef int T;
    316         static_assert(ex::is_trivially_move_constructible_v<T>, "");
    317         static_assert(std::is_same<decltype(ex::is_trivially_move_constructible_v<T>), const bool>::value, "");
    318         static_assert(ex::is_trivially_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    319     }
    320     {
    321         typedef void T;
    322         static_assert(!ex::is_trivially_move_constructible_v<T>, "");
    323         static_assert(ex::is_trivially_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    324     }
    325     {
    326         typedef int & T;
    327         typedef int U;
    328         static_assert(ex::is_trivially_assignable_v<T, U>, "");
    329         static_assert(std::is_same<decltype(ex::is_trivially_assignable_v<T, U>), const bool>::value, "");
    330         static_assert(ex::is_trivially_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    331     }
    332     {
    333         typedef int & T;
    334         typedef void U;
    335         static_assert(!ex::is_trivially_assignable_v<T, U>, "");
    336         static_assert(ex::is_trivially_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    337     }
    338     {
    339         typedef int T;
    340         static_assert(ex::is_trivially_copy_assignable_v<T>, "");
    341         static_assert(std::is_same<decltype(ex::is_trivially_copy_assignable_v<T>), const bool>::value, "");
    342         static_assert(ex::is_trivially_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    343     }
    344     {
    345         typedef void T;
    346         static_assert(!ex::is_trivially_copy_assignable_v<T>, "");
    347         static_assert(ex::is_trivially_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    348     }
    349     {
    350         typedef int T;
    351         static_assert(ex::is_trivially_move_assignable_v<T>, "");
    352         static_assert(std::is_same<decltype(ex::is_trivially_move_assignable_v<T>), const bool>::value, "");
    353         static_assert(ex::is_trivially_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    354     }
    355     {
    356         typedef void T;
    357         static_assert(!ex::is_trivially_move_assignable_v<T>, "");
    358         static_assert(ex::is_trivially_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    359     }
    360     {
    361         typedef int T;
    362         static_assert(ex::is_trivially_destructible_v<T>, "");
    363         static_assert(std::is_same<decltype(ex::is_trivially_destructible_v<T>), const bool>::value, "");
    364         static_assert(ex::is_trivially_destructible_v<T> == std::is_destructible<T>::value, "");
    365     }
    366     {
    367         typedef void T;
    368         static_assert(!ex::is_trivially_destructible_v<T>, "");
    369         static_assert(ex::is_trivially_destructible_v<T> == std::is_destructible<T>::value, "");
    370     }
    371 }
    372 
    373 
    374 
    375 void is_nothrow_constructible_and_assignable_test()
    376 {
    377     {
    378         typedef int T;
    379         static_assert(ex::is_nothrow_constructible_v<T, int>, "");
    380         static_assert(std::is_same<decltype(ex::is_nothrow_constructible_v<T, int>), const bool>::value, "");
    381         static_assert(ex::is_nothrow_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    382     }
    383     {
    384         typedef void T;
    385         static_assert(!ex::is_nothrow_constructible_v<T, int>, "");
    386         static_assert(ex::is_nothrow_constructible_v<T, int> == std::is_constructible<T, int>::value, "");
    387     }
    388     {
    389         typedef int T;
    390         static_assert(ex::is_nothrow_default_constructible_v<T>, "");
    391         static_assert(std::is_same<decltype(ex::is_nothrow_default_constructible_v<T>), const bool>::value, "");
    392         static_assert(ex::is_nothrow_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    393     }
    394     {
    395         typedef int & T;
    396         static_assert(!ex::is_nothrow_default_constructible_v<T>, "");
    397         static_assert(ex::is_nothrow_default_constructible_v<T> == std::is_default_constructible<T>::value, "");
    398     }
    399     {
    400         typedef int T;
    401         static_assert(ex::is_nothrow_copy_constructible_v<T>, "");
    402         static_assert(std::is_same<decltype(ex::is_nothrow_copy_constructible_v<T>), const bool>::value, "");
    403         static_assert(ex::is_nothrow_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    404     }
    405     {
    406         typedef void T;
    407         static_assert(!ex::is_nothrow_copy_constructible_v<T>, "");
    408         static_assert(ex::is_nothrow_copy_constructible_v<T> == std::is_copy_constructible<T>::value, "");
    409     }
    410     {
    411         typedef int T;
    412         static_assert(ex::is_nothrow_move_constructible_v<T>, "");
    413         static_assert(std::is_same<decltype(ex::is_nothrow_move_constructible_v<T>), const bool>::value, "");
    414         static_assert(ex::is_nothrow_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    415     }
    416     {
    417         typedef void T;
    418         static_assert(!ex::is_nothrow_move_constructible_v<T>, "");
    419         static_assert(ex::is_nothrow_move_constructible_v<T> == std::is_move_constructible<T>::value, "");
    420     }
    421     {
    422         typedef int & T;
    423         typedef int U;
    424         static_assert(ex::is_nothrow_assignable_v<T, U>, "");
    425         static_assert(std::is_same<decltype(ex::is_nothrow_assignable_v<T, U>), const bool>::value, "");
    426         static_assert(ex::is_nothrow_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    427     }
    428     {
    429         typedef int & T;
    430         typedef void U;
    431         static_assert(!ex::is_nothrow_assignable_v<T, U>, "");
    432         static_assert(ex::is_nothrow_assignable_v<T, U> == std::is_assignable<T, U>::value, "");
    433     }
    434     {
    435         typedef int T;
    436         static_assert(ex::is_nothrow_copy_assignable_v<T>, "");
    437         static_assert(std::is_same<decltype(ex::is_nothrow_copy_assignable_v<T>), const bool>::value, "");
    438         static_assert(ex::is_nothrow_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    439     }
    440     {
    441         typedef void T;
    442         static_assert(!ex::is_nothrow_copy_assignable_v<T>, "");
    443         static_assert(ex::is_nothrow_copy_assignable_v<T> == std::is_copy_assignable<T>::value, "");
    444     }
    445     {
    446         typedef int T;
    447         static_assert(ex::is_nothrow_move_assignable_v<T>, "");
    448         static_assert(std::is_same<decltype(ex::is_nothrow_move_assignable_v<T>), const bool>::value, "");
    449         static_assert(ex::is_nothrow_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    450     }
    451     {
    452         typedef void T;
    453         static_assert(!ex::is_nothrow_move_assignable_v<T>, "");
    454         static_assert(ex::is_nothrow_move_assignable_v<T> == std::is_move_assignable<T>::value, "");
    455     }
    456     {
    457         typedef int T;
    458         static_assert(ex::is_nothrow_destructible_v<T>, "");
    459         static_assert(std::is_same<decltype(ex::is_nothrow_destructible_v<T>), const bool>::value, "");
    460         static_assert(ex::is_nothrow_destructible_v<T> == std::is_destructible<T>::value, "");
    461     }
    462     {
    463         typedef void T;
    464         static_assert(!ex::is_nothrow_destructible_v<T>, "");
    465         static_assert(ex::is_nothrow_destructible_v<T> == std::is_destructible<T>::value, "");
    466     }
    467 }
    468 
    469 int main()
    470 {
    471     type_properties_test();
    472     is_constructible_and_assignable_test();
    473     is_trivially_constructible_and_assignable_test();
    474     is_nothrow_constructible_and_assignable_test();
    475     {
    476         typedef virtual_dtor_type T;
    477         static_assert(ex::has_virtual_destructor_v<T>, "");
    478         static_assert(std::is_same<decltype(ex::has_virtual_destructor_v<T>), const bool>::value, "");
    479         static_assert(ex::has_virtual_destructor_v<T> == std::has_virtual_destructor<T>::value, "");
    480     }
    481     {
    482         typedef int T;
    483         static_assert(!ex::has_virtual_destructor_v<T>, "");
    484         static_assert(ex::has_virtual_destructor_v<T> == std::has_virtual_destructor<T>::value, "");
    485     }
    486 }
    487 #else /* _LIBCPP_STD_VER <= 11 */
    488 int main() {}
    489 #endif /* _LIBCPP_STD_VER > 11 */
    490