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 // reference_wrapper
12*7a6aaf9bSLouis Dionne 
13*7a6aaf9bSLouis Dionne // template <class... ArgTypes>
14*7a6aaf9bSLouis Dionne //   requires Callable<T, ArgTypes&&...>
15*7a6aaf9bSLouis Dionne //   Callable<T, ArgTypes&&...>::result_type
16*7a6aaf9bSLouis Dionne //   operator()(ArgTypes&&... args) const;
17*7a6aaf9bSLouis Dionne 
18*7a6aaf9bSLouis Dionne #include <functional>
19*7a6aaf9bSLouis Dionne #include <cassert>
20*7a6aaf9bSLouis Dionne 
21*7a6aaf9bSLouis Dionne // member data pointer:  cv qualifiers should transfer from argument to return type
22*7a6aaf9bSLouis Dionne 
23*7a6aaf9bSLouis Dionne struct A_int_1
24*7a6aaf9bSLouis Dionne {
A_int_1A_int_125*7a6aaf9bSLouis Dionne     A_int_1() : data_(5) {}
26*7a6aaf9bSLouis Dionne 
27*7a6aaf9bSLouis Dionne     int data_;
28*7a6aaf9bSLouis Dionne };
29*7a6aaf9bSLouis Dionne 
30*7a6aaf9bSLouis Dionne void
test_int_1()31*7a6aaf9bSLouis Dionne test_int_1()
32*7a6aaf9bSLouis Dionne {
33*7a6aaf9bSLouis Dionne     // member data pointer
34*7a6aaf9bSLouis Dionne     {
35*7a6aaf9bSLouis Dionne     int A_int_1::*fp = &A_int_1::data_;
36*7a6aaf9bSLouis Dionne     std::reference_wrapper<int A_int_1::*> r1(fp);
37*7a6aaf9bSLouis Dionne     A_int_1 a;
38*7a6aaf9bSLouis Dionne     assert(r1(a) == 5);
39*7a6aaf9bSLouis Dionne     r1(a) = 6;
40*7a6aaf9bSLouis Dionne     assert(r1(a) == 6);
41*7a6aaf9bSLouis Dionne     const A_int_1* ap = &a;
42*7a6aaf9bSLouis Dionne     assert(r1(ap) == 6);
43*7a6aaf9bSLouis Dionne     r1(ap) = 7;
44*7a6aaf9bSLouis Dionne     assert(r1(ap) == 7);
45*7a6aaf9bSLouis Dionne     }
46*7a6aaf9bSLouis Dionne }
47*7a6aaf9bSLouis Dionne 
main(int,char **)48*7a6aaf9bSLouis Dionne int main(int, char**)
49*7a6aaf9bSLouis Dionne {
50*7a6aaf9bSLouis Dionne     test_int_1();
51*7a6aaf9bSLouis Dionne 
52*7a6aaf9bSLouis Dionne   return 0;
53*7a6aaf9bSLouis Dionne }
54