1*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
2*7a6aaf9bSLouis Dionne //
3*7a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*7a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*7a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*7a6aaf9bSLouis Dionne //
7*7a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===//
8*7a6aaf9bSLouis Dionne 
9*7a6aaf9bSLouis Dionne // <functional>
10*7a6aaf9bSLouis Dionne 
11*7a6aaf9bSLouis Dionne // class function<R(ArgTypes...)>
12*7a6aaf9bSLouis Dionne 
13*7a6aaf9bSLouis Dionne // R operator()(ArgTypes... args) const
14*7a6aaf9bSLouis Dionne 
15*7a6aaf9bSLouis Dionne #include <functional>
16*7a6aaf9bSLouis Dionne #include <cassert>
17*7a6aaf9bSLouis Dionne 
18*7a6aaf9bSLouis Dionne // member data pointer:  cv qualifiers should transfer from argument to return type
19*7a6aaf9bSLouis Dionne 
20*7a6aaf9bSLouis Dionne struct A_int_1
21*7a6aaf9bSLouis Dionne {
A_int_1A_int_122*7a6aaf9bSLouis Dionne     A_int_1() : data_(5) {}
23*7a6aaf9bSLouis Dionne 
24*7a6aaf9bSLouis Dionne     int data_;
25*7a6aaf9bSLouis Dionne };
26*7a6aaf9bSLouis Dionne 
27*7a6aaf9bSLouis Dionne void
test_int_1()28*7a6aaf9bSLouis Dionne test_int_1()
29*7a6aaf9bSLouis Dionne {
30*7a6aaf9bSLouis Dionne     // member data pointer
31*7a6aaf9bSLouis Dionne     {
32*7a6aaf9bSLouis Dionne         int A_int_1::*fp = &A_int_1::data_;
33*7a6aaf9bSLouis Dionne         A_int_1 a;
34*7a6aaf9bSLouis Dionne         std::function<int& (const A_int_1*)> r2(fp);
35*7a6aaf9bSLouis Dionne         const A_int_1* ap = &a;
36*7a6aaf9bSLouis Dionne         assert(r2(ap) == 6);
37*7a6aaf9bSLouis Dionne         r2(ap) = 7;
38*7a6aaf9bSLouis Dionne         assert(r2(ap) == 7);
39*7a6aaf9bSLouis Dionne     }
40*7a6aaf9bSLouis Dionne }
41*7a6aaf9bSLouis Dionne 
main(int,char **)42*7a6aaf9bSLouis Dionne int main(int, char**)
43*7a6aaf9bSLouis Dionne {
44*7a6aaf9bSLouis Dionne     test_int_1();
45*7a6aaf9bSLouis Dionne 
46*7a6aaf9bSLouis Dionne   return 0;
47*7a6aaf9bSLouis Dionne }
48