15a83710eSEric Fiselier //===----------------------------------------------------------------------===//
25a83710eSEric Fiselier //
357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65a83710eSEric Fiselier //
75a83710eSEric Fiselier //===----------------------------------------------------------------------===//
85a83710eSEric Fiselier 
95a83710eSEric Fiselier // <functional>
105a83710eSEric Fiselier 
115a83710eSEric Fiselier // template<Returnable R, class T> unspecified mem_fn(R T::* pm);
125a83710eSEric Fiselier 
135a83710eSEric Fiselier #include <functional>
145a83710eSEric Fiselier #include <cassert>
155a83710eSEric Fiselier 
167fc6a556SMarshall Clow #include "test_macros.h"
177fc6a556SMarshall Clow 
185a83710eSEric Fiselier struct A
195a83710eSEric Fiselier {
205a83710eSEric Fiselier     double data_;
215a83710eSEric Fiselier };
225a83710eSEric Fiselier 
235a83710eSEric Fiselier template <class F>
247b00e9faSArthur O'Dwyer TEST_CONSTEXPR_CXX20 bool
test(F f)255a83710eSEric Fiselier test(F f)
265a83710eSEric Fiselier {
275a83710eSEric Fiselier     {
28*dd756e3eSArthur O'Dwyer     A a = {0.0};
295a83710eSEric Fiselier     f(a) = 5;
305a83710eSEric Fiselier     assert(a.data_ == 5);
315a83710eSEric Fiselier     A* ap = &a;
325a83710eSEric Fiselier     f(ap) = 6;
335a83710eSEric Fiselier     assert(a.data_ == 6);
345a83710eSEric Fiselier     const A* cap = ap;
355a83710eSEric Fiselier     assert(f(cap) == f(ap));
365a83710eSEric Fiselier     const F& cf = f;
375a83710eSEric Fiselier     assert(cf(ap) == f(ap));
385a83710eSEric Fiselier     }
397b00e9faSArthur O'Dwyer     return true;
405a83710eSEric Fiselier }
415a83710eSEric Fiselier 
main(int,char **)422df59c50SJF Bastien int main(int, char**)
435a83710eSEric Fiselier {
445a83710eSEric Fiselier     test(std::mem_fn(&A::data_));
452df59c50SJF Bastien 
467b00e9faSArthur O'Dwyer #if TEST_STD_VER >= 20
477b00e9faSArthur O'Dwyer     static_assert(test(std::mem_fn(&A::data_)));
487b00e9faSArthur O'Dwyer #endif
497b00e9faSArthur O'Dwyer 
502df59c50SJF Bastien     return 0;
515a83710eSEric Fiselier }
52