17a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 27a6aaf9bSLouis Dionne // 37a6aaf9bSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47a6aaf9bSLouis Dionne // See https://llvm.org/LICENSE.txt for license information. 57a6aaf9bSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67a6aaf9bSLouis Dionne // 77a6aaf9bSLouis Dionne //===----------------------------------------------------------------------===// 87a6aaf9bSLouis Dionne 97a6aaf9bSLouis Dionne 107a6aaf9bSLouis Dionne // <functional> 117a6aaf9bSLouis Dionne 12*a061d4d5SA. Jiang // template<class R, class T> constexpr unspecified mem_fn(R T::*) noexcept; // constexpr in C++20 137a6aaf9bSLouis Dionne 147a6aaf9bSLouis Dionne #include <functional> 157a6aaf9bSLouis Dionne #include <cassert> 167a6aaf9bSLouis Dionne 177a6aaf9bSLouis Dionne struct A 187a6aaf9bSLouis Dionne { 197a6aaf9bSLouis Dionne double data_; 207a6aaf9bSLouis Dionne }; 217a6aaf9bSLouis Dionne 227a6aaf9bSLouis Dionne template <class F> 237a6aaf9bSLouis Dionne void 247a6aaf9bSLouis Dionne test(F f) 257a6aaf9bSLouis Dionne { 267a6aaf9bSLouis Dionne { 277a6aaf9bSLouis Dionne A a; 287a6aaf9bSLouis Dionne f(a) = 5; 297a6aaf9bSLouis Dionne assert(a.data_ == 5); 307a6aaf9bSLouis Dionne A* ap = &a; 317a6aaf9bSLouis Dionne f(ap) = 6; 327a6aaf9bSLouis Dionne assert(a.data_ == 6); 337a6aaf9bSLouis Dionne const A* cap = ap; 347a6aaf9bSLouis Dionne assert(f(cap) == f(ap)); 357a6aaf9bSLouis Dionne f(cap) = 7; 367a6aaf9bSLouis Dionne } 377a6aaf9bSLouis Dionne } 387a6aaf9bSLouis Dionne 397a6aaf9bSLouis Dionne int main(int, char**) 407a6aaf9bSLouis Dionne { 417a6aaf9bSLouis Dionne test(std::mem_fn(&A::data_)); 427a6aaf9bSLouis Dionne 437a6aaf9bSLouis Dionne return 0; 447a6aaf9bSLouis Dionne } 45