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