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, c++11, c++14, c++17
10 
11 // indirect_result_t
12 
13 #include <iterator>
14 #include <concepts>
15 
16 static_assert(std::same_as<std::indirect_result_t<int (*)(int), int*>, int>);
17 static_assert(std::same_as<std::indirect_result_t<double (*)(int const&, float), int const*, float*>, double>);
18 
19 struct S { };
20 static_assert(std::same_as<std::indirect_result_t<S (&)(int), int*>, S>);
21 static_assert(std::same_as<std::indirect_result_t<long S::*, S*>, long&>);
22 static_assert(std::same_as<std::indirect_result_t<S && (S::*)(), S*>, S&&>);
23 static_assert(std::same_as<std::indirect_result_t<int S::* (S::*)(int) const, S*, int*>, int S::*>);
24 
25 template <class F, class... Is>
26 constexpr bool has_indirect_result = requires {
27   typename std::indirect_result_t<F, Is...>;
28 };
29 
30 static_assert(!has_indirect_result<int (*)(int), int>); // int isn't indirectly_readable
31 static_assert(!has_indirect_result<int, int*>);         // int isn't invocable
32