invoke_lvalue.pass.cpp revision c52f43e72dfcea03037729649da84c23b3beb04a
1c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
2c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
3c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//                     The LLVM Compiler Infrastructure
4c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
5c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// This file is distributed under the University of Illinois Open Source
6c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// License. See LICENSE.TXT for details.
7c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//
8c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//===----------------------------------------------------------------------===//
9c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
10c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// <functional>
11c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
12c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template<CopyConstructible Fn, CopyConstructible... Types>
13c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//   unspecified bind(Fn, Types...);
14c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
15c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant//   unspecified bind(Fn, Types...);
16c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
17c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <stdio.h>
18c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
19c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <functional>
20c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant#include <cassert>
21c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
22c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint count = 0;
23c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
24c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 1 arg, return void
25c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
26c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid f_void_1(int i)
27c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
28c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    count += i;
29c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
30c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
31c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A_void_1
32c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
33c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void operator()(int i)
34c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
35c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        count += i;
36c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
37c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
38c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void mem1() {++count;}
39c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void mem2() const {count += 2;}
40c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant};
41c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
42c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid
43c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttest_void_1()
44c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
45c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    using namespace std::placeholders;
46c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int save_count = count;
47c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // function
48c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
49c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 2;
50c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(f_void_1, _1)(i);
51c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count + 2);
52c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
53c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
54c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
55c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 2;
56c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(f_void_1, i)();
57c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count + 2);
58c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
59c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
60c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // function pointer
61c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
62c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (*fp)(int) = f_void_1;
63c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 3;
64c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, _1)(i);
65c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+3);
66c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
67c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
68c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
69c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (*fp)(int) = f_void_1;
70c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 3;
71c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, i)();
72c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+3);
73c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
74c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
75c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // functor
76c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
77c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a0;
78c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 4;
79c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(a0, _1)(i);
80c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+4);
81c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
82c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
83c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
84c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a0;
85c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 4;
86c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(a0, i)();
87c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+4);
88c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
89c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
90c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // member function pointer
91c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
92c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (A_void_1::*fp)() = &A_void_1::mem1;
93c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a;
94c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, _1)(a);
95c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+1);
96c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
97c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1* ap = &a;
98c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, _1)(ap);
99c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+1);
100c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
101c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
102c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
103c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (A_void_1::*fp)() = &A_void_1::mem1;
104c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a;
105c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, a)();
106c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+1);
107c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
108c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1* ap = &a;
109c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, ap)();
110c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+1);
111c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
112c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
113c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // const member function pointer
114c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
115c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (A_void_1::*fp)() const = &A_void_1::mem2;
116c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a;
117c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, _1)(a);
118c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+2);
119c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
120c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1* ap = &a;
121c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, _1)(ap);
122c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+2);
123c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
124c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
125c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
126c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void (A_void_1::*fp)() const = &A_void_1::mem2;
127c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1 a;
128c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, a)();
129c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+2);
130c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
131c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_void_1* ap = &a;
132c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(fp, ap)();
133c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+2);
134c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
135c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
136c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
137c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
138c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 1 arg, return int
139c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
140c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint f_int_1(int i)
141c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
142c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    return i + 1;
143c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
144c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
145c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A_int_1
146c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
147c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1() : data_(5) {}
148c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int operator()(int i)
149c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
150c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        return i - 1;
151c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
152c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
153c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int mem1() {return 3;}
154c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int mem2() const {return 4;}
155c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int data_;
156c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant};
157c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
158c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid
159c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttest_int_1()
160c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
161c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    using namespace std::placeholders;
162c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // function
163c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
164c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 2;
165c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(f_int_1, _1)(i) == 3);
166c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(f_int_1, i)() == 3);
167c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
168c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // function pointer
169c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
170c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int (*fp)(int) = f_int_1;
171c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 3;
172c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(fp, _1)(i) == 4);
173c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(fp, i)() == 4);
174c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
175c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // functor
176c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
177c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 4;
178c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(A_int_1(), _1)(i) == 3);
179c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(A_int_1(), i)() == 3);
180c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
181c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // member function pointer
182c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
183c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1 a;
184c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem1, _1)(a) == 3);
185c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem1, a)() == 3);
186c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1* ap = &a;
187c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem1, _1)(ap) == 3);
188c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem1, ap)() == 3);
189c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
190c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // const member function pointer
191c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
192c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1 a;
193c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem2, _1)(A_int_1()) == 4);
194c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem2, A_int_1())() == 4);
195c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1* ap = &a;
196c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem2, _1)(ap) == 4);
197c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::mem2, ap)() == 4);
198c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
199c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // member data pointer
200c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
201c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1 a;
202c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, _1)(a) == 5);
203c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, a)() == 5);
204c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    A_int_1* ap = &a;
205c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, _1)(a) == 5);
206c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(&A_int_1::data_, _1)(a) = 6;
207c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, _1)(a) == 6);
208c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, _1)(ap) == 6);
209c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(&A_int_1::data_, _1)(ap) = 7;
210c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(std::bind(&A_int_1::data_, _1)(ap) == 7);
211c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
212c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
213c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
214c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant// 2 arg, return void
215c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
216c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid f_void_2(int i, int j)
217c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
218c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    count += i+j;
219c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
220c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
221c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantstruct A_void_2
222c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
223c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void operator()(int i, int j)
224c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
225c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant        count += i+j;
226c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
227c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
228c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void mem1(int i) {count += i;}
229c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    void mem2(int i) const {count += i;}
230c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant};
231c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
232c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantvoid
233c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnanttest_void_2()
234c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
235c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    using namespace std::placeholders;
236c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int save_count = count;
237c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // function
238c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
239c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int i = 2;
240c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int j = 3;
241c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(f_void_2, _1, _2)(i, j);
242c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+5);
243c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
244c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(f_void_2, i, _1)(j);
245c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+5);
246c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
247c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(f_void_2, i, j)();
248c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+5);
249c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
250c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
251c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    // member function pointer
252c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    {
253c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    int j = 3;
254c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(&A_void_2::mem1, _1, _2)(A_void_2(), j);
255c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+3);
256c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
257c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    std::bind(&A_void_2::mem1, _2, _1)(j, A_void_2());
258c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    assert(count == save_count+3);
259c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    save_count = count;
260c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    }
261c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
262c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant
263c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnantint main()
264c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant{
265c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    test_void_1();
266c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant    test_int_1();
267c52f43e72dfcea03037729649da84c23b3beb04aHoward Hinnant}
268