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 
10*7a6aaf9bSLouis Dionne // <functional>
11*7a6aaf9bSLouis Dionne 
12*7a6aaf9bSLouis Dionne // template<Returnable R, class T> unspecified mem_fn(R T::* pm);
13*7a6aaf9bSLouis Dionne 
14*7a6aaf9bSLouis Dionne #include <functional>
15*7a6aaf9bSLouis Dionne #include <cassert>
16*7a6aaf9bSLouis Dionne 
17*7a6aaf9bSLouis Dionne struct A
18*7a6aaf9bSLouis Dionne {
19*7a6aaf9bSLouis Dionne     double data_;
20*7a6aaf9bSLouis Dionne };
21*7a6aaf9bSLouis Dionne 
22*7a6aaf9bSLouis Dionne template <class F>
23*7a6aaf9bSLouis Dionne void
test(F f)24*7a6aaf9bSLouis Dionne test(F f)
25*7a6aaf9bSLouis Dionne {
26*7a6aaf9bSLouis Dionne     {
27*7a6aaf9bSLouis Dionne     A a;
28*7a6aaf9bSLouis Dionne     f(a) = 5;
29*7a6aaf9bSLouis Dionne     assert(a.data_ == 5);
30*7a6aaf9bSLouis Dionne     A* ap = &a;
31*7a6aaf9bSLouis Dionne     f(ap) = 6;
32*7a6aaf9bSLouis Dionne     assert(a.data_ == 6);
33*7a6aaf9bSLouis Dionne     const A* cap = ap;
34*7a6aaf9bSLouis Dionne     assert(f(cap) == f(ap));
35*7a6aaf9bSLouis Dionne     f(cap) = 7;
36*7a6aaf9bSLouis Dionne     }
37*7a6aaf9bSLouis Dionne }
38*7a6aaf9bSLouis Dionne 
main(int,char **)39*7a6aaf9bSLouis Dionne int main(int, char**)
40*7a6aaf9bSLouis Dionne {
41*7a6aaf9bSLouis Dionne     test(std::mem_fn(&A::data_));
42*7a6aaf9bSLouis Dionne 
43*7a6aaf9bSLouis Dionne   return 0;
44*7a6aaf9bSLouis Dionne }
45