libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

result_of11.pass.cpp (8532B)


      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 // UNSUPPORTED: c++98, c++03
     11 //
     12 // <functional>
     13 //
     14 // result_of<Fn(ArgTypes...)>
     15 
     16 #include <type_traits>
     17 #include <memory>
     18 #include <utility>
     19 #include "test_macros.h"
     20 
     21 struct wat
     22 {
     23     wat& operator*() { return *this; }
     24     void foo();
     25 };
     26 
     27 struct F {};
     28 struct FD : public F {};
     29 
     30 #if TEST_STD_VER > 14
     31 template <typename T, typename U>
     32 struct test_invoke_result;
     33 
     34 template <typename Fn, typename ...Args, typename Ret>
     35 struct test_invoke_result<Fn(Args...), Ret>
     36 {
     37     static void call()
     38     {
     39         static_assert(std::is_invocable<Fn, Args...>::value, "");
     40         static_assert(std::is_invocable_r<Ret, Fn, Args...>::value, "");
     41         static_assert((std::is_same<typename std::invoke_result<Fn, Args...>::type, Ret>::value), "");
     42         static_assert((std::is_same<std::invoke_result_t<Fn, Args...>, Ret>::value), "");
     43     }
     44 };
     45 #endif
     46 
     47 template <class T, class U>
     48 void test_result_of_imp()
     49 {
     50     static_assert((std::is_same<typename std::result_of<T>::type, U>::value), "");
     51 #if TEST_STD_VER > 11
     52     static_assert((std::is_same<std::result_of_t<T>, U>::value), "");
     53 #endif
     54 #if TEST_STD_VER > 14
     55     test_invoke_result<T, U>::call();
     56 #endif
     57 }
     58 
     59 int main()
     60 {
     61     {
     62     typedef char F::*PMD;
     63     test_result_of_imp<PMD(F                &), char                &>();
     64     test_result_of_imp<PMD(F const          &), char const          &>();
     65     test_result_of_imp<PMD(F volatile       &), char volatile       &>();
     66     test_result_of_imp<PMD(F const volatile &), char const volatile &>();
     67 
     68     test_result_of_imp<PMD(F                &&), char                &&>();
     69     test_result_of_imp<PMD(F const          &&), char const          &&>();
     70     test_result_of_imp<PMD(F volatile       &&), char volatile       &&>();
     71     test_result_of_imp<PMD(F const volatile &&), char const volatile &&>();
     72 
     73     test_result_of_imp<PMD(F                ), char &&>();
     74     test_result_of_imp<PMD(F const          ), char &&>();
     75     test_result_of_imp<PMD(F volatile       ), char &&>();
     76     test_result_of_imp<PMD(F const volatile ), char &&>();
     77 
     78     test_result_of_imp<PMD(FD                &), char                &>();
     79     test_result_of_imp<PMD(FD const          &), char const          &>();
     80     test_result_of_imp<PMD(FD volatile       &), char volatile       &>();
     81     test_result_of_imp<PMD(FD const volatile &), char const volatile &>();
     82 
     83     test_result_of_imp<PMD(FD                &&), char                &&>();
     84     test_result_of_imp<PMD(FD const          &&), char const          &&>();
     85     test_result_of_imp<PMD(FD volatile       &&), char volatile       &&>();
     86     test_result_of_imp<PMD(FD const volatile &&), char const volatile &&>();
     87 
     88     test_result_of_imp<PMD(FD                ), char &&>();
     89     test_result_of_imp<PMD(FD const          ), char &&>();
     90     test_result_of_imp<PMD(FD volatile       ), char &&>();
     91     test_result_of_imp<PMD(FD const volatile ), char &&>();
     92 
     93     test_result_of_imp<PMD(std::unique_ptr<F>),        char &>();
     94     test_result_of_imp<PMD(std::unique_ptr<F const>),  const char &>();
     95     test_result_of_imp<PMD(std::unique_ptr<FD>),       char &>();
     96     test_result_of_imp<PMD(std::unique_ptr<FD const>), const char &>();
     97 
     98     test_result_of_imp<PMD(std::reference_wrapper<F>),        char &>();
     99     test_result_of_imp<PMD(std::reference_wrapper<F const>),  const char &>();
    100     test_result_of_imp<PMD(std::reference_wrapper<FD>),       char &>();
    101     test_result_of_imp<PMD(std::reference_wrapper<FD const>), const char &>();
    102     }
    103     {
    104     test_result_of_imp<int (F::* (F       &)) ()                &, int> ();
    105     test_result_of_imp<int (F::* (F       &)) () const          &, int> ();
    106     test_result_of_imp<int (F::* (F       &)) () volatile       &, int> ();
    107     test_result_of_imp<int (F::* (F       &)) () const volatile &, int> ();
    108     test_result_of_imp<int (F::* (F const &)) () const          &, int> ();
    109     test_result_of_imp<int (F::* (F const &)) () const volatile &, int> ();
    110     test_result_of_imp<int (F::* (F volatile &)) () volatile       &, int> ();
    111     test_result_of_imp<int (F::* (F volatile &)) () const volatile &, int> ();
    112     test_result_of_imp<int (F::* (F const volatile &)) () const volatile &, int> ();
    113 
    114     test_result_of_imp<int (F::* (F       &&)) ()                &&, int> ();
    115     test_result_of_imp<int (F::* (F       &&)) () const          &&, int> ();
    116     test_result_of_imp<int (F::* (F       &&)) () volatile       &&, int> ();
    117     test_result_of_imp<int (F::* (F       &&)) () const volatile &&, int> ();
    118     test_result_of_imp<int (F::* (F const &&)) () const          &&, int> ();
    119     test_result_of_imp<int (F::* (F const &&)) () const volatile &&, int> ();
    120     test_result_of_imp<int (F::* (F volatile &&)) () volatile       &&, int> ();
    121     test_result_of_imp<int (F::* (F volatile &&)) () const volatile &&, int> ();
    122     test_result_of_imp<int (F::* (F const volatile &&)) () const volatile &&, int> ();
    123 
    124     test_result_of_imp<int (F::* (F       )) ()                &&, int> ();
    125     test_result_of_imp<int (F::* (F       )) () const          &&, int> ();
    126     test_result_of_imp<int (F::* (F       )) () volatile       &&, int> ();
    127     test_result_of_imp<int (F::* (F       )) () const volatile &&, int> ();
    128     test_result_of_imp<int (F::* (F const )) () const          &&, int> ();
    129     test_result_of_imp<int (F::* (F const )) () const volatile &&, int> ();
    130     test_result_of_imp<int (F::* (F volatile )) () volatile       &&, int> ();
    131     test_result_of_imp<int (F::* (F volatile )) () const volatile &&, int> ();
    132     test_result_of_imp<int (F::* (F const volatile )) () const volatile &&, int> ();
    133     }
    134     {
    135     test_result_of_imp<int (F::* (FD       &)) ()                &, int> ();
    136     test_result_of_imp<int (F::* (FD       &)) () const          &, int> ();
    137     test_result_of_imp<int (F::* (FD       &)) () volatile       &, int> ();
    138     test_result_of_imp<int (F::* (FD       &)) () const volatile &, int> ();
    139     test_result_of_imp<int (F::* (FD const &)) () const          &, int> ();
    140     test_result_of_imp<int (F::* (FD const &)) () const volatile &, int> ();
    141     test_result_of_imp<int (F::* (FD volatile &)) () volatile       &, int> ();
    142     test_result_of_imp<int (F::* (FD volatile &)) () const volatile &, int> ();
    143     test_result_of_imp<int (F::* (FD const volatile &)) () const volatile &, int> ();
    144 
    145     test_result_of_imp<int (F::* (FD       &&)) ()                &&, int> ();
    146     test_result_of_imp<int (F::* (FD       &&)) () const          &&, int> ();
    147     test_result_of_imp<int (F::* (FD       &&)) () volatile       &&, int> ();
    148     test_result_of_imp<int (F::* (FD       &&)) () const volatile &&, int> ();
    149     test_result_of_imp<int (F::* (FD const &&)) () const          &&, int> ();
    150     test_result_of_imp<int (F::* (FD const &&)) () const volatile &&, int> ();
    151     test_result_of_imp<int (F::* (FD volatile &&)) () volatile       &&, int> ();
    152     test_result_of_imp<int (F::* (FD volatile &&)) () const volatile &&, int> ();
    153     test_result_of_imp<int (F::* (FD const volatile &&)) () const volatile &&, int> ();
    154 
    155     test_result_of_imp<int (F::* (FD       )) ()                &&, int> ();
    156     test_result_of_imp<int (F::* (FD       )) () const          &&, int> ();
    157     test_result_of_imp<int (F::* (FD       )) () volatile       &&, int> ();
    158     test_result_of_imp<int (F::* (FD       )) () const volatile &&, int> ();
    159     test_result_of_imp<int (F::* (FD const )) () const          &&, int> ();
    160     test_result_of_imp<int (F::* (FD const )) () const volatile &&, int> ();
    161     test_result_of_imp<int (F::* (FD volatile )) () volatile       &&, int> ();
    162     test_result_of_imp<int (F::* (FD volatile )) () const volatile &&, int> ();
    163     test_result_of_imp<int (F::* (FD const volatile )) () const volatile &&, int> ();
    164     }
    165     {
    166     test_result_of_imp<int (F::* (std::reference_wrapper<F>))       (),       int>();
    167     test_result_of_imp<int (F::* (std::reference_wrapper<const F>)) () const, int>();
    168     test_result_of_imp<int (F::* (std::unique_ptr<F>       ))       (),       int>();
    169     test_result_of_imp<int (F::* (std::unique_ptr<const F> ))       () const, int>();
    170     }
    171     test_result_of_imp<decltype(&wat::foo)(wat), void>();
    172 }