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-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // UNSUPPORTED: c++03
10 
11 // <functional>
12 
13 // template<CopyConstructible Fn, CopyConstructible... Types>
14 //   unspecified bind(Fn, Types...);
15 // template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
16 //   unspecified bind(Fn, Types...);
17 
18 // https://llvm.org/PR22003
19 
20 #include <functional>
21 
22 #include "test_macros.h"
23 
24 struct DummyUnaryFunction
25 {
26     template <typename S>
operator ()DummyUnaryFunction27     int operator()(S const &) const { return 0; }
28 };
29 
30 struct BadUnaryFunction
31 {
32     template <typename S>
operator ()BadUnaryFunction33     constexpr int operator()(S const &) const
34     {
35         // Trigger a compile error if this function is instantiated.
36         // The constexpr is needed so that it is instantiated while checking
37         // __invoke_of<BadUnaryFunction &, ...>.
38         static_assert(!std::is_same<S, S>::value, "Shit");
39         return 0;
40     }
41 };
42 
main(int,char **)43 int main(int, char**)
44 {
45     // Check that BadUnaryFunction::operator()(S const &) is not
46     // instantiated when checking if BadUnaryFunction is a nested bind
47     // expression during b(0). See PR22003.
48     auto b = std::bind(DummyUnaryFunction(), BadUnaryFunction());
49     b(0);
50     auto b2 = std::bind<long>(DummyUnaryFunction(), BadUnaryFunction());
51     b2(0);
52 
53   return 0;
54 }
55