1//===----------------------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9// <functional>
10
11#include <functional>
12
13#include "test_macros.h"
14
15struct Incomplete;
16template<class T> struct Holder { T t; };
17typedef Holder<Incomplete> *Ptr;
18
19struct A {
20 Ptr no_args() const { return nullptr; }
21 Ptr one_arg(Ptr p) const { return p; }
22 void one_arg_void(Ptr) const { }
23};
24
25int main(int, char**)
26{
27 A a;
28 A *pa = &a;
29 const A *cpa = &a;
30 Ptr x = nullptr;
31 const Ptr cx = nullptr;
32 std::mem_fn(pm: &A::no_args)(a);
33 std::mem_fn(pm: &A::no_args)(pa);
34 std::mem_fn(pm: &A::no_args)(*cpa);
35 std::mem_fn(pm: &A::no_args)(cpa);
36 std::mem_fn(pm: &A::one_arg)(a, x);
37 std::mem_fn(pm: &A::one_arg)(pa, x);
38 std::mem_fn(pm: &A::one_arg)(a, cx);
39 std::mem_fn(pm: &A::one_arg)(pa, cx);
40 std::mem_fn(pm: &A::one_arg)(*cpa, x);
41 std::mem_fn(pm: &A::one_arg)(cpa, x);
42 std::mem_fn(pm: &A::one_arg)(*cpa, cx);
43 std::mem_fn(pm: &A::one_arg)(cpa, cx);
44 std::mem_fn(pm: &A::one_arg_void)(a, x);
45 std::mem_fn(pm: &A::one_arg_void)(pa, x);
46 std::mem_fn(pm: &A::one_arg_void)(a, cx);
47 std::mem_fn(pm: &A::one_arg_void)(pa, cx);
48 std::mem_fn(pm: &A::one_arg_void)(*cpa, x);
49 std::mem_fn(pm: &A::one_arg_void)(cpa, x);
50 std::mem_fn(pm: &A::one_arg_void)(*cpa, cx);
51 std::mem_fn(pm: &A::one_arg_void)(cpa, cx);
52 return 0;
53}
54

source code of libcxx/test/std/utilities/function.objects/func.memfn/robust_against_adl.pass.cpp