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
19Ptr no_args() { return nullptr; }
20Ptr one_arg(Ptr p) { return p; }
21Ptr two_args(Ptr p, Ptr) { return p; }
22Ptr three_args(Ptr p, Ptr, Ptr) { return p; }
23
24void one_arg_void(Ptr) { }
25
26int main(int, char**)
27{
28 Ptr x = nullptr;
29 const Ptr cx = nullptr;
30 std::ref(t&: no_args)();
31 std::ref(t&: one_arg)(x);
32 std::ref(t&: one_arg)(cx);
33 std::ref(t&: two_args)(x, x);
34 std::ref(t&: two_args)(x, cx);
35 std::ref(t&: two_args)(cx, x);
36 std::ref(t&: two_args)(cx, cx);
37 std::ref(t&: three_args)(x, x, x);
38 std::ref(t&: three_args)(x, x, cx);
39 std::ref(t&: three_args)(x, cx, x);
40 std::ref(t&: three_args)(cx, x, x);
41 std::ref(t&: three_args)(x, cx, cx);
42 std::ref(t&: three_args)(cx, x, cx);
43 std::ref(t&: three_args)(cx, cx, x);
44 std::ref(t&: three_args)(cx, cx, cx);
45 std::ref(t&: one_arg_void)(x);
46 std::ref(t&: one_arg_void)(cx);
47
48 return 0;
49}
50

source code of libcxx/test/std/utilities/function.objects/refwrap/refwrap.invoke/robust_against_adl.pass.cpp