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 Dionnetest(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 Dionneint 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