]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/testsuite/20_util/reference_wrapper/invoke.cc
Update copyright years in libstdc++-v3/
[thirdparty/gcc.git] / libstdc++-v3 / testsuite / 20_util / reference_wrapper / invoke.cc
CommitLineData
7a90b0ca
PC
1// { dg-options "-std=gnu++0x" }
2
aa118a03 3// Copyright (C) 2008-2014 Free Software Foundation, Inc.
7a90b0ca
PC
4//
5// This file is part of the GNU ISO C++ Library. This library is free
6// software; you can redistribute it and/or modify it under the
7// terms of the GNU General Public License as published by the
748086b7 8// Free Software Foundation; either version 3, or (at your option)
7a90b0ca
PC
9// any later version.
10//
11// This library is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15//
16// You should have received a copy of the GNU General Public License along
748086b7
JJ
17// with this library; see the file COPYING3. If not see
18// <http://www.gnu.org/licenses/>.
7a90b0ca
PC
19
20#include <functional>
21#include <type_traits>
22#include <testsuite_hooks.h>
23#include <testsuite_tr1.h>
24
25using namespace __gnu_test;
26
27bool test __attribute__((unused)) = true;
28
29struct X
30{
31 typedef int result_type;
32
33 X() : bar(17) {}
34
35 int foo(float x) { return truncate_float(x); }
36 int foo_c(float x) const { return truncate_float(x); }
37 int foo_v(float x) volatile { return truncate_float(x); }
38 int foo_cv(float x) const volatile { return truncate_float(x); }
be7f7822 39 int foo_varargs(float x, ...) { return truncate_float(x); }
7a90b0ca
PC
40
41 int operator()(float x)
42 {
43 return foo(x) + 1;
44 }
45
46 int operator()(float x) const
47 {
48 return foo_c(x) + 2;
49 }
50
51 int bar;
52
53 private:
54 X(const X&);
55 X& operator=(const X&);
56};
57
58int seventeen() { return 17; }
59
60struct get_seventeen
61{
62 typedef int result_type;
63 int operator()() const { return 17; }
64};
65
66void test01()
67{
68 using std::ref;
69 using std::cref;
70
71 ::get_seventeen get_sev;
72 ::X x;
be7f7822
JW
73 ::X* xp = &x;
74 int (::X::* p_foo)(float) = &::X::foo;
75 int (::X::* p_foo_c)(float) const = &::X::foo_c;
76 int (::X::* p_foo_v)(float) volatile = &::X::foo_v;
77 int (::X::* p_foo_cv)(float) const volatile = &::X::foo_cv;
879e1011
PC
78 int (::X::* p_foo_varargs)(float, ...) __attribute__((unused))
79 = &::X::foo_varargs;
be7f7822 80 int ::X::* p_bar = &::X::bar;
7a90b0ca
PC
81
82 const float pi = 3.14;
83
84 // Functions
85 VERIFY(ref(truncate_float)(pi) == 3);
86 VERIFY(ref(seventeen)() == 17);
87
88 // Function pointers
be7f7822
JW
89 VERIFY(cref(truncate_float)(pi) == 3);
90 VERIFY(cref(seventeen)() == 17);
91
92 // Member function pointers
93 VERIFY(ref(p_foo)(x, pi) == 3);
94 VERIFY(ref(p_foo)(xp, pi) == 3);
95 VERIFY(ref(p_foo_c)(x, pi) == 3);
96 VERIFY(ref(p_foo_c)(xp, pi) == 3);
97 VERIFY(ref(p_foo_v)(x, pi) == 3);
98 VERIFY(ref(p_foo_v)(xp, pi) == 3);
99 VERIFY(ref(p_foo_cv)(x, pi) == 3);
100 VERIFY(ref(p_foo_cv)(xp, pi) == 3);
101 // VERIFY(ref(p_foo_varargs)(x, pi) == 3);
102 // VERIFY(ref(p_foo_varargs)(xp, pi, 1, 1) == 3);
103 // VERIFY(ref(p_foo_varargs)(x, pi, 1, 1) == 3);
104 // VERIFY(ref(p_foo_varargs)(xp, pi) == 3);
105
106 // Member data pointers
107 VERIFY(ref(p_bar)(x) == 17);
108 VERIFY(ref(p_bar)(xp) == 17);
7a90b0ca 109
7a90b0ca
PC
110 // Function objects
111 VERIFY(ref(get_sev)() == 17);
112 VERIFY(cref(get_sev)() == 17);
113 VERIFY(ref(x)(pi) == 4);
114 VERIFY(cref(x)(pi) == 5);
115}
116
117int main()
118{
119 test01();
120 return 0;
121}