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 void
245a83710eSEric Fiselier 
255a83710eSEric Fiselier int count = 0;
265a83710eSEric Fiselier 
f_void_0()275a83710eSEric Fiselier void f_void_0()
285a83710eSEric Fiselier {
295a83710eSEric Fiselier     ++count;
305a83710eSEric Fiselier }
315a83710eSEric Fiselier 
325a83710eSEric Fiselier struct A_void_0
335a83710eSEric Fiselier {
operator ()A_void_0345a83710eSEric Fiselier     void operator()() {++count;}
355a83710eSEric Fiselier };
365a83710eSEric Fiselier 
375a83710eSEric Fiselier void
test_void_0()385a83710eSEric Fiselier test_void_0()
395a83710eSEric Fiselier {
405a83710eSEric Fiselier     int save_count = count;
415a83710eSEric Fiselier     // function
425a83710eSEric Fiselier     {
435a83710eSEric Fiselier     std::reference_wrapper<void ()> r1(f_void_0);
445a83710eSEric Fiselier     r1();
455a83710eSEric Fiselier     assert(count == save_count+1);
465a83710eSEric Fiselier     save_count = count;
475a83710eSEric Fiselier     }
485a83710eSEric Fiselier     // function pointer
495a83710eSEric Fiselier     {
505a83710eSEric Fiselier     void (*fp)() = f_void_0;
515a83710eSEric Fiselier     std::reference_wrapper<void (*)()> r1(fp);
525a83710eSEric Fiselier     r1();
535a83710eSEric Fiselier     assert(count == save_count+1);
545a83710eSEric Fiselier     save_count = count;
555a83710eSEric Fiselier     }
565a83710eSEric Fiselier     // functor
575a83710eSEric Fiselier     {
585a83710eSEric Fiselier     A_void_0 a0;
595a83710eSEric Fiselier     std::reference_wrapper<A_void_0> r1(a0);
605a83710eSEric Fiselier     r1();
615a83710eSEric Fiselier     assert(count == save_count+1);
625a83710eSEric Fiselier     save_count = count;
635a83710eSEric Fiselier     }
645a83710eSEric Fiselier }
655a83710eSEric Fiselier 
main(int,char **)662df59c50SJF Bastien int main(int, char**)
675a83710eSEric Fiselier {
685a83710eSEric Fiselier     test_void_0();
692df59c50SJF Bastien 
702df59c50SJF Bastien   return 0;
715a83710eSEric Fiselier }
72