weak_result.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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// <functional>
11
12// reference_wrapper
13
14// has weak result type
15
16#include <functional>
17#include <type_traits>
18
19class functor1
20    : public std::unary_function<int, char>
21{
22};
23
24class functor2
25    : public std::binary_function<char, int, double>
26{
27};
28
29class functor3
30    : public std::unary_function<char, int>,
31      public std::binary_function<char, int, double>
32{
33public:
34    typedef float result_type;
35};
36
37class functor4
38    : public std::unary_function<char, int>,
39      public std::binary_function<char, int, double>
40{
41public:
42};
43
44class C {};
45
46template <class T>
47struct has_result_type
48{
49private:
50    struct two {char _; char __;};
51    template <class U> static two test(...);
52    template <class U> static char test(typename U::result_type* = 0);
53public:
54    static const bool value = sizeof(test<T>(0)) == 1;
55};
56
57int main()
58{
59    static_assert((std::is_same<std::reference_wrapper<functor1>::result_type,
60                                char>::value), "");
61    static_assert((std::is_same<std::reference_wrapper<functor2>::result_type,
62                                double>::value), "");
63    static_assert((std::is_same<std::reference_wrapper<functor3>::result_type,
64                                float>::value), "");
65    static_assert((std::is_same<std::reference_wrapper<void()>::result_type,
66                                void>::value), "");
67    static_assert((std::is_same<std::reference_wrapper<int*(double*)>::result_type,
68                                int*>::value), "");
69    static_assert((std::is_same<std::reference_wrapper<void(*)()>::result_type,
70                                void>::value), "");
71    static_assert((std::is_same<std::reference_wrapper<int*(*)(double*)>::result_type,
72                                int*>::value), "");
73    static_assert((std::is_same<std::reference_wrapper<int*(C::*)(double*)>::result_type,
74                                int*>::value), "");
75    static_assert((std::is_same<std::reference_wrapper<int (C::*)(double*) const volatile>::result_type,
76                                int>::value), "");
77    static_assert((std::is_same<std::reference_wrapper<C()>::result_type,
78                                C>::value), "");
79    static_assert(has_result_type<std::reference_wrapper<functor3> >::value, "");
80    static_assert(!has_result_type<std::reference_wrapper<functor4> >::value, "");
81    static_assert(!has_result_type<std::reference_wrapper<C> >::value, "");
82}
83