blob: 4096bd8144215f5c267f30311bc61362c039394d [file] [log] [blame]
Howard Hinnantc52f43e2010-08-22 00:59:46 +00001//===----------------------------------------------------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00005// This file is dual licensed under the MIT and the University of Illinois Open
6// Source Licenses. See LICENSE.TXT for details.
Howard Hinnantc52f43e2010-08-22 00:59:46 +00007//
8//===----------------------------------------------------------------------===//
9
10// <functional>
11
12// template<Returnable R, class T, CopyConstructible... Args>
13// unspecified mem_fn(R (T::* pm)(Args...));
14
15#include <functional>
16#include <cassert>
17
18struct A
19{
20 char test0() {return 'a';}
21 char test1(int) {return 'b';}
22 char test2(int, double) {return 'c';}
23};
24
25template <class F>
26void
27test0(F f)
28{
29 {
30 A a;
31 assert(f(a) == 'a');
32 A* ap = &a;
33 assert(f(ap) == 'a');
Peter Collingbournea4c0d872014-01-22 22:56:52 +000034 const F& cf = f;
35 assert(cf(ap) == 'a');
Howard Hinnantc52f43e2010-08-22 00:59:46 +000036 }
37}
38
39template <class F>
40void
41test1(F f)
42{
43 {
44 A a;
45 assert(f(a, 1) == 'b');
46 A* ap = &a;
47 assert(f(ap, 2) == 'b');
Peter Collingbournea4c0d872014-01-22 22:56:52 +000048 const F& cf = f;
49 assert(cf(ap, 2) == 'b');
Howard Hinnantc52f43e2010-08-22 00:59:46 +000050 }
51}
52
53template <class F>
54void
55test2(F f)
56{
57 {
58 A a;
59 assert(f(a, 1, 2) == 'c');
60 A* ap = &a;
61 assert(f(ap, 2, 3.5) == 'c');
Peter Collingbournea4c0d872014-01-22 22:56:52 +000062 const F& cf = f;
63 assert(cf(ap, 2, 3.5) == 'c');
Howard Hinnantc52f43e2010-08-22 00:59:46 +000064 }
65}
66
67int main()
68{
69 test0(std::mem_fn(&A::test0));
70 test1(std::mem_fn(&A::test1));
71 test2(std::mem_fn(&A::test2));
72}