1*9356374aSAndroid Build Coastguard Worker // Copyright 2017 The Abseil Authors.
2*9356374aSAndroid Build Coastguard Worker //
3*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*9356374aSAndroid Build Coastguard Worker //
7*9356374aSAndroid Build Coastguard Worker // https://www.apache.org/licenses/LICENSE-2.0
8*9356374aSAndroid Build Coastguard Worker //
9*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*9356374aSAndroid Build Coastguard Worker // limitations under the License.
14*9356374aSAndroid Build Coastguard Worker
15*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/invoke.h"
16*9356374aSAndroid Build Coastguard Worker
17*9356374aSAndroid Build Coastguard Worker #include <functional>
18*9356374aSAndroid Build Coastguard Worker #include <memory>
19*9356374aSAndroid Build Coastguard Worker #include <string>
20*9356374aSAndroid Build Coastguard Worker #include <utility>
21*9356374aSAndroid Build Coastguard Worker
22*9356374aSAndroid Build Coastguard Worker #include "gmock/gmock.h"
23*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/memory/memory.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
26*9356374aSAndroid Build Coastguard Worker
27*9356374aSAndroid Build Coastguard Worker namespace absl {
28*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_BEGIN
29*9356374aSAndroid Build Coastguard Worker namespace base_internal {
30*9356374aSAndroid Build Coastguard Worker namespace {
31*9356374aSAndroid Build Coastguard Worker
Function(int a,int b)32*9356374aSAndroid Build Coastguard Worker int Function(int a, int b) { return a - b; }
33*9356374aSAndroid Build Coastguard Worker
VoidFunction(int & a,int & b)34*9356374aSAndroid Build Coastguard Worker void VoidFunction(int& a, int& b) {
35*9356374aSAndroid Build Coastguard Worker a += b;
36*9356374aSAndroid Build Coastguard Worker b = a - b;
37*9356374aSAndroid Build Coastguard Worker a -= b;
38*9356374aSAndroid Build Coastguard Worker }
39*9356374aSAndroid Build Coastguard Worker
ZeroArgFunction()40*9356374aSAndroid Build Coastguard Worker int ZeroArgFunction() { return -1937; }
41*9356374aSAndroid Build Coastguard Worker
Sink(std::unique_ptr<int> p)42*9356374aSAndroid Build Coastguard Worker int Sink(std::unique_ptr<int> p) {
43*9356374aSAndroid Build Coastguard Worker return *p;
44*9356374aSAndroid Build Coastguard Worker }
45*9356374aSAndroid Build Coastguard Worker
Factory(int n)46*9356374aSAndroid Build Coastguard Worker std::unique_ptr<int> Factory(int n) {
47*9356374aSAndroid Build Coastguard Worker return make_unique<int>(n);
48*9356374aSAndroid Build Coastguard Worker }
49*9356374aSAndroid Build Coastguard Worker
NoOp()50*9356374aSAndroid Build Coastguard Worker void NoOp() {}
51*9356374aSAndroid Build Coastguard Worker
52*9356374aSAndroid Build Coastguard Worker struct ConstFunctor {
operator ()absl::base_internal::__anonc9d018b00111::ConstFunctor53*9356374aSAndroid Build Coastguard Worker int operator()(int a, int b) const { return a - b; }
54*9356374aSAndroid Build Coastguard Worker };
55*9356374aSAndroid Build Coastguard Worker
56*9356374aSAndroid Build Coastguard Worker struct MutableFunctor {
operator ()absl::base_internal::__anonc9d018b00111::MutableFunctor57*9356374aSAndroid Build Coastguard Worker int operator()(int a, int b) { return a - b; }
58*9356374aSAndroid Build Coastguard Worker };
59*9356374aSAndroid Build Coastguard Worker
60*9356374aSAndroid Build Coastguard Worker struct EphemeralFunctor {
operator ()absl::base_internal::__anonc9d018b00111::EphemeralFunctor61*9356374aSAndroid Build Coastguard Worker int operator()(int a, int b) && { return a - b; }
62*9356374aSAndroid Build Coastguard Worker };
63*9356374aSAndroid Build Coastguard Worker
64*9356374aSAndroid Build Coastguard Worker struct OverloadedFunctor {
65*9356374aSAndroid Build Coastguard Worker template <typename... Args>
operator ()absl::base_internal::__anonc9d018b00111::OverloadedFunctor66*9356374aSAndroid Build Coastguard Worker std::string operator()(const Args&... args) & {
67*9356374aSAndroid Build Coastguard Worker return StrCat("&", args...);
68*9356374aSAndroid Build Coastguard Worker }
69*9356374aSAndroid Build Coastguard Worker template <typename... Args>
operator ()absl::base_internal::__anonc9d018b00111::OverloadedFunctor70*9356374aSAndroid Build Coastguard Worker std::string operator()(const Args&... args) const& {
71*9356374aSAndroid Build Coastguard Worker return StrCat("const&", args...);
72*9356374aSAndroid Build Coastguard Worker }
73*9356374aSAndroid Build Coastguard Worker template <typename... Args>
operator ()absl::base_internal::__anonc9d018b00111::OverloadedFunctor74*9356374aSAndroid Build Coastguard Worker std::string operator()(const Args&... args) && {
75*9356374aSAndroid Build Coastguard Worker return StrCat("&&", args...);
76*9356374aSAndroid Build Coastguard Worker }
77*9356374aSAndroid Build Coastguard Worker };
78*9356374aSAndroid Build Coastguard Worker
79*9356374aSAndroid Build Coastguard Worker struct Class {
Methodabsl::base_internal::__anonc9d018b00111::Class80*9356374aSAndroid Build Coastguard Worker int Method(int a, int b) { return a - b; }
ConstMethodabsl::base_internal::__anonc9d018b00111::Class81*9356374aSAndroid Build Coastguard Worker int ConstMethod(int a, int b) const { return a - b; }
RefMethodabsl::base_internal::__anonc9d018b00111::Class82*9356374aSAndroid Build Coastguard Worker int RefMethod(int a, int b) & { return a - b; }
RefRefMethodabsl::base_internal::__anonc9d018b00111::Class83*9356374aSAndroid Build Coastguard Worker int RefRefMethod(int a, int b) && { return a - b; }
NoExceptMethodabsl::base_internal::__anonc9d018b00111::Class84*9356374aSAndroid Build Coastguard Worker int NoExceptMethod(int a, int b) noexcept { return a - b; }
VolatileMethodabsl::base_internal::__anonc9d018b00111::Class85*9356374aSAndroid Build Coastguard Worker int VolatileMethod(int a, int b) volatile { return a - b; }
86*9356374aSAndroid Build Coastguard Worker
87*9356374aSAndroid Build Coastguard Worker int member;
88*9356374aSAndroid Build Coastguard Worker };
89*9356374aSAndroid Build Coastguard Worker
90*9356374aSAndroid Build Coastguard Worker struct FlipFlop {
ConstMethodabsl::base_internal::__anonc9d018b00111::FlipFlop91*9356374aSAndroid Build Coastguard Worker int ConstMethod() const { return member; }
operator *absl::base_internal::__anonc9d018b00111::FlipFlop92*9356374aSAndroid Build Coastguard Worker FlipFlop operator*() const { return {-member}; }
93*9356374aSAndroid Build Coastguard Worker
94*9356374aSAndroid Build Coastguard Worker int member;
95*9356374aSAndroid Build Coastguard Worker };
96*9356374aSAndroid Build Coastguard Worker
97*9356374aSAndroid Build Coastguard Worker // CallMaybeWithArg(f) resolves either to invoke(f) or invoke(f, 42), depending
98*9356374aSAndroid Build Coastguard Worker // on which one is valid.
99*9356374aSAndroid Build Coastguard Worker template <typename F>
invoke(std::declval<const F &> ())100*9356374aSAndroid Build Coastguard Worker decltype(base_internal::invoke(std::declval<const F&>())) CallMaybeWithArg(
101*9356374aSAndroid Build Coastguard Worker const F& f) {
102*9356374aSAndroid Build Coastguard Worker return base_internal::invoke(f);
103*9356374aSAndroid Build Coastguard Worker }
104*9356374aSAndroid Build Coastguard Worker
105*9356374aSAndroid Build Coastguard Worker template <typename F>
CallMaybeWithArg(const F & f)106*9356374aSAndroid Build Coastguard Worker decltype(base_internal::invoke(std::declval<const F&>(), 42)) CallMaybeWithArg(
107*9356374aSAndroid Build Coastguard Worker const F& f) {
108*9356374aSAndroid Build Coastguard Worker return base_internal::invoke(f, 42);
109*9356374aSAndroid Build Coastguard Worker }
110*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,Function)111*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, Function) {
112*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(Function, 3, 2));
113*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Function, 3, 2));
114*9356374aSAndroid Build Coastguard Worker }
115*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,NonCopyableArgument)116*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, NonCopyableArgument) {
117*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(Sink, make_unique<int>(42)));
118*9356374aSAndroid Build Coastguard Worker }
119*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,NonCopyableResult)120*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, NonCopyableResult) {
121*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(base_internal::invoke(Factory, 42), ::testing::Pointee(42));
122*9356374aSAndroid Build Coastguard Worker }
123*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,VoidResult)124*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, VoidResult) { base_internal::invoke(NoOp); }
125*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,ConstFunctor)126*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, ConstFunctor) {
127*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(ConstFunctor(), 3, 2));
128*9356374aSAndroid Build Coastguard Worker }
129*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,MutableFunctor)130*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, MutableFunctor) {
131*9356374aSAndroid Build Coastguard Worker MutableFunctor f;
132*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(f, 3, 2));
133*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(MutableFunctor(), 3, 2));
134*9356374aSAndroid Build Coastguard Worker }
135*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,EphemeralFunctor)136*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, EphemeralFunctor) {
137*9356374aSAndroid Build Coastguard Worker EphemeralFunctor f;
138*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(std::move(f), 3, 2));
139*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(EphemeralFunctor(), 3, 2));
140*9356374aSAndroid Build Coastguard Worker }
141*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,OverloadedFunctor)142*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, OverloadedFunctor) {
143*9356374aSAndroid Build Coastguard Worker OverloadedFunctor f;
144*9356374aSAndroid Build Coastguard Worker const OverloadedFunctor& cf = f;
145*9356374aSAndroid Build Coastguard Worker
146*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("&", base_internal::invoke(f));
147*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("& 42", base_internal::invoke(f, " 42"));
148*9356374aSAndroid Build Coastguard Worker
149*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("const&", base_internal::invoke(cf));
150*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("const& 42", base_internal::invoke(cf, " 42"));
151*9356374aSAndroid Build Coastguard Worker
152*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("&&", base_internal::invoke(std::move(f)));
153*9356374aSAndroid Build Coastguard Worker
154*9356374aSAndroid Build Coastguard Worker OverloadedFunctor f2;
155*9356374aSAndroid Build Coastguard Worker EXPECT_EQ("&& 42", base_internal::invoke(std::move(f2), " 42"));
156*9356374aSAndroid Build Coastguard Worker }
157*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,ReferenceWrapper)158*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, ReferenceWrapper) {
159*9356374aSAndroid Build Coastguard Worker ConstFunctor cf;
160*9356374aSAndroid Build Coastguard Worker MutableFunctor mf;
161*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(std::cref(cf), 3, 2));
162*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(std::ref(cf), 3, 2));
163*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(std::ref(mf), 3, 2));
164*9356374aSAndroid Build Coastguard Worker }
165*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,MemberFunction)166*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, MemberFunction) {
167*9356374aSAndroid Build Coastguard Worker std::unique_ptr<Class> p(new Class);
168*9356374aSAndroid Build Coastguard Worker std::unique_ptr<const Class> cp(new Class);
169*9356374aSAndroid Build Coastguard Worker std::unique_ptr<volatile Class> vp(new Class);
170*9356374aSAndroid Build Coastguard Worker
171*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::Method, p, 3, 2));
172*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::Method, p.get(), 3, 2));
173*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::Method, *p, 3, 2));
174*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p, 3, 2));
175*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, p.get(), 3, 2));
176*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::RefMethod, *p, 3, 2));
177*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::RefRefMethod, std::move(*p), 3,
178*9356374aSAndroid Build Coastguard Worker 2)); // NOLINT
179*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p, 3, 2));
180*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, p.get(), 3, 2));
181*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::NoExceptMethod, *p, 3, 2));
182*9356374aSAndroid Build Coastguard Worker
183*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p, 3, 2));
184*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, p.get(), 3, 2));
185*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *p, 3, 2));
186*9356374aSAndroid Build Coastguard Worker
187*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp, 3, 2));
188*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, cp.get(), 3, 2));
189*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, *cp, 3, 2));
190*9356374aSAndroid Build Coastguard Worker
191*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p, 3, 2));
192*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, p.get(), 3, 2));
193*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *p, 3, 2));
194*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp, 3, 2));
195*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, vp.get(), 3, 2));
196*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::VolatileMethod, *vp, 3, 2));
197*9356374aSAndroid Build Coastguard Worker
198*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1,
199*9356374aSAndroid Build Coastguard Worker base_internal::invoke(&Class::Method, make_unique<Class>(), 3, 2));
200*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod, make_unique<Class>(),
201*9356374aSAndroid Build Coastguard Worker 3, 2));
202*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(1, base_internal::invoke(&Class::ConstMethod,
203*9356374aSAndroid Build Coastguard Worker make_unique<const Class>(), 3, 2));
204*9356374aSAndroid Build Coastguard Worker }
205*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,DataMember)206*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, DataMember) {
207*9356374aSAndroid Build Coastguard Worker std::unique_ptr<Class> p(new Class{42});
208*9356374aSAndroid Build Coastguard Worker std::unique_ptr<const Class> cp(new Class{42});
209*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, p));
210*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, *p));
211*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, p.get()));
212*9356374aSAndroid Build Coastguard Worker
213*9356374aSAndroid Build Coastguard Worker base_internal::invoke(&Class::member, p) = 42;
214*9356374aSAndroid Build Coastguard Worker base_internal::invoke(&Class::member, p.get()) = 42;
215*9356374aSAndroid Build Coastguard Worker
216*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, cp));
217*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, *cp));
218*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&Class::member, cp.get()));
219*9356374aSAndroid Build Coastguard Worker }
220*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,FlipFlop)221*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, FlipFlop) {
222*9356374aSAndroid Build Coastguard Worker FlipFlop obj = {42};
223*9356374aSAndroid Build Coastguard Worker // This call could resolve to (obj.*&FlipFlop::ConstMethod)() or
224*9356374aSAndroid Build Coastguard Worker // ((*obj).*&FlipFlop::ConstMethod)(). We verify that it's the former.
225*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&FlipFlop::ConstMethod, obj));
226*9356374aSAndroid Build Coastguard Worker EXPECT_EQ(42, base_internal::invoke(&FlipFlop::member, obj));
227*9356374aSAndroid Build Coastguard Worker }
228*9356374aSAndroid Build Coastguard Worker
TEST(InvokeTest,SfinaeFriendly)229*9356374aSAndroid Build Coastguard Worker TEST(InvokeTest, SfinaeFriendly) {
230*9356374aSAndroid Build Coastguard Worker CallMaybeWithArg(NoOp);
231*9356374aSAndroid Build Coastguard Worker EXPECT_THAT(CallMaybeWithArg(Factory), ::testing::Pointee(42));
232*9356374aSAndroid Build Coastguard Worker }
233*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableExactMatch)234*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableExactMatch) {
235*9356374aSAndroid Build Coastguard Worker static_assert(
236*9356374aSAndroid Build Coastguard Worker base_internal::is_invocable_r<int, decltype(Function), int, int>::value,
237*9356374aSAndroid Build Coastguard Worker "Should be true for exact match of types on a free function");
238*9356374aSAndroid Build Coastguard Worker }
239*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableArgumentConversionMatch)240*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableArgumentConversionMatch) {
241*9356374aSAndroid Build Coastguard Worker static_assert(
242*9356374aSAndroid Build Coastguard Worker base_internal::is_invocable_r<int, decltype(Function), char, int>::value,
243*9356374aSAndroid Build Coastguard Worker "Should be true for convertible argument type");
244*9356374aSAndroid Build Coastguard Worker }
245*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableReturnConversionMatch)246*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableReturnConversionMatch) {
247*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<double, decltype(Function), int,
248*9356374aSAndroid Build Coastguard Worker int>::value,
249*9356374aSAndroid Build Coastguard Worker "Should be true for convertible return type");
250*9356374aSAndroid Build Coastguard Worker }
251*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableReturnVoid)252*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableReturnVoid) {
253*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<void, decltype(VoidFunction),
254*9356374aSAndroid Build Coastguard Worker int&, int&>::value,
255*9356374aSAndroid Build Coastguard Worker "Should be true for void expected and actual return types");
256*9356374aSAndroid Build Coastguard Worker static_assert(
257*9356374aSAndroid Build Coastguard Worker base_internal::is_invocable_r<void, decltype(Function), int, int>::value,
258*9356374aSAndroid Build Coastguard Worker "Should be true for void expected and non-void actual return types");
259*9356374aSAndroid Build Coastguard Worker }
260*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableRefQualifierMismatch)261*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableRefQualifierMismatch) {
262*9356374aSAndroid Build Coastguard Worker static_assert(!base_internal::is_invocable_r<void, decltype(VoidFunction),
263*9356374aSAndroid Build Coastguard Worker int&, const int&>::value,
264*9356374aSAndroid Build Coastguard Worker "Should be false for reference constness mismatch");
265*9356374aSAndroid Build Coastguard Worker static_assert(!base_internal::is_invocable_r<void, decltype(VoidFunction),
266*9356374aSAndroid Build Coastguard Worker int&&, int&>::value,
267*9356374aSAndroid Build Coastguard Worker "Should be false for reference value category mismatch");
268*9356374aSAndroid Build Coastguard Worker }
269*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableArgumentTypeMismatch)270*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableArgumentTypeMismatch) {
271*9356374aSAndroid Build Coastguard Worker static_assert(!base_internal::is_invocable_r<int, decltype(Function),
272*9356374aSAndroid Build Coastguard Worker std::string, int>::value,
273*9356374aSAndroid Build Coastguard Worker "Should be false for argument type mismatch");
274*9356374aSAndroid Build Coastguard Worker }
275*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableReturnTypeMismatch)276*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableReturnTypeMismatch) {
277*9356374aSAndroid Build Coastguard Worker static_assert(!base_internal::is_invocable_r<std::string, decltype(Function),
278*9356374aSAndroid Build Coastguard Worker int, int>::value,
279*9356374aSAndroid Build Coastguard Worker "Should be false for return type mismatch");
280*9356374aSAndroid Build Coastguard Worker }
281*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableTooFewArgs)282*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableTooFewArgs) {
283*9356374aSAndroid Build Coastguard Worker static_assert(
284*9356374aSAndroid Build Coastguard Worker !base_internal::is_invocable_r<int, decltype(Function), int>::value,
285*9356374aSAndroid Build Coastguard Worker "Should be false for too few arguments");
286*9356374aSAndroid Build Coastguard Worker }
287*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableTooManyArgs)288*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableTooManyArgs) {
289*9356374aSAndroid Build Coastguard Worker static_assert(!base_internal::is_invocable_r<int, decltype(Function), int,
290*9356374aSAndroid Build Coastguard Worker int, int>::value,
291*9356374aSAndroid Build Coastguard Worker "Should be false for too many arguments");
292*9356374aSAndroid Build Coastguard Worker }
293*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,MemberFunctionAndReference)294*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, MemberFunctionAndReference) {
295*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<int, decltype(&Class::Method),
296*9356374aSAndroid Build Coastguard Worker Class&, int, int>::value,
297*9356374aSAndroid Build Coastguard Worker "Should be true for exact match of types on a member function "
298*9356374aSAndroid Build Coastguard Worker "and class reference");
299*9356374aSAndroid Build Coastguard Worker }
300*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,MemberFunctionAndPointer)301*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, MemberFunctionAndPointer) {
302*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<int, decltype(&Class::Method),
303*9356374aSAndroid Build Coastguard Worker Class*, int, int>::value,
304*9356374aSAndroid Build Coastguard Worker "Should be true for exact match of types on a member function "
305*9356374aSAndroid Build Coastguard Worker "and class pointer");
306*9356374aSAndroid Build Coastguard Worker }
307*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,DataMemberAndReference)308*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, DataMemberAndReference) {
309*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<int, decltype(&Class::member),
310*9356374aSAndroid Build Coastguard Worker Class&>::value,
311*9356374aSAndroid Build Coastguard Worker "Should be true for exact match of types on a data member and "
312*9356374aSAndroid Build Coastguard Worker "class reference");
313*9356374aSAndroid Build Coastguard Worker }
314*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,DataMemberAndPointer)315*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, DataMemberAndPointer) {
316*9356374aSAndroid Build Coastguard Worker static_assert(base_internal::is_invocable_r<int, decltype(&Class::member),
317*9356374aSAndroid Build Coastguard Worker Class*>::value,
318*9356374aSAndroid Build Coastguard Worker "Should be true for exact match of types on a data member and "
319*9356374aSAndroid Build Coastguard Worker "class pointer");
320*9356374aSAndroid Build Coastguard Worker }
321*9356374aSAndroid Build Coastguard Worker
TEST(IsInvocableRTest,CallableZeroArgs)322*9356374aSAndroid Build Coastguard Worker TEST(IsInvocableRTest, CallableZeroArgs) {
323*9356374aSAndroid Build Coastguard Worker static_assert(
324*9356374aSAndroid Build Coastguard Worker base_internal::is_invocable_r<int, decltype(ZeroArgFunction)>::value,
325*9356374aSAndroid Build Coastguard Worker "Should be true for exact match for a zero-arg free function");
326*9356374aSAndroid Build Coastguard Worker }
327*9356374aSAndroid Build Coastguard Worker
328*9356374aSAndroid Build Coastguard Worker } // namespace
329*9356374aSAndroid Build Coastguard Worker } // namespace base_internal
330*9356374aSAndroid Build Coastguard Worker ABSL_NAMESPACE_END
331*9356374aSAndroid Build Coastguard Worker } // namespace absl
332