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 "test_macros.h" 18 19 struct wat 20 { 21 wat& operator*() { return *this; } 22 void foo(); 23 }; 24 25 struct F {}; 26 27 template <class T, class U> 28 void test_result_of_imp() 29 { 30 static_assert((std::is_same<typename std::result_of<T>::type, U>::value), ""); 31 #if TEST_STD_VER > 11 32 static_assert((std::is_same<std::result_of_t<T>, U>::value), ""); 33 #endif 34 } 35 36 int main() 37 { 38 { 39 typedef char F::*PMD; 40 test_result_of_imp<PMD(F &), char &>(); 41 test_result_of_imp<PMD(F const &), char const &>(); 42 test_result_of_imp<PMD(F volatile &), char volatile &>(); 43 test_result_of_imp<PMD(F const volatile &), char const volatile &>(); 44 45 test_result_of_imp<PMD(F &&), char &&>(); 46 test_result_of_imp<PMD(F const &&), char const &&>(); 47 test_result_of_imp<PMD(F volatile &&), char volatile &&>(); 48 test_result_of_imp<PMD(F const volatile &&), char const volatile &&>(); 49 50 test_result_of_imp<PMD(F ), char &&>(); 51 test_result_of_imp<PMD(F const ), char &&>(); 52 test_result_of_imp<PMD(F volatile ), char &&>(); 53 test_result_of_imp<PMD(F const volatile ), char &&>(); 54 } 55 { 56 test_result_of_imp<int (F::* (F &)) () &, int> (); 57 test_result_of_imp<int (F::* (F &)) () const &, int> (); 58 test_result_of_imp<int (F::* (F &)) () volatile &, int> (); 59 test_result_of_imp<int (F::* (F &)) () const volatile &, int> (); 60 test_result_of_imp<int (F::* (F const &)) () const &, int> (); 61 test_result_of_imp<int (F::* (F const &)) () const volatile &, int> (); 62 test_result_of_imp<int (F::* (F volatile &)) () volatile &, int> (); 63 test_result_of_imp<int (F::* (F volatile &)) () const volatile &, int> (); 64 test_result_of_imp<int (F::* (F const volatile &)) () const volatile &, int> (); 65 66 test_result_of_imp<int (F::* (F &&)) () &&, int> (); 67 test_result_of_imp<int (F::* (F &&)) () const &&, int> (); 68 test_result_of_imp<int (F::* (F &&)) () volatile &&, int> (); 69 test_result_of_imp<int (F::* (F &&)) () const volatile &&, int> (); 70 test_result_of_imp<int (F::* (F const &&)) () const &&, int> (); 71 test_result_of_imp<int (F::* (F const &&)) () const volatile &&, int> (); 72 test_result_of_imp<int (F::* (F volatile &&)) () volatile &&, int> (); 73 test_result_of_imp<int (F::* (F volatile &&)) () const volatile &&, int> (); 74 test_result_of_imp<int (F::* (F const volatile &&)) () const volatile &&, int> (); 75 76 test_result_of_imp<int (F::* (F )) () &&, int> (); 77 test_result_of_imp<int (F::* (F )) () const &&, int> (); 78 test_result_of_imp<int (F::* (F )) () volatile &&, int> (); 79 test_result_of_imp<int (F::* (F )) () const volatile &&, int> (); 80 test_result_of_imp<int (F::* (F const )) () const &&, int> (); 81 test_result_of_imp<int (F::* (F const )) () const volatile &&, int> (); 82 test_result_of_imp<int (F::* (F volatile )) () volatile &&, int> (); 83 test_result_of_imp<int (F::* (F volatile )) () const volatile &&, int> (); 84 test_result_of_imp<int (F::* (F const volatile )) () const volatile &&, int> (); 85 } 86 87 test_result_of_imp<decltype(&wat::foo)(wat), void>(); 88 } 89