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 // reference_wrapper
125a83710eSEric Fiselier 
135a83710eSEric Fiselier // template <class... ArgTypes>
145a83710eSEric Fiselier //   requires Callable<T, ArgTypes&&...>
155a83710eSEric Fiselier //   Callable<T, ArgTypes&&...>::result_type
165a83710eSEric Fiselier //   operator()(ArgTypes&&... args) const;
175a83710eSEric Fiselier 
185a83710eSEric Fiselier #include <functional>
195a83710eSEric Fiselier #include <cassert>
205a83710eSEric Fiselier 
21*7fc6a556SMarshall Clow #include "test_macros.h"
22*7fc6a556SMarshall Clow 
235a83710eSEric Fiselier // 0 args, return int
245a83710eSEric Fiselier 
255a83710eSEric Fiselier int count = 0;
265a83710eSEric Fiselier 
f_int_0()275a83710eSEric Fiselier int f_int_0()
285a83710eSEric Fiselier {
295a83710eSEric Fiselier     return 3;
305a83710eSEric Fiselier }
315a83710eSEric Fiselier 
325a83710eSEric Fiselier struct A_int_0
335a83710eSEric Fiselier {
operator ()A_int_0345a83710eSEric Fiselier     int operator()() {return 4;}
355a83710eSEric Fiselier };
365a83710eSEric Fiselier 
375a83710eSEric Fiselier void
test_int_0()385a83710eSEric Fiselier test_int_0()
395a83710eSEric Fiselier {
405a83710eSEric Fiselier     // function
415a83710eSEric Fiselier     {
425a83710eSEric Fiselier     std::reference_wrapper<int ()> r1(f_int_0);
435a83710eSEric Fiselier     assert(r1() == 3);
445a83710eSEric Fiselier     }
455a83710eSEric Fiselier     // function pointer
465a83710eSEric Fiselier     {
475a83710eSEric Fiselier     int (*fp)() = f_int_0;
485a83710eSEric Fiselier     std::reference_wrapper<int (*)()> r1(fp);
495a83710eSEric Fiselier     assert(r1() == 3);
505a83710eSEric Fiselier     }
515a83710eSEric Fiselier     // functor
525a83710eSEric Fiselier     {
535a83710eSEric Fiselier     A_int_0 a0;
545a83710eSEric Fiselier     std::reference_wrapper<A_int_0> r1(a0);
555a83710eSEric Fiselier     assert(r1() == 4);
565a83710eSEric Fiselier     }
575a83710eSEric Fiselier }
585a83710eSEric Fiselier 
595a83710eSEric Fiselier // 1 arg, return void
605a83710eSEric Fiselier 
f_void_1(int i)615a83710eSEric Fiselier void f_void_1(int i)
625a83710eSEric Fiselier {
635a83710eSEric Fiselier     count += i;
645a83710eSEric Fiselier }
655a83710eSEric Fiselier 
665a83710eSEric Fiselier struct A_void_1
675a83710eSEric Fiselier {
operator ()A_void_1685a83710eSEric Fiselier     void operator()(int i)
695a83710eSEric Fiselier     {
705a83710eSEric Fiselier         count += i;
715a83710eSEric Fiselier     }
725a83710eSEric Fiselier };
735a83710eSEric Fiselier 
main(int,char **)742df59c50SJF Bastien int main(int, char**)
755a83710eSEric Fiselier {
765a83710eSEric Fiselier     test_int_0();
772df59c50SJF Bastien 
782df59c50SJF Bastien   return 0;
795a83710eSEric Fiselier }
80