| //===----------------------------------------------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // UNSUPPORTED: c++03, c++11, c++14, c++17, c++20 |
| |
| // <functional> |
| |
| // template<class F, class... Args> |
| // constexpr unspecified bind_back(F&& f, Args&&... args); |
| |
| #include <functional> |
| |
| #include "types.h" |
| |
| constexpr int pass(int n) { return n; } |
| |
| void test() { |
| { // Test calling constexpr function from non-constexpr `bind_back` result |
| auto f1 = std::bind_back(pass, 1); |
| static_assert(f1() == 1); // expected-error {{static assertion expression is not an integral constant expression}} |
| } |
| |
| { // Test calling `bind_back` with template function |
| auto f1 = std::bind_back(do_nothing, 2); |
| // expected-error@-1 {{no matching function for call to 'bind_back'}} |
| } |
| |
| { // Mandates: is_constructible_v<decay_t<F>, F> |
| struct F { |
| F() = default; |
| F(const F&) = default; |
| F(F&) = delete; |
| |
| void operator()() {} |
| }; |
| |
| F f; |
| auto f1 = std::bind_back(f); |
| // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires decay_t<F> to be constructible from F}} |
| } |
| |
| { // Mandates: is_move_constructible_v<decay_t<F>> |
| struct F { |
| F() = default; |
| F(const F&) = default; |
| F(F&&) = delete; |
| |
| void operator()() {} |
| }; |
| |
| F f; |
| auto f1 = std::bind_back(f); |
| // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires decay_t<F> to be move constructible}} |
| } |
| |
| { // Mandates: (is_constructible_v<decay_t<Args>, Args> && ...) |
| struct Arg { |
| Arg() = default; |
| Arg(const Arg&) = default; |
| Arg(Arg&) = delete; |
| }; |
| |
| Arg x; |
| auto f = std::bind_back([](const Arg&) {}, x); |
| // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires all decay_t<Args> to be constructible from respective Args}} |
| // expected-error@*:* {{no matching constructor for initialization}} |
| // expected-error@*:* 0-1{{call to deleted constructor of 'F'}} |
| // expected-error@*:* 0-1{{call to deleted constructor of 'Arg'}} |
| } |
| |
| { // Mandates: (is_move_constructible_v<decay_t<Args>> && ...) |
| struct Arg { |
| Arg() = default; |
| Arg(const Arg&) = default; |
| Arg(Arg&&) = delete; |
| }; |
| |
| Arg x; |
| auto f = std::bind_back([](Arg&) {}, x); |
| // expected-error-re@*:* {{static assertion failed{{.*}}bind_back requires all decay_t<Args> to be move constructible}} |
| } |
| } |