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 // class function<R(ArgTypes...)>
125a83710eSEric Fiselier
135a83710eSEric Fiselier // template<typename T>
145a83710eSEric Fiselier // requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>
155a83710eSEric Fiselier // T*
165a83710eSEric Fiselier // target();
175a83710eSEric Fiselier // template<typename T>
185a83710eSEric Fiselier // requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>
195a83710eSEric Fiselier // const T*
205a83710eSEric Fiselier // target() const;
215a83710eSEric Fiselier
22b4fb705eSLouis Dionne // This test runs in C++03, but we have deprecated using std::function in C++03.
23*c475e31aSNikolas Klauser // ADDITIONAL_COMPILE_FLAGS: -D_LIBCPP_DISABLE_DEPRECATION_WARNINGS -D_LIBCPP_ENABLE_CXX03_FUNCTION
24b4fb705eSLouis Dionne
25f9e70fa5SLouis Dionne // UNSUPPORTED: no-rtti
26bb09ef95SLouis Dionne
275a83710eSEric Fiselier #include <functional>
285a83710eSEric Fiselier #include <new>
295a83710eSEric Fiselier #include <cstdlib>
305a83710eSEric Fiselier #include <cassert>
315a83710eSEric Fiselier
327fc6a556SMarshall Clow #include "test_macros.h"
337fc6a556SMarshall Clow
345a83710eSEric Fiselier class A
355a83710eSEric Fiselier {
365a83710eSEric Fiselier int data_[10];
375a83710eSEric Fiselier public:
385a83710eSEric Fiselier static int count;
395a83710eSEric Fiselier
A()405a83710eSEric Fiselier A()
415a83710eSEric Fiselier {
425a83710eSEric Fiselier ++count;
435a83710eSEric Fiselier for (int i = 0; i < 10; ++i)
445a83710eSEric Fiselier data_[i] = i;
455a83710eSEric Fiselier }
465a83710eSEric Fiselier
A(const A &)475a83710eSEric Fiselier A(const A&) {++count;}
485a83710eSEric Fiselier
~A()495a83710eSEric Fiselier ~A() {--count;}
505a83710eSEric Fiselier
operator ()(int i) const515a83710eSEric Fiselier int operator()(int i) const
525a83710eSEric Fiselier {
535a83710eSEric Fiselier for (int j = 0; j < 10; ++j)
545a83710eSEric Fiselier i += data_[j];
555a83710eSEric Fiselier return i;
565a83710eSEric Fiselier }
575a83710eSEric Fiselier
foo(int) const585a83710eSEric Fiselier int foo(int) const {return 1;}
595a83710eSEric Fiselier };
605a83710eSEric Fiselier
615a83710eSEric Fiselier int A::count = 0;
625a83710eSEric Fiselier
g(int)635a83710eSEric Fiselier int g(int) {return 0;}
645a83710eSEric Fiselier
main(int,char **)652df59c50SJF Bastien int main(int, char**)
665a83710eSEric Fiselier {
675a83710eSEric Fiselier {
685a83710eSEric Fiselier std::function<int(int)> f = A();
695a83710eSEric Fiselier assert(A::count == 1);
705a83710eSEric Fiselier assert(f.target<A>());
715a83710eSEric Fiselier assert(f.target<int(*)(int)>() == 0);
72d75e4514SEric Fiselier assert(f.target<int>() == nullptr);
735a83710eSEric Fiselier }
745a83710eSEric Fiselier assert(A::count == 0);
755a83710eSEric Fiselier {
765a83710eSEric Fiselier std::function<int(int)> f = g;
775a83710eSEric Fiselier assert(A::count == 0);
785a83710eSEric Fiselier assert(f.target<int(*)(int)>());
795a83710eSEric Fiselier assert(f.target<A>() == 0);
80d75e4514SEric Fiselier assert(f.target<int>() == nullptr);
815a83710eSEric Fiselier }
825a83710eSEric Fiselier assert(A::count == 0);
835a83710eSEric Fiselier {
845a83710eSEric Fiselier const std::function<int(int)> f = A();
855a83710eSEric Fiselier assert(A::count == 1);
865a83710eSEric Fiselier assert(f.target<A>());
875a83710eSEric Fiselier assert(f.target<int(*)(int)>() == 0);
88d75e4514SEric Fiselier assert(f.target<int>() == nullptr);
895a83710eSEric Fiselier }
905a83710eSEric Fiselier assert(A::count == 0);
915a83710eSEric Fiselier {
925a83710eSEric Fiselier const std::function<int(int)> f = g;
935a83710eSEric Fiselier assert(A::count == 0);
945a83710eSEric Fiselier assert(f.target<int(*)(int)>());
955a83710eSEric Fiselier assert(f.target<A>() == 0);
96d75e4514SEric Fiselier assert(f.target<int>() == nullptr);
975a83710eSEric Fiselier }
985a83710eSEric Fiselier assert(A::count == 0);
992df59c50SJF Bastien
1002df59c50SJF Bastien return 0;
1015a83710eSEric Fiselier }
102