xref: /llvm-project/libcxx/test/std/utilities/function.objects/bind/func.bind/func.bind.bind/PR23141.pass.cpp (revision 13f5579caeee2c75baf1249b9f64de54f7c361e2)
1*13f5579cSLouis Dionne //===----------------------------------------------------------------------===//
2*13f5579cSLouis Dionne //
3*13f5579cSLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*13f5579cSLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5*13f5579cSLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*13f5579cSLouis Dionne //
7*13f5579cSLouis Dionne //===----------------------------------------------------------------------===//
8*13f5579cSLouis Dionne 
9*13f5579cSLouis Dionne // UNSUPPORTED: c++03
10*13f5579cSLouis Dionne 
11*13f5579cSLouis Dionne // <functional>
12*13f5579cSLouis Dionne 
13*13f5579cSLouis Dionne // template<CopyConstructible Fn, CopyConstructible... Types>
14*13f5579cSLouis Dionne //   unspecified bind(Fn, Types...);    // constexpr since C++20
15*13f5579cSLouis Dionne // template<Returnable R, CopyConstructible Fn, CopyConstructible... Types>
16*13f5579cSLouis Dionne //   unspecified bind(Fn, Types...);    // constexpr since C++20
17*13f5579cSLouis Dionne 
18*13f5579cSLouis Dionne // https://llvm.org/PR23141
19*13f5579cSLouis Dionne #include <functional>
20*13f5579cSLouis Dionne #include <type_traits>
21*13f5579cSLouis Dionne 
22*13f5579cSLouis Dionne #include "test_macros.h"
23*13f5579cSLouis Dionne 
24*13f5579cSLouis Dionne struct Fun {
25*13f5579cSLouis Dionne   template<typename T, typename U>
operator ()Fun26*13f5579cSLouis Dionne   TEST_CONSTEXPR_CXX20 void operator()(T &&, U &&) const {
27*13f5579cSLouis Dionne     static_assert(std::is_same<U, int &>::value, "");
28*13f5579cSLouis Dionne   }
29*13f5579cSLouis Dionne };
30*13f5579cSLouis Dionne 
test()31*13f5579cSLouis Dionne TEST_CONSTEXPR_CXX20 bool test() {
32*13f5579cSLouis Dionne   std::bind(Fun{}, std::placeholders::_1, 42)("hello");
33*13f5579cSLouis Dionne   return true;
34*13f5579cSLouis Dionne }
35*13f5579cSLouis Dionne 
main(int,char **)36*13f5579cSLouis Dionne int main(int, char**) {
37*13f5579cSLouis Dionne   test();
38*13f5579cSLouis Dionne #if TEST_STD_VER >= 20
39*13f5579cSLouis Dionne   static_assert(test());
40*13f5579cSLouis Dionne #endif
41*13f5579cSLouis Dionne 
42*13f5579cSLouis Dionne   return 0;
43*13f5579cSLouis Dionne }
44