101 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++0310 11// <functional>12 13// class function<R(ArgTypes...)>14 15// template<typename T>16// requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>17// T*18// target();19// template<typename T>20// requires Callable<T, ArgTypes...> && Convertible<Callable<T, ArgTypes...>::result_type, R>21// const T*22// target() const;23 24// UNSUPPORTED: no-rtti25 26#include <functional>27#include <new>28#include <cstdlib>29#include <cassert>30 31#include "test_macros.h"32 33class A34{35 int data_[10];36public:37 static int count;38 39 A()40 {41 ++count;42 for (int i = 0; i < 10; ++i)43 data_[i] = i;44 }45 46 A(const A&) {++count;}47 48 ~A() {--count;}49 50 int operator()(int i) const51 {52 for (int j = 0; j < 10; ++j)53 i += data_[j];54 return i;55 }56 57 int foo(int) const {return 1;}58};59 60int A::count = 0;61 62int g(int) {return 0;}63 64int main(int, char**)65{66 {67 std::function<int(int)> f = A();68 assert(A::count == 1);69 assert(f.target<A>());70 assert(f.target<int(*)(int)>() == 0);71 assert(f.target<int>() == nullptr);72 }73 assert(A::count == 0);74 {75 std::function<int(int)> f = g;76 assert(A::count == 0);77 assert(f.target<int(*)(int)>());78 assert(f.target<A>() == 0);79 assert(f.target<int>() == nullptr);80 }81 assert(A::count == 0);82 {83 const std::function<int(int)> f = A();84 assert(A::count == 1);85 assert(f.target<A>());86 assert(f.target<int(*)(int)>() == 0);87 assert(f.target<int>() == nullptr);88 }89 assert(A::count == 0);90 {91 const std::function<int(int)> f = g;92 assert(A::count == 0);93 assert(f.target<int(*)(int)>());94 assert(f.target<A>() == 0);95 assert(f.target<int>() == nullptr);96 }97 assert(A::count == 0);98 99 return 0;100}101