1 // { dg-options "-std=gnu++0x" }
2 // 2005-01-15 Douglas Gregor <dgregor@cs.indiana.edu>
4 // Copyright (C) 2005-2013 Free Software Foundation, Inc.
6 // This file is part of the GNU ISO C++ Library. This library is free
7 // software; you can redistribute it and/or modify it under the
8 // terms of the GNU General Public License as published by the
9 // Free Software Foundation; either version 3, or (at your option)
12 // This library is distributed in the hope that it will be useful,
13 // but WITHOUT ANY WARRANTY; without even the implied warranty of
14 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 // GNU General Public License for more details.
17 // You should have received a copy of the GNU General Public License along
18 // with this library; see the file COPYING3. If not see
19 // <http://www.gnu.org/licenses/>.
21 // 20.7.15 polymorphic function object wrapper
23 #include <testsuite_hooks.h>
24 #include <testsuite_tr1.h>
26 using namespace __gnu_test
;
28 bool test
__attribute__((unused
)) = true;
30 // Put member pointers into function<> wrappers
38 function
<int(X
&)> frm(&X::bar
);
40 VERIFY( frm(x
) == 17 );
41 VERIFY( typeid(int X::*) == frm
.target_type() );
42 VERIFY( *frm
.target
<int X::*>() == &X::bar
);
44 function
<int(X
&)> fr(&X::foo
);
47 VERIFY( typeid(int (X::*)()) == fr
.target_type() );
48 VERIFY( *fr
.target
<int (X::*)()>() == &X::foo
);
50 function
<int(const X
&)> frc(&X::foo_c
);
52 VERIFY( frc(x
) == 2 );
53 VERIFY( typeid(int (X::*)() const) == frc
.target_type() );
54 VERIFY( *frc
.target
<int (X::*)() const >() == &X::foo_c
);
56 function
<int(volatile X
&)> frv(&X::foo_v
);
58 VERIFY( frv(x
) == 3 );
59 VERIFY( typeid(int (X::*)() volatile) == frv
.target_type() );
60 VERIFY( *frv
.target
<int (X::*)() volatile >() == &X::foo_v
);
61 VERIFY( frv
.target
<int (X::*)() const volatile>() == 0 );
63 function
<int(const volatile X
&)> frcv(&X::foo_cv
);
65 VERIFY( frcv(x
) == 4 );
66 VERIFY( typeid(int (X::*)() const volatile) == frcv
.target_type() );
67 VERIFY( *frcv
.target
<int (X::*)() const volatile >() == &X::foo_cv
);
68 VERIFY( frcv
.target
<int (X::*)() const>() == 0 );
70 function
<int(X
*)> grm(&X::bar
);
72 VERIFY( grm(&x
) == 17 );
73 VERIFY( typeid(int X::*) == grm
.target_type() );
74 VERIFY( *grm
.target
<int X::*>() == &X::bar
);
76 function
<int(X
*)> gr(&X::foo
);
78 VERIFY( gr(&x
) == 1 );
79 VERIFY( typeid(int (X::*)()) == gr
.target_type() );
80 VERIFY( *gr
.target
<int (X::*)()>() == &X::foo
);
82 function
<int(const X
*)> grc(&X::foo_c
);
84 VERIFY( grc(&x
) == 2 );
85 VERIFY( typeid(int (X::*)() const) == grc
.target_type() );
86 VERIFY( *grc
.target
<int (X::*)() const >() == &X::foo_c
);
88 function
<int(volatile X
*)> grv(&X::foo_v
);
90 VERIFY( grv(&x
) == 3 );
91 VERIFY( typeid(int (X::*)() volatile) == grv
.target_type() );
92 VERIFY( *grv
.target
<int (X::*)() volatile >() == &X::foo_v
);
93 VERIFY( grv
.target
<int (X::*)() const volatile>() == 0 );
95 function
<int(const volatile X
*)> grcv(&X::foo_cv
);
97 VERIFY( grcv(&x
) == 4 );
98 VERIFY( typeid(int (X::*)() const volatile) == grcv
.target_type() );
99 VERIFY( *grcv
.target
<int (X::*)() const volatile >() == &X::foo_cv
);
100 VERIFY( grcv
.target
<int (X::*)() const>() == 0 );