1*8d4860aaSLouis Dionne //===----------------------------------------------------------------------===//
2*8d4860aaSLouis Dionne //
3*8d4860aaSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*8d4860aaSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*8d4860aaSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*8d4860aaSLouis Dionne //
7*8d4860aaSLouis Dionne //===----------------------------------------------------------------------===//
8*8d4860aaSLouis Dionne 
9*8d4860aaSLouis Dionne // <functional>
10*8d4860aaSLouis Dionne 
11*8d4860aaSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
12*8d4860aaSLouis Dionne 
13*8d4860aaSLouis Dionne // class function<R(ArgTypes...)>
14*8d4860aaSLouis Dionne 
15*8d4860aaSLouis Dionne // template<class A> function(allocator_arg_t, const A&, function&&);
16*8d4860aaSLouis Dionne //
17*8d4860aaSLouis Dionne // This signature was removed in C++17
18*8d4860aaSLouis Dionne 
19*8d4860aaSLouis Dionne #include <functional>
20*8d4860aaSLouis Dionne #include <memory>
21*8d4860aaSLouis Dionne #include <cassert>
22*8d4860aaSLouis Dionne 
23*8d4860aaSLouis Dionne #include "test_macros.h"
24*8d4860aaSLouis Dionne 
25*8d4860aaSLouis Dionne class A
26*8d4860aaSLouis Dionne {
27*8d4860aaSLouis Dionne     int data_[10];
28*8d4860aaSLouis Dionne public:
29*8d4860aaSLouis Dionne     static int count;
30*8d4860aaSLouis Dionne 
A()31*8d4860aaSLouis Dionne     A()
32*8d4860aaSLouis Dionne     {
33*8d4860aaSLouis Dionne         ++count;
34*8d4860aaSLouis Dionne         for (int i = 0; i < 10; ++i)
35*8d4860aaSLouis Dionne             data_[i] = i;
36*8d4860aaSLouis Dionne     }
37*8d4860aaSLouis Dionne 
A(const A &)38*8d4860aaSLouis Dionne     A(const A&) {++count;}
39*8d4860aaSLouis Dionne 
~A()40*8d4860aaSLouis Dionne     ~A() {--count;}
41*8d4860aaSLouis Dionne 
operator ()(int i) const42*8d4860aaSLouis Dionne     int operator()(int i) const
43*8d4860aaSLouis Dionne     {
44*8d4860aaSLouis Dionne         for (int j = 0; j < 10; ++j)
45*8d4860aaSLouis Dionne             i += data_[j];
46*8d4860aaSLouis Dionne         return i;
47*8d4860aaSLouis Dionne     }
48*8d4860aaSLouis Dionne };
49*8d4860aaSLouis Dionne 
50*8d4860aaSLouis Dionne int A::count = 0;
51*8d4860aaSLouis Dionne 
g(int)52*8d4860aaSLouis Dionne int g(int) { return 0; }
53*8d4860aaSLouis Dionne 
main(int,char **)54*8d4860aaSLouis Dionne int main(int, char**)
55*8d4860aaSLouis Dionne {
56*8d4860aaSLouis Dionne     std::function<int(int)> f = A();
57*8d4860aaSLouis Dionne     std::function<int(int)> f2(std::allocator_arg, std::allocator<A>(), std::move(f)); // expected-error {{no matching constructor for initialization of}}
58*8d4860aaSLouis Dionne     return 0;
59*8d4860aaSLouis Dionne }
60