xref: /aosp_15_r20/external/abseil-cpp/absl/functional/any_invocable_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker // Copyright 2022 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/functional/any_invocable.h"
16*9356374aSAndroid Build Coastguard Worker 
17*9356374aSAndroid Build Coastguard Worker #include <cstddef>
18*9356374aSAndroid Build Coastguard Worker #include <initializer_list>
19*9356374aSAndroid Build Coastguard Worker #include <memory>
20*9356374aSAndroid Build Coastguard Worker #include <numeric>
21*9356374aSAndroid Build Coastguard Worker #include <type_traits>
22*9356374aSAndroid Build Coastguard Worker 
23*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
24*9356374aSAndroid Build Coastguard Worker #include "absl/base/config.h"
25*9356374aSAndroid Build Coastguard Worker #include "absl/meta/type_traits.h"
26*9356374aSAndroid Build Coastguard Worker #include "absl/utility/utility.h"
27*9356374aSAndroid Build Coastguard Worker 
28*9356374aSAndroid Build Coastguard Worker static_assert(absl::internal_any_invocable::kStorageSize >= sizeof(void*),
29*9356374aSAndroid Build Coastguard Worker               "These tests assume that the small object storage is at least "
30*9356374aSAndroid Build Coastguard Worker               "the size of a pointer.");
31*9356374aSAndroid Build Coastguard Worker 
32*9356374aSAndroid Build Coastguard Worker namespace {
33*9356374aSAndroid Build Coastguard Worker 
34*9356374aSAndroid Build Coastguard Worker // Helper macro used to avoid spelling `noexcept` in language versions older
35*9356374aSAndroid Build Coastguard Worker // than C++17, where it is not part of the type system, in order to avoid
36*9356374aSAndroid Build Coastguard Worker // compilation failures and internal compiler errors.
37*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
38*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_NOEXCEPT_SPEC(noex) noexcept(noex)
39*9356374aSAndroid Build Coastguard Worker #else
40*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNAL_NOEXCEPT_SPEC(noex)
41*9356374aSAndroid Build Coastguard Worker #endif
42*9356374aSAndroid Build Coastguard Worker 
43*9356374aSAndroid Build Coastguard Worker // A dummy type we use when passing qualifiers to metafunctions
44*9356374aSAndroid Build Coastguard Worker struct _ {};
45*9356374aSAndroid Build Coastguard Worker 
46*9356374aSAndroid Build Coastguard Worker template <class T>
47*9356374aSAndroid Build Coastguard Worker struct Wrapper {
48*9356374aSAndroid Build Coastguard Worker   template <class U,
49*9356374aSAndroid Build Coastguard Worker             class = absl::enable_if_t<std::is_convertible<U, T>::value>>
50*9356374aSAndroid Build Coastguard Worker   Wrapper(U&&);  // NOLINT
51*9356374aSAndroid Build Coastguard Worker };
52*9356374aSAndroid Build Coastguard Worker 
53*9356374aSAndroid Build Coastguard Worker // This will cause a recursive trait instantiation if the SFINAE checks are
54*9356374aSAndroid Build Coastguard Worker // not ordered correctly for constructibility.
55*9356374aSAndroid Build Coastguard Worker static_assert(std::is_constructible<Wrapper<absl::AnyInvocable<void()>>,
56*9356374aSAndroid Build Coastguard Worker                                     Wrapper<absl::AnyInvocable<void()>>>::value,
57*9356374aSAndroid Build Coastguard Worker               "");
58*9356374aSAndroid Build Coastguard Worker 
59*9356374aSAndroid Build Coastguard Worker // A metafunction that takes the cv and l-value reference qualifiers that were
60*9356374aSAndroid Build Coastguard Worker // associated with a function type (here passed via qualifiers of an object
61*9356374aSAndroid Build Coastguard Worker // type), and .
62*9356374aSAndroid Build Coastguard Worker template <class Qualifiers, class This>
63*9356374aSAndroid Build Coastguard Worker struct QualifiersForThisImpl {
64*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_object<This>::value, "");
65*9356374aSAndroid Build Coastguard Worker   using type =
66*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&;
67*9356374aSAndroid Build Coastguard Worker };
68*9356374aSAndroid Build Coastguard Worker 
69*9356374aSAndroid Build Coastguard Worker template <class Qualifiers, class This>
70*9356374aSAndroid Build Coastguard Worker struct QualifiersForThisImpl<Qualifiers&, This>
71*9356374aSAndroid Build Coastguard Worker     : QualifiersForThisImpl<Qualifiers, This> {};
72*9356374aSAndroid Build Coastguard Worker 
73*9356374aSAndroid Build Coastguard Worker template <class Qualifiers, class This>
74*9356374aSAndroid Build Coastguard Worker struct QualifiersForThisImpl<Qualifiers&&, This> {
75*9356374aSAndroid Build Coastguard Worker   static_assert(std::is_object<This>::value, "");
76*9356374aSAndroid Build Coastguard Worker   using type =
77*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<Qualifiers>::value, const This, This>&&;
78*9356374aSAndroid Build Coastguard Worker };
79*9356374aSAndroid Build Coastguard Worker 
80*9356374aSAndroid Build Coastguard Worker template <class Qualifiers, class This>
81*9356374aSAndroid Build Coastguard Worker using QualifiersForThis =
82*9356374aSAndroid Build Coastguard Worker     typename QualifiersForThisImpl<Qualifiers, This>::type;
83*9356374aSAndroid Build Coastguard Worker 
84*9356374aSAndroid Build Coastguard Worker // A metafunction that takes the cv and l-value reference qualifier of T and
85*9356374aSAndroid Build Coastguard Worker // applies them to U's function type qualifiers.
86*9356374aSAndroid Build Coastguard Worker template <class T, class Fun>
87*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl;
88*9356374aSAndroid Build Coastguard Worker 
89*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
90*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T, R(P...)> {
91*9356374aSAndroid Build Coastguard Worker   using type =
92*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<T>::value, R(P...) const, R(P...)>;
93*9356374aSAndroid Build Coastguard Worker };
94*9356374aSAndroid Build Coastguard Worker 
95*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
96*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T&, R(P...)> {
97*9356374aSAndroid Build Coastguard Worker   using type =
98*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<T>::value, R(P...) const&, R(P...)&>;
99*9356374aSAndroid Build Coastguard Worker };
100*9356374aSAndroid Build Coastguard Worker 
101*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
102*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T&&, R(P...)> {
103*9356374aSAndroid Build Coastguard Worker   using type =
104*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<T>::value, R(P...) const&&, R(P...) &&>;
105*9356374aSAndroid Build Coastguard Worker };
106*9356374aSAndroid Build Coastguard Worker 
107*9356374aSAndroid Build Coastguard Worker // If noexcept is a part of the type system, then provide the noexcept forms.
108*9356374aSAndroid Build Coastguard Worker #if defined(__cpp_noexcept_function_type)
109*9356374aSAndroid Build Coastguard Worker 
110*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
111*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T, R(P...) noexcept> {
112*9356374aSAndroid Build Coastguard Worker   using type = absl::conditional_t<std::is_const<T>::value,
113*9356374aSAndroid Build Coastguard Worker                                    R(P...) const noexcept, R(P...) noexcept>;
114*9356374aSAndroid Build Coastguard Worker };
115*9356374aSAndroid Build Coastguard Worker 
116*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
117*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T&, R(P...) noexcept> {
118*9356374aSAndroid Build Coastguard Worker   using type =
119*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<T>::value, R(P...) const & noexcept,
120*9356374aSAndroid Build Coastguard Worker                           R(P...) & noexcept>;
121*9356374aSAndroid Build Coastguard Worker };
122*9356374aSAndroid Build Coastguard Worker 
123*9356374aSAndroid Build Coastguard Worker template <class T, class R, class... P>
124*9356374aSAndroid Build Coastguard Worker struct GiveQualifiersToFunImpl<T&&, R(P...) noexcept> {
125*9356374aSAndroid Build Coastguard Worker   using type =
126*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_const<T>::value, R(P...) const && noexcept,
127*9356374aSAndroid Build Coastguard Worker                           R(P...) && noexcept>;
128*9356374aSAndroid Build Coastguard Worker };
129*9356374aSAndroid Build Coastguard Worker 
130*9356374aSAndroid Build Coastguard Worker #endif  // defined(__cpp_noexcept_function_type)
131*9356374aSAndroid Build Coastguard Worker 
132*9356374aSAndroid Build Coastguard Worker template <class T, class Fun>
133*9356374aSAndroid Build Coastguard Worker using GiveQualifiersToFun = typename GiveQualifiersToFunImpl<T, Fun>::type;
134*9356374aSAndroid Build Coastguard Worker 
135*9356374aSAndroid Build Coastguard Worker // This is used in template parameters to decide whether or not to use a type
136*9356374aSAndroid Build Coastguard Worker // that fits in the small object optimization storage.
137*9356374aSAndroid Build Coastguard Worker enum class ObjSize { small, large };
138*9356374aSAndroid Build Coastguard Worker 
139*9356374aSAndroid Build Coastguard Worker // A base type that is used with classes as a means to insert an
140*9356374aSAndroid Build Coastguard Worker // appropriately-sized dummy datamember when Size is ObjSize::large so that the
141*9356374aSAndroid Build Coastguard Worker // user's class type is guaranteed to not fit in small object storage.
142*9356374aSAndroid Build Coastguard Worker template <ObjSize Size>
143*9356374aSAndroid Build Coastguard Worker struct TypeErasedPadding;
144*9356374aSAndroid Build Coastguard Worker 
145*9356374aSAndroid Build Coastguard Worker template <>
146*9356374aSAndroid Build Coastguard Worker struct TypeErasedPadding<ObjSize::small> {};
147*9356374aSAndroid Build Coastguard Worker 
148*9356374aSAndroid Build Coastguard Worker template <>
149*9356374aSAndroid Build Coastguard Worker struct TypeErasedPadding<ObjSize::large> {
150*9356374aSAndroid Build Coastguard Worker   char dummy_data[absl::internal_any_invocable::kStorageSize + 1] = {};
151*9356374aSAndroid Build Coastguard Worker };
152*9356374aSAndroid Build Coastguard Worker 
153*9356374aSAndroid Build Coastguard Worker struct Int {
Int__anon5a17cb360111::Int154*9356374aSAndroid Build Coastguard Worker   Int(int v) noexcept : value(v) {}  // NOLINT
155*9356374aSAndroid Build Coastguard Worker #ifndef _MSC_VER
Int__anon5a17cb360111::Int156*9356374aSAndroid Build Coastguard Worker   Int(Int&&) noexcept {
157*9356374aSAndroid Build Coastguard Worker     // NOTE: Prior to C++17, this not being called requires optimizations to
158*9356374aSAndroid Build Coastguard Worker     //       take place when performing the top-level invocation. In practice,
159*9356374aSAndroid Build Coastguard Worker     //       most supported compilers perform this optimization prior to C++17.
160*9356374aSAndroid Build Coastguard Worker     std::abort();
161*9356374aSAndroid Build Coastguard Worker   }
162*9356374aSAndroid Build Coastguard Worker #else
163*9356374aSAndroid Build Coastguard Worker   Int(Int&& v) noexcept = default;
164*9356374aSAndroid Build Coastguard Worker #endif
operator int__anon5a17cb360111::Int165*9356374aSAndroid Build Coastguard Worker   operator int() && noexcept { return value; }  // NOLINT
166*9356374aSAndroid Build Coastguard Worker 
MemberFunctionAdd__anon5a17cb360111::Int167*9356374aSAndroid Build Coastguard Worker   int MemberFunctionAdd(int const& b, int c) noexcept {  // NOLINT
168*9356374aSAndroid Build Coastguard Worker     return value + b + c;
169*9356374aSAndroid Build Coastguard Worker   }
170*9356374aSAndroid Build Coastguard Worker 
171*9356374aSAndroid Build Coastguard Worker   int value;
172*9356374aSAndroid Build Coastguard Worker };
173*9356374aSAndroid Build Coastguard Worker 
174*9356374aSAndroid Build Coastguard Worker enum class Movable { no, yes, nothrow, trivial };
175*9356374aSAndroid Build Coastguard Worker 
176*9356374aSAndroid Build Coastguard Worker enum class NothrowCall { no, yes };
177*9356374aSAndroid Build Coastguard Worker 
178*9356374aSAndroid Build Coastguard Worker enum class Destructible { nothrow, trivial };
179*9356374aSAndroid Build Coastguard Worker 
180*9356374aSAndroid Build Coastguard Worker enum class ObjAlign : std::size_t {
181*9356374aSAndroid Build Coastguard Worker   normal = absl::internal_any_invocable::kAlignment,
182*9356374aSAndroid Build Coastguard Worker   large = absl::internal_any_invocable::kAlignment * 2,
183*9356374aSAndroid Build Coastguard Worker };
184*9356374aSAndroid Build Coastguard Worker 
185*9356374aSAndroid Build Coastguard Worker // A function-object template that has knobs for each property that can affect
186*9356374aSAndroid Build Coastguard Worker // how the object is stored in AnyInvocable.
187*9356374aSAndroid Build Coastguard Worker template <Movable Movability, Destructible Destructibility, class Qual,
188*9356374aSAndroid Build Coastguard Worker           NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
189*9356374aSAndroid Build Coastguard Worker struct add;
190*9356374aSAndroid Build Coastguard Worker 
191*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNALS_ADD(qual)                                              \
192*9356374aSAndroid Build Coastguard Worker   template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>  \
193*9356374aSAndroid Build Coastguard Worker   struct alignas(static_cast<std::size_t>(Alignment))                         \
194*9356374aSAndroid Build Coastguard Worker       add<Movable::trivial, Destructible::trivial, _ qual, CallExceptionSpec, \
195*9356374aSAndroid Build Coastguard Worker           Size, Alignment> : TypeErasedPadding<Size> {                        \
196*9356374aSAndroid Build Coastguard Worker     explicit add(int state_init) : state(state_init) {}                       \
197*9356374aSAndroid Build Coastguard Worker     explicit add(std::initializer_list<int> state_init, int tail)             \
198*9356374aSAndroid Build Coastguard Worker         : state(std::accumulate(std::begin(state_init), std::end(state_init), \
199*9356374aSAndroid Build Coastguard Worker                                 0) +                                          \
200*9356374aSAndroid Build Coastguard Worker                 tail) {}                                                      \
201*9356374aSAndroid Build Coastguard Worker     add(add&& other) = default; /*NOLINT*/                                    \
202*9356374aSAndroid Build Coastguard Worker     Int operator()(int a, int b, int c) qual                                  \
203*9356374aSAndroid Build Coastguard Worker         ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) {  \
204*9356374aSAndroid Build Coastguard Worker       return state + a + b + c;                                               \
205*9356374aSAndroid Build Coastguard Worker     }                                                                         \
206*9356374aSAndroid Build Coastguard Worker     int state;                                                                \
207*9356374aSAndroid Build Coastguard Worker   };                                                                          \
208*9356374aSAndroid Build Coastguard Worker                                                                               \
209*9356374aSAndroid Build Coastguard Worker   template <NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>  \
210*9356374aSAndroid Build Coastguard Worker   struct alignas(static_cast<std::size_t>(Alignment))                         \
211*9356374aSAndroid Build Coastguard Worker       add<Movable::trivial, Destructible::nothrow, _ qual, CallExceptionSpec, \
212*9356374aSAndroid Build Coastguard Worker           Size, Alignment> : TypeErasedPadding<Size> {                        \
213*9356374aSAndroid Build Coastguard Worker     explicit add(int state_init) : state(state_init) {}                       \
214*9356374aSAndroid Build Coastguard Worker     explicit add(std::initializer_list<int> state_init, int tail)             \
215*9356374aSAndroid Build Coastguard Worker         : state(std::accumulate(std::begin(state_init), std::end(state_init), \
216*9356374aSAndroid Build Coastguard Worker                                 0) +                                          \
217*9356374aSAndroid Build Coastguard Worker                 tail) {}                                                      \
218*9356374aSAndroid Build Coastguard Worker     ~add() noexcept {}                                                        \
219*9356374aSAndroid Build Coastguard Worker     add(add&& other) = default; /*NOLINT*/                                    \
220*9356374aSAndroid Build Coastguard Worker     Int operator()(int a, int b, int c) qual                                  \
221*9356374aSAndroid Build Coastguard Worker         ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes) {  \
222*9356374aSAndroid Build Coastguard Worker       return state + a + b + c;                                               \
223*9356374aSAndroid Build Coastguard Worker     }                                                                         \
224*9356374aSAndroid Build Coastguard Worker     int state;                                                                \
225*9356374aSAndroid Build Coastguard Worker   }
226*9356374aSAndroid Build Coastguard Worker 
227*9356374aSAndroid Build Coastguard Worker // Explicitly specify an empty argument.
228*9356374aSAndroid Build Coastguard Worker // MSVC (at least up to _MSC_VER 1931, if not beyond) warns that
229*9356374aSAndroid Build Coastguard Worker // ABSL_INTERNALS_ADD() is an undefined zero-arg overload.
230*9356374aSAndroid Build Coastguard Worker #define ABSL_INTERNALS_NOARG
231*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(ABSL_INTERNALS_NOARG);
232*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNALS_NOARG
233*9356374aSAndroid Build Coastguard Worker 
234*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(const);
235*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(&);
236*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(const&);
237*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(&&);       // NOLINT
238*9356374aSAndroid Build Coastguard Worker ABSL_INTERNALS_ADD(const&&);  // NOLINT
239*9356374aSAndroid Build Coastguard Worker 
240*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNALS_ADD
241*9356374aSAndroid Build Coastguard Worker 
242*9356374aSAndroid Build Coastguard Worker template <Destructible Destructibility, class Qual,
243*9356374aSAndroid Build Coastguard Worker           NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
244*9356374aSAndroid Build Coastguard Worker struct add<Movable::no, Destructibility, Qual, CallExceptionSpec, Size,
245*9356374aSAndroid Build Coastguard Worker            Alignment> : private add<Movable::trivial, Destructibility, Qual,
246*9356374aSAndroid Build Coastguard Worker                                     CallExceptionSpec, Size, Alignment> {
247*9356374aSAndroid Build Coastguard Worker   using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
248*9356374aSAndroid Build Coastguard Worker                    Size, Alignment>;
249*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add250*9356374aSAndroid Build Coastguard Worker   explicit add(int state_init) : Base(state_init) {}
251*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add252*9356374aSAndroid Build Coastguard Worker   explicit add(std::initializer_list<int> state_init, int tail)
253*9356374aSAndroid Build Coastguard Worker       : Base(state_init, tail) {}
254*9356374aSAndroid Build Coastguard Worker 
255*9356374aSAndroid Build Coastguard Worker   add(add&&) = delete;
256*9356374aSAndroid Build Coastguard Worker 
257*9356374aSAndroid Build Coastguard Worker   using Base::operator();
258*9356374aSAndroid Build Coastguard Worker   using Base::state;
259*9356374aSAndroid Build Coastguard Worker };
260*9356374aSAndroid Build Coastguard Worker 
261*9356374aSAndroid Build Coastguard Worker template <Destructible Destructibility, class Qual,
262*9356374aSAndroid Build Coastguard Worker           NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
263*9356374aSAndroid Build Coastguard Worker struct add<Movable::yes, Destructibility, Qual, CallExceptionSpec, Size,
264*9356374aSAndroid Build Coastguard Worker            Alignment> : private add<Movable::trivial, Destructibility, Qual,
265*9356374aSAndroid Build Coastguard Worker                                     CallExceptionSpec, Size, Alignment> {
266*9356374aSAndroid Build Coastguard Worker   using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
267*9356374aSAndroid Build Coastguard Worker                    Size, Alignment>;
268*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add269*9356374aSAndroid Build Coastguard Worker   explicit add(int state_init) : Base(state_init) {}
270*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add271*9356374aSAndroid Build Coastguard Worker   explicit add(std::initializer_list<int> state_init, int tail)
272*9356374aSAndroid Build Coastguard Worker       : Base(state_init, tail) {}
273*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add274*9356374aSAndroid Build Coastguard Worker   add(add&& other) noexcept(false) : Base(other.state) {}  // NOLINT
275*9356374aSAndroid Build Coastguard Worker 
276*9356374aSAndroid Build Coastguard Worker   using Base::operator();
277*9356374aSAndroid Build Coastguard Worker   using Base::state;
278*9356374aSAndroid Build Coastguard Worker };
279*9356374aSAndroid Build Coastguard Worker 
280*9356374aSAndroid Build Coastguard Worker template <Destructible Destructibility, class Qual,
281*9356374aSAndroid Build Coastguard Worker           NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
282*9356374aSAndroid Build Coastguard Worker struct add<Movable::nothrow, Destructibility, Qual, CallExceptionSpec, Size,
283*9356374aSAndroid Build Coastguard Worker            Alignment> : private add<Movable::trivial, Destructibility, Qual,
284*9356374aSAndroid Build Coastguard Worker                                     CallExceptionSpec, Size, Alignment> {
285*9356374aSAndroid Build Coastguard Worker   using Base = add<Movable::trivial, Destructibility, Qual, CallExceptionSpec,
286*9356374aSAndroid Build Coastguard Worker                    Size, Alignment>;
287*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add288*9356374aSAndroid Build Coastguard Worker   explicit add(int state_init) : Base(state_init) {}
289*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add290*9356374aSAndroid Build Coastguard Worker   explicit add(std::initializer_list<int> state_init, int tail)
291*9356374aSAndroid Build Coastguard Worker       : Base(state_init, tail) {}
292*9356374aSAndroid Build Coastguard Worker 
add__anon5a17cb360111::add293*9356374aSAndroid Build Coastguard Worker   add(add&& other) noexcept : Base(other.state) {}
294*9356374aSAndroid Build Coastguard Worker 
295*9356374aSAndroid Build Coastguard Worker   using Base::operator();
296*9356374aSAndroid Build Coastguard Worker   using Base::state;
297*9356374aSAndroid Build Coastguard Worker };
298*9356374aSAndroid Build Coastguard Worker 
299*9356374aSAndroid Build Coastguard Worker // Actual non-member functions rather than function objects
add_function(Int && a,int b,int c)300*9356374aSAndroid Build Coastguard Worker Int add_function(Int&& a, int b, int c) noexcept { return a.value + b + c; }
301*9356374aSAndroid Build Coastguard Worker 
mult_function(Int && a,int b,int c)302*9356374aSAndroid Build Coastguard Worker Int mult_function(Int&& a, int b, int c) noexcept { return a.value * b * c; }
303*9356374aSAndroid Build Coastguard Worker 
square_function(Int const && a)304*9356374aSAndroid Build Coastguard Worker Int square_function(Int const&& a) noexcept { return a.value * a.value; }
305*9356374aSAndroid Build Coastguard Worker 
306*9356374aSAndroid Build Coastguard Worker template <class Sig>
307*9356374aSAndroid Build Coastguard Worker using AnyInvocable = absl::AnyInvocable<Sig>;
308*9356374aSAndroid Build Coastguard Worker 
309*9356374aSAndroid Build Coastguard Worker // Instantiations of this template contains all of the compile-time parameters
310*9356374aSAndroid Build Coastguard Worker // for a given instantiation of the AnyInvocable test suite.
311*9356374aSAndroid Build Coastguard Worker template <Movable Movability, Destructible Destructibility, class Qual,
312*9356374aSAndroid Build Coastguard Worker           NothrowCall CallExceptionSpec, ObjSize Size, ObjAlign Alignment>
313*9356374aSAndroid Build Coastguard Worker struct TestParams {
314*9356374aSAndroid Build Coastguard Worker   static constexpr Movable kMovability = Movability;
315*9356374aSAndroid Build Coastguard Worker   static constexpr Destructible kDestructibility = Destructibility;
316*9356374aSAndroid Build Coastguard Worker   using Qualifiers = Qual;
317*9356374aSAndroid Build Coastguard Worker   static constexpr NothrowCall kCallExceptionSpec = CallExceptionSpec;
318*9356374aSAndroid Build Coastguard Worker   static constexpr bool kIsNoexcept = kCallExceptionSpec == NothrowCall::yes;
319*9356374aSAndroid Build Coastguard Worker   static constexpr bool kIsRvalueQualified =
320*9356374aSAndroid Build Coastguard Worker       std::is_rvalue_reference<Qual>::value;
321*9356374aSAndroid Build Coastguard Worker   static constexpr ObjSize kSize = Size;
322*9356374aSAndroid Build Coastguard Worker   static constexpr ObjAlign kAlignment = Alignment;
323*9356374aSAndroid Build Coastguard Worker 
324*9356374aSAndroid Build Coastguard Worker   // These types are used when testing with member object pointer Invocables
325*9356374aSAndroid Build Coastguard Worker   using UnqualifiedUnaryFunType = int(Int const&&)
326*9356374aSAndroid Build Coastguard Worker       ABSL_INTERNAL_NOEXCEPT_SPEC(CallExceptionSpec == NothrowCall::yes);
327*9356374aSAndroid Build Coastguard Worker   using UnaryFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedUnaryFunType>;
328*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = int(Int::*);
329*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = AnyInvocable<UnaryFunType>;
330*9356374aSAndroid Build Coastguard Worker   using UnaryThisParamType = QualifiersForThis<Qualifiers, UnaryAnyInvType>;
331*9356374aSAndroid Build Coastguard Worker 
332*9356374aSAndroid Build Coastguard Worker   template <class T>
ToUnaryThisParam__anon5a17cb360111::TestParams333*9356374aSAndroid Build Coastguard Worker   static UnaryThisParamType ToUnaryThisParam(T&& fun) {
334*9356374aSAndroid Build Coastguard Worker     return static_cast<UnaryThisParamType>(fun);
335*9356374aSAndroid Build Coastguard Worker   }
336*9356374aSAndroid Build Coastguard Worker 
337*9356374aSAndroid Build Coastguard Worker   // This function type intentionally uses 3 "kinds" of parameter types.
338*9356374aSAndroid Build Coastguard Worker   //     - A user-defined type
339*9356374aSAndroid Build Coastguard Worker   //     - A reference type
340*9356374aSAndroid Build Coastguard Worker   //     - A scalar type
341*9356374aSAndroid Build Coastguard Worker   //
342*9356374aSAndroid Build Coastguard Worker   // These were chosen because internal forwarding takes place on parameters
343*9356374aSAndroid Build Coastguard Worker   // differently depending based on type properties (scalars are forwarded by
344*9356374aSAndroid Build Coastguard Worker   // value).
345*9356374aSAndroid Build Coastguard Worker   using ResultType = Int;
346*9356374aSAndroid Build Coastguard Worker   using AnyInvocableFunTypeNotNoexcept = Int(Int, const int&, int);
347*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType =
348*9356374aSAndroid Build Coastguard Worker       typename std::conditional<kIsNoexcept, Int(Int, const int&, int) noexcept,
349*9356374aSAndroid Build Coastguard Worker                                 Int(Int, const int&, int)>::type;
350*9356374aSAndroid Build Coastguard Worker   using FunType = GiveQualifiersToFun<Qualifiers, UnqualifiedFunType>;
351*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType =
352*9356374aSAndroid Build Coastguard Worker       typename std::conditional<kIsNoexcept,
353*9356374aSAndroid Build Coastguard Worker                                 Int (Int::*)(const int&, int) noexcept,
354*9356374aSAndroid Build Coastguard Worker                                 Int (Int::*)(const int&, int)>::type;
355*9356374aSAndroid Build Coastguard Worker   using AnyInvType = AnyInvocable<FunType>;
356*9356374aSAndroid Build Coastguard Worker   using AddType = add<kMovability, kDestructibility, Qualifiers,
357*9356374aSAndroid Build Coastguard Worker                       kCallExceptionSpec, kSize, kAlignment>;
358*9356374aSAndroid Build Coastguard Worker   using ThisParamType = QualifiersForThis<Qualifiers, AnyInvType>;
359*9356374aSAndroid Build Coastguard Worker 
360*9356374aSAndroid Build Coastguard Worker   template <class T>
ToThisParam__anon5a17cb360111::TestParams361*9356374aSAndroid Build Coastguard Worker   static ThisParamType ToThisParam(T&& fun) {
362*9356374aSAndroid Build Coastguard Worker     return static_cast<ThisParamType>(fun);
363*9356374aSAndroid Build Coastguard Worker   }
364*9356374aSAndroid Build Coastguard Worker 
365*9356374aSAndroid Build Coastguard Worker   // These typedefs are used when testing void return type covariance.
366*9356374aSAndroid Build Coastguard Worker   using UnqualifiedVoidFunType =
367*9356374aSAndroid Build Coastguard Worker       typename std::conditional<kIsNoexcept,
368*9356374aSAndroid Build Coastguard Worker                                 void(Int, const int&, int) noexcept,
369*9356374aSAndroid Build Coastguard Worker                                 void(Int, const int&, int)>::type;
370*9356374aSAndroid Build Coastguard Worker   using VoidFunType = GiveQualifiersToFun<Qualifiers, UnqualifiedVoidFunType>;
371*9356374aSAndroid Build Coastguard Worker   using VoidAnyInvType = AnyInvocable<VoidFunType>;
372*9356374aSAndroid Build Coastguard Worker   using VoidThisParamType = QualifiersForThis<Qualifiers, VoidAnyInvType>;
373*9356374aSAndroid Build Coastguard Worker 
374*9356374aSAndroid Build Coastguard Worker   template <class T>
ToVoidThisParam__anon5a17cb360111::TestParams375*9356374aSAndroid Build Coastguard Worker   static VoidThisParamType ToVoidThisParam(T&& fun) {
376*9356374aSAndroid Build Coastguard Worker     return static_cast<VoidThisParamType>(fun);
377*9356374aSAndroid Build Coastguard Worker   }
378*9356374aSAndroid Build Coastguard Worker 
379*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvocableFunType =
380*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_rvalue_reference<Qual>::value,
381*9356374aSAndroid Build Coastguard Worker                           GiveQualifiersToFun<const _&&, UnqualifiedFunType>,
382*9356374aSAndroid Build Coastguard Worker                           GiveQualifiersToFun<const _&, UnqualifiedFunType>>;
383*9356374aSAndroid Build Coastguard Worker 
384*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = AnyInvocable<CompatibleAnyInvocableFunType>;
385*9356374aSAndroid Build Coastguard Worker 
386*9356374aSAndroid Build Coastguard Worker   using IncompatibleInvocable =
387*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<std::is_rvalue_reference<Qual>::value,
388*9356374aSAndroid Build Coastguard Worker                           GiveQualifiersToFun<_&, UnqualifiedFunType>(_::*),
389*9356374aSAndroid Build Coastguard Worker                           GiveQualifiersToFun<_&&, UnqualifiedFunType>(_::*)>;
390*9356374aSAndroid Build Coastguard Worker };
391*9356374aSAndroid Build Coastguard Worker 
392*9356374aSAndroid Build Coastguard Worker // Given a member-pointer type, this metafunction yields the target type of the
393*9356374aSAndroid Build Coastguard Worker // pointer, not including the class-type. It is used to verify that the function
394*9356374aSAndroid Build Coastguard Worker // call operator of AnyInvocable has the proper signature, corresponding to the
395*9356374aSAndroid Build Coastguard Worker // function type that the user provided.
396*9356374aSAndroid Build Coastguard Worker template <class MemberPtrType>
397*9356374aSAndroid Build Coastguard Worker struct MemberTypeOfImpl;
398*9356374aSAndroid Build Coastguard Worker 
399*9356374aSAndroid Build Coastguard Worker template <class Class, class T>
400*9356374aSAndroid Build Coastguard Worker struct MemberTypeOfImpl<T(Class::*)> {
401*9356374aSAndroid Build Coastguard Worker   using type = T;
402*9356374aSAndroid Build Coastguard Worker };
403*9356374aSAndroid Build Coastguard Worker 
404*9356374aSAndroid Build Coastguard Worker template <class MemberPtrType>
405*9356374aSAndroid Build Coastguard Worker using MemberTypeOf = typename MemberTypeOfImpl<MemberPtrType>::type;
406*9356374aSAndroid Build Coastguard Worker 
407*9356374aSAndroid Build Coastguard Worker template <class T, class = void>
408*9356374aSAndroid Build Coastguard Worker struct IsMemberSwappableImpl : std::false_type {
409*9356374aSAndroid Build Coastguard Worker   static constexpr bool kIsNothrow = false;
410*9356374aSAndroid Build Coastguard Worker };
411*9356374aSAndroid Build Coastguard Worker 
412*9356374aSAndroid Build Coastguard Worker template <class T>
413*9356374aSAndroid Build Coastguard Worker struct IsMemberSwappableImpl<
414*9356374aSAndroid Build Coastguard Worker     T, absl::void_t<decltype(std::declval<T&>().swap(std::declval<T&>()))>>
415*9356374aSAndroid Build Coastguard Worker     : std::true_type {
416*9356374aSAndroid Build Coastguard Worker   static constexpr bool kIsNothrow =
417*9356374aSAndroid Build Coastguard Worker       noexcept(std::declval<T&>().swap(std::declval<T&>()));
418*9356374aSAndroid Build Coastguard Worker };
419*9356374aSAndroid Build Coastguard Worker 
420*9356374aSAndroid Build Coastguard Worker template <class T>
421*9356374aSAndroid Build Coastguard Worker using IsMemberSwappable = IsMemberSwappableImpl<T>;
422*9356374aSAndroid Build Coastguard Worker 
423*9356374aSAndroid Build Coastguard Worker template <class T>
424*9356374aSAndroid Build Coastguard Worker using IsNothrowMemberSwappable =
425*9356374aSAndroid Build Coastguard Worker     std::integral_constant<bool, IsMemberSwappableImpl<T>::kIsNothrow>;
426*9356374aSAndroid Build Coastguard Worker 
427*9356374aSAndroid Build Coastguard Worker template <class T>
428*9356374aSAndroid Build Coastguard Worker class AnyInvTestBasic : public ::testing::Test {};
429*9356374aSAndroid Build Coastguard Worker 
430*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestBasic);
431*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,DefaultConstruction)432*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, DefaultConstruction) {
433*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
434*9356374aSAndroid Build Coastguard Worker 
435*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
436*9356374aSAndroid Build Coastguard Worker 
437*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
438*9356374aSAndroid Build Coastguard Worker 
439*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_nothrow_default_constructible<AnyInvType>::value);
440*9356374aSAndroid Build Coastguard Worker }
441*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionNullptr)442*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionNullptr) {
443*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
444*9356374aSAndroid Build Coastguard Worker 
445*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = nullptr;
446*9356374aSAndroid Build Coastguard Worker 
447*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
448*9356374aSAndroid Build Coastguard Worker 
449*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
450*9356374aSAndroid Build Coastguard Worker       (std::is_nothrow_constructible<AnyInvType, std::nullptr_t>::value));
451*9356374aSAndroid Build Coastguard Worker }
452*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionNullFunctionPtr)453*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionNullFunctionPtr) {
454*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
455*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
456*9356374aSAndroid Build Coastguard Worker 
457*9356374aSAndroid Build Coastguard Worker   UnqualifiedFunType* const null_fun_ptr = nullptr;
458*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = null_fun_ptr;
459*9356374aSAndroid Build Coastguard Worker 
460*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
461*9356374aSAndroid Build Coastguard Worker }
462*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionNullMemberFunctionPtr)463*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberFunctionPtr) {
464*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
465*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType = typename TypeParam::MemFunPtrType;
466*9356374aSAndroid Build Coastguard Worker 
467*9356374aSAndroid Build Coastguard Worker   const MemFunPtrType null_mem_fun_ptr = nullptr;
468*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = null_mem_fun_ptr;
469*9356374aSAndroid Build Coastguard Worker 
470*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
471*9356374aSAndroid Build Coastguard Worker }
472*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionNullMemberObjectPtr)473*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionNullMemberObjectPtr) {
474*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
475*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = typename TypeParam::MemObjPtrType;
476*9356374aSAndroid Build Coastguard Worker 
477*9356374aSAndroid Build Coastguard Worker   const MemObjPtrType null_mem_obj_ptr = nullptr;
478*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun = null_mem_obj_ptr;
479*9356374aSAndroid Build Coastguard Worker 
480*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
481*9356374aSAndroid Build Coastguard Worker }
482*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionMemberFunctionPtr)483*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberFunctionPtr) {
484*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
485*9356374aSAndroid Build Coastguard Worker 
486*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &Int::MemberFunctionAdd;
487*9356374aSAndroid Build Coastguard Worker 
488*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
489*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
490*9356374aSAndroid Build Coastguard Worker }
491*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionMemberObjectPtr)492*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionMemberObjectPtr) {
493*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
494*9356374aSAndroid Build Coastguard Worker 
495*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun = &Int::value;
496*9356374aSAndroid Build Coastguard Worker 
497*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
498*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
499*9356374aSAndroid Build Coastguard Worker }
500*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionFunctionReferenceDecay)501*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionFunctionReferenceDecay) {
502*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
503*9356374aSAndroid Build Coastguard Worker 
504*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = add_function;
505*9356374aSAndroid Build Coastguard Worker 
506*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
507*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
508*9356374aSAndroid Build Coastguard Worker }
509*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionCompatibleAnyInvocableEmpty)510*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableEmpty) {
511*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
512*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
513*9356374aSAndroid Build Coastguard Worker 
514*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other;
515*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = std::move(other);
516*9356374aSAndroid Build Coastguard Worker 
517*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
518*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(other, nullptr);               // NOLINT
519*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, other);               // NOLINT
520*9356374aSAndroid Build Coastguard Worker 
521*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
522*9356374aSAndroid Build Coastguard Worker }
523*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConstructionCompatibleAnyInvocableNonempty)524*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConstructionCompatibleAnyInvocableNonempty) {
525*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
526*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
527*9356374aSAndroid Build Coastguard Worker 
528*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other = &add_function;
529*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = std::move(other);
530*9356374aSAndroid Build Coastguard Worker 
531*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
532*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(other, nullptr);               // NOLINT
533*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, other);               // NOLINT
534*9356374aSAndroid Build Coastguard Worker 
535*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
536*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
537*9356374aSAndroid Build Coastguard Worker }
538*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ConversionToBool)539*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ConversionToBool) {
540*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
541*9356374aSAndroid Build Coastguard Worker 
542*9356374aSAndroid Build Coastguard Worker   {
543*9356374aSAndroid Build Coastguard Worker     AnyInvType fun;
544*9356374aSAndroid Build Coastguard Worker 
545*9356374aSAndroid Build Coastguard Worker     // This tests contextually-convertible-to-bool.
546*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(fun ? true : false);  // NOLINT
547*9356374aSAndroid Build Coastguard Worker 
548*9356374aSAndroid Build Coastguard Worker     // Make sure that the conversion is not implicit.
549*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(
550*9356374aSAndroid Build Coastguard Worker         (std::is_nothrow_constructible<bool, const AnyInvType&>::value));
551*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE((std::is_convertible<const AnyInvType&, bool>::value));
552*9356374aSAndroid Build Coastguard Worker   }
553*9356374aSAndroid Build Coastguard Worker 
554*9356374aSAndroid Build Coastguard Worker   {
555*9356374aSAndroid Build Coastguard Worker     AnyInvType fun = &add_function;
556*9356374aSAndroid Build Coastguard Worker 
557*9356374aSAndroid Build Coastguard Worker     // This tests contextually-convertible-to-bool.
558*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(fun ? true : false);  // NOLINT
559*9356374aSAndroid Build Coastguard Worker   }
560*9356374aSAndroid Build Coastguard Worker }
561*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,Invocation)562*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, Invocation) {
563*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
564*9356374aSAndroid Build Coastguard Worker 
565*9356374aSAndroid Build Coastguard Worker   using FunType = typename TypeParam::FunType;
566*9356374aSAndroid Build Coastguard Worker   using AnyInvCallType = MemberTypeOf<decltype(&AnyInvType::operator())>;
567*9356374aSAndroid Build Coastguard Worker 
568*9356374aSAndroid Build Coastguard Worker   // Make sure the function call operator of AnyInvocable always has the
569*9356374aSAndroid Build Coastguard Worker   // type that was specified via the template argument.
570*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<AnyInvCallType, FunType>::value));
571*9356374aSAndroid Build Coastguard Worker 
572*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &add_function;
573*9356374aSAndroid Build Coastguard Worker 
574*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
575*9356374aSAndroid Build Coastguard Worker }
576*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceConstruction)577*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceConstruction) {
578*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
579*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
580*9356374aSAndroid Build Coastguard Worker 
581*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, 5);
582*9356374aSAndroid Build Coastguard Worker 
583*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
584*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
585*9356374aSAndroid Build Coastguard Worker }
586*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceConstructionInitializerList)587*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceConstructionInitializerList) {
588*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
589*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
590*9356374aSAndroid Build Coastguard Worker 
591*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, {1, 2, 3, 4}, 5);
592*9356374aSAndroid Build Coastguard Worker 
593*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
594*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(39, TypeParam::ToThisParam(fun)(7, 8, 9).value);
595*9356374aSAndroid Build Coastguard Worker }
596*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullFunPtrConstruction)597*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstruction) {
598*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
599*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
600*9356374aSAndroid Build Coastguard Worker 
601*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>, nullptr);
602*9356374aSAndroid Build Coastguard Worker 
603*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
604*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
605*9356374aSAndroid Build Coastguard Worker }
606*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullFunPtrConstructionValueInit)607*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullFunPtrConstructionValueInit) {
608*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
609*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
610*9356374aSAndroid Build Coastguard Worker 
611*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<UnqualifiedFunType*>);
612*9356374aSAndroid Build Coastguard Worker 
613*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
614*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
615*9356374aSAndroid Build Coastguard Worker }
616*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullMemFunPtrConstruction)617*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstruction) {
618*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
619*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType = typename TypeParam::MemFunPtrType;
620*9356374aSAndroid Build Coastguard Worker 
621*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<MemFunPtrType>, nullptr);
622*9356374aSAndroid Build Coastguard Worker 
623*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
624*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
625*9356374aSAndroid Build Coastguard Worker }
626*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullMemFunPtrConstructionValueInit)627*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemFunPtrConstructionValueInit) {
628*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
629*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType = typename TypeParam::MemFunPtrType;
630*9356374aSAndroid Build Coastguard Worker 
631*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<MemFunPtrType>);
632*9356374aSAndroid Build Coastguard Worker 
633*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
634*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
635*9356374aSAndroid Build Coastguard Worker }
636*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullMemObjPtrConstruction)637*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstruction) {
638*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
639*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = typename TypeParam::MemObjPtrType;
640*9356374aSAndroid Build Coastguard Worker 
641*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>, nullptr);
642*9356374aSAndroid Build Coastguard Worker 
643*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
644*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
645*9356374aSAndroid Build Coastguard Worker }
646*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceNullMemObjPtrConstructionValueInit)647*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceNullMemObjPtrConstructionValueInit) {
648*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
649*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = typename TypeParam::MemObjPtrType;
650*9356374aSAndroid Build Coastguard Worker 
651*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun(absl::in_place_type<MemObjPtrType>);
652*9356374aSAndroid Build Coastguard Worker 
653*9356374aSAndroid Build Coastguard Worker   // In-place construction does not lead to empty.
654*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
655*9356374aSAndroid Build Coastguard Worker }
656*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,InPlaceVoidCovarianceConstruction)657*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, InPlaceVoidCovarianceConstruction) {
658*9356374aSAndroid Build Coastguard Worker   using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
659*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
660*9356374aSAndroid Build Coastguard Worker 
661*9356374aSAndroid Build Coastguard Worker   VoidAnyInvType fun(absl::in_place_type<AddType>, 5);
662*9356374aSAndroid Build Coastguard Worker 
663*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
664*9356374aSAndroid Build Coastguard Worker }
665*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,MoveConstructionFromEmpty)666*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromEmpty) {
667*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
668*9356374aSAndroid Build Coastguard Worker 
669*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun;
670*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(std::move(source_fun));
671*9356374aSAndroid Build Coastguard Worker 
672*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
673*9356374aSAndroid Build Coastguard Worker 
674*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value);
675*9356374aSAndroid Build Coastguard Worker }
676*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,MoveConstructionFromNonEmpty)677*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, MoveConstructionFromNonEmpty) {
678*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
679*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
680*9356374aSAndroid Build Coastguard Worker 
681*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun(absl::in_place_type<AddType>, 5);
682*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(std::move(source_fun));
683*9356374aSAndroid Build Coastguard Worker 
684*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
685*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
686*9356374aSAndroid Build Coastguard Worker 
687*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(std::is_nothrow_move_constructible<AnyInvType>::value);
688*9356374aSAndroid Build Coastguard Worker }
689*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ComparisonWithNullptrEmpty)690*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrEmpty) {
691*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
692*9356374aSAndroid Build Coastguard Worker 
693*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
694*9356374aSAndroid Build Coastguard Worker 
695*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(fun == nullptr);
696*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(nullptr == fun);
697*9356374aSAndroid Build Coastguard Worker 
698*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(fun != nullptr);
699*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(nullptr != fun);
700*9356374aSAndroid Build Coastguard Worker }
701*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ComparisonWithNullptrNonempty)702*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ComparisonWithNullptrNonempty) {
703*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
704*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
705*9356374aSAndroid Build Coastguard Worker 
706*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, 5);
707*9356374aSAndroid Build Coastguard Worker 
708*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(fun == nullptr);
709*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(nullptr == fun);
710*9356374aSAndroid Build Coastguard Worker 
711*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(fun != nullptr);
712*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(nullptr != fun);
713*9356374aSAndroid Build Coastguard Worker }
714*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestBasic,ResultType)715*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestBasic, ResultType) {
716*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
717*9356374aSAndroid Build Coastguard Worker   using ExpectedResultType = typename TypeParam::ResultType;
718*9356374aSAndroid Build Coastguard Worker 
719*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_same<typename AnyInvType::result_type,
720*9356374aSAndroid Build Coastguard Worker                             ExpectedResultType>::value));
721*9356374aSAndroid Build Coastguard Worker }
722*9356374aSAndroid Build Coastguard Worker 
723*9356374aSAndroid Build Coastguard Worker template <class T>
724*9356374aSAndroid Build Coastguard Worker class AnyInvTestCombinatoric : public ::testing::Test {};
725*9356374aSAndroid Build Coastguard Worker 
726*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestCombinatoric);
727*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,MoveAssignEmptyEmptyLhsRhs)728*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs) {
729*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
730*9356374aSAndroid Build Coastguard Worker 
731*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun;
732*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
733*9356374aSAndroid Build Coastguard Worker 
734*9356374aSAndroid Build Coastguard Worker   fun = std::move(source_fun);
735*9356374aSAndroid Build Coastguard Worker 
736*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
737*9356374aSAndroid Build Coastguard Worker }
738*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,MoveAssignEmptyLhsNonemptyRhs)739*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignEmptyLhsNonemptyRhs) {
740*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
741*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
742*9356374aSAndroid Build Coastguard Worker 
743*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun(absl::in_place_type<AddType>, 5);
744*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
745*9356374aSAndroid Build Coastguard Worker 
746*9356374aSAndroid Build Coastguard Worker   fun = std::move(source_fun);
747*9356374aSAndroid Build Coastguard Worker 
748*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
749*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
750*9356374aSAndroid Build Coastguard Worker }
751*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,MoveAssignNonemptyEmptyLhsRhs)752*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyEmptyLhsRhs) {
753*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
754*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
755*9356374aSAndroid Build Coastguard Worker 
756*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun;
757*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, 5);
758*9356374aSAndroid Build Coastguard Worker 
759*9356374aSAndroid Build Coastguard Worker   fun = std::move(source_fun);
760*9356374aSAndroid Build Coastguard Worker 
761*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
762*9356374aSAndroid Build Coastguard Worker }
763*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,MoveAssignNonemptyLhsNonemptyRhs)764*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, MoveAssignNonemptyLhsNonemptyRhs) {
765*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
766*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
767*9356374aSAndroid Build Coastguard Worker 
768*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun(absl::in_place_type<AddType>, 5);
769*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, 20);
770*9356374aSAndroid Build Coastguard Worker 
771*9356374aSAndroid Build Coastguard Worker   fun = std::move(source_fun);
772*9356374aSAndroid Build Coastguard Worker 
773*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
774*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
775*9356374aSAndroid Build Coastguard Worker }
776*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SelfMoveAssignEmpty)777*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignEmpty) {
778*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
779*9356374aSAndroid Build Coastguard Worker 
780*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun;
781*9356374aSAndroid Build Coastguard Worker   source_fun = std::move(source_fun);
782*9356374aSAndroid Build Coastguard Worker 
783*9356374aSAndroid Build Coastguard Worker   // This space intentionally left blank.
784*9356374aSAndroid Build Coastguard Worker }
785*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SelfMoveAssignNonempty)786*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SelfMoveAssignNonempty) {
787*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
788*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
789*9356374aSAndroid Build Coastguard Worker 
790*9356374aSAndroid Build Coastguard Worker   AnyInvType source_fun(absl::in_place_type<AddType>, 5);
791*9356374aSAndroid Build Coastguard Worker   source_fun = std::move(source_fun);
792*9356374aSAndroid Build Coastguard Worker 
793*9356374aSAndroid Build Coastguard Worker   // This space intentionally left blank.
794*9356374aSAndroid Build Coastguard Worker }
795*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullptrEmptyLhs)796*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrEmptyLhs) {
797*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
798*9356374aSAndroid Build Coastguard Worker 
799*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
800*9356374aSAndroid Build Coastguard Worker   fun = nullptr;
801*9356374aSAndroid Build Coastguard Worker 
802*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
803*9356374aSAndroid Build Coastguard Worker }
804*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullFunctionPtrEmptyLhs)805*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrEmptyLhs) {
806*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
807*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
808*9356374aSAndroid Build Coastguard Worker 
809*9356374aSAndroid Build Coastguard Worker   UnqualifiedFunType* const null_fun_ptr = nullptr;
810*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
811*9356374aSAndroid Build Coastguard Worker   fun = null_fun_ptr;
812*9356374aSAndroid Build Coastguard Worker 
813*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
814*9356374aSAndroid Build Coastguard Worker }
815*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullMemberFunctionPtrEmptyLhs)816*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrEmptyLhs) {
817*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
818*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType = typename TypeParam::MemFunPtrType;
819*9356374aSAndroid Build Coastguard Worker 
820*9356374aSAndroid Build Coastguard Worker   const MemFunPtrType null_mem_fun_ptr = nullptr;
821*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
822*9356374aSAndroid Build Coastguard Worker   fun = null_mem_fun_ptr;
823*9356374aSAndroid Build Coastguard Worker 
824*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
825*9356374aSAndroid Build Coastguard Worker }
826*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullMemberObjectPtrEmptyLhs)827*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrEmptyLhs) {
828*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
829*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = typename TypeParam::MemObjPtrType;
830*9356374aSAndroid Build Coastguard Worker 
831*9356374aSAndroid Build Coastguard Worker   const MemObjPtrType null_mem_obj_ptr = nullptr;
832*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun;
833*9356374aSAndroid Build Coastguard Worker   fun = null_mem_obj_ptr;
834*9356374aSAndroid Build Coastguard Worker 
835*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
836*9356374aSAndroid Build Coastguard Worker }
837*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignMemberFunctionPtrEmptyLhs)838*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrEmptyLhs) {
839*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
840*9356374aSAndroid Build Coastguard Worker 
841*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
842*9356374aSAndroid Build Coastguard Worker   fun = &Int::MemberFunctionAdd;
843*9356374aSAndroid Build Coastguard Worker 
844*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
845*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
846*9356374aSAndroid Build Coastguard Worker }
847*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignMemberObjectPtrEmptyLhs)848*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrEmptyLhs) {
849*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
850*9356374aSAndroid Build Coastguard Worker 
851*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun;
852*9356374aSAndroid Build Coastguard Worker   fun = &Int::value;
853*9356374aSAndroid Build Coastguard Worker 
854*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
855*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
856*9356374aSAndroid Build Coastguard Worker }
857*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignFunctionReferenceDecayEmptyLhs)858*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayEmptyLhs) {
859*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
860*9356374aSAndroid Build Coastguard Worker 
861*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
862*9356374aSAndroid Build Coastguard Worker   fun = add_function;
863*9356374aSAndroid Build Coastguard Worker 
864*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
865*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
866*9356374aSAndroid Build Coastguard Worker }
867*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignCompatibleAnyInvocableEmptyLhsEmptyRhs)868*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric,
869*9356374aSAndroid Build Coastguard Worker              AssignCompatibleAnyInvocableEmptyLhsEmptyRhs) {
870*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
871*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
872*9356374aSAndroid Build Coastguard Worker 
873*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other;
874*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
875*9356374aSAndroid Build Coastguard Worker   fun = std::move(other);
876*9356374aSAndroid Build Coastguard Worker 
877*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
878*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(other, nullptr);               // NOLINT
879*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, other);               // NOLINT
880*9356374aSAndroid Build Coastguard Worker 
881*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
882*9356374aSAndroid Build Coastguard Worker }
883*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs)884*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric,
885*9356374aSAndroid Build Coastguard Worker              AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs) {
886*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
887*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
888*9356374aSAndroid Build Coastguard Worker 
889*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other = &add_function;
890*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
891*9356374aSAndroid Build Coastguard Worker   fun = std::move(other);
892*9356374aSAndroid Build Coastguard Worker 
893*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
894*9356374aSAndroid Build Coastguard Worker 
895*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
896*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
897*9356374aSAndroid Build Coastguard Worker }
898*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullptrNonemptyLhs)899*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullptrNonemptyLhs) {
900*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
901*9356374aSAndroid Build Coastguard Worker 
902*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
903*9356374aSAndroid Build Coastguard Worker   fun = nullptr;
904*9356374aSAndroid Build Coastguard Worker 
905*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
906*9356374aSAndroid Build Coastguard Worker }
907*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullFunctionPtrNonemptyLhs)908*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullFunctionPtrNonemptyLhs) {
909*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
910*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFunType = typename TypeParam::UnqualifiedFunType;
911*9356374aSAndroid Build Coastguard Worker 
912*9356374aSAndroid Build Coastguard Worker   UnqualifiedFunType* const null_fun_ptr = nullptr;
913*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
914*9356374aSAndroid Build Coastguard Worker   fun = null_fun_ptr;
915*9356374aSAndroid Build Coastguard Worker 
916*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
917*9356374aSAndroid Build Coastguard Worker }
918*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullMemberFunctionPtrNonemptyLhs)919*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberFunctionPtrNonemptyLhs) {
920*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
921*9356374aSAndroid Build Coastguard Worker   using MemFunPtrType = typename TypeParam::MemFunPtrType;
922*9356374aSAndroid Build Coastguard Worker 
923*9356374aSAndroid Build Coastguard Worker   const MemFunPtrType null_mem_fun_ptr = nullptr;
924*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
925*9356374aSAndroid Build Coastguard Worker   fun = null_mem_fun_ptr;
926*9356374aSAndroid Build Coastguard Worker 
927*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
928*9356374aSAndroid Build Coastguard Worker }
929*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignNullMemberObjectPtrNonemptyLhs)930*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignNullMemberObjectPtrNonemptyLhs) {
931*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
932*9356374aSAndroid Build Coastguard Worker   using MemObjPtrType = typename TypeParam::MemObjPtrType;
933*9356374aSAndroid Build Coastguard Worker 
934*9356374aSAndroid Build Coastguard Worker   const MemObjPtrType null_mem_obj_ptr = nullptr;
935*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun = &square_function;
936*9356374aSAndroid Build Coastguard Worker   fun = null_mem_obj_ptr;
937*9356374aSAndroid Build Coastguard Worker 
938*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
939*9356374aSAndroid Build Coastguard Worker }
940*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignMemberFunctionPtrNonemptyLhs)941*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberFunctionPtrNonemptyLhs) {
942*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
943*9356374aSAndroid Build Coastguard Worker 
944*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
945*9356374aSAndroid Build Coastguard Worker   fun = &Int::MemberFunctionAdd;
946*9356374aSAndroid Build Coastguard Worker 
947*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
948*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
949*9356374aSAndroid Build Coastguard Worker }
950*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignMemberObjectPtrNonemptyLhs)951*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignMemberObjectPtrNonemptyLhs) {
952*9356374aSAndroid Build Coastguard Worker   using UnaryAnyInvType = typename TypeParam::UnaryAnyInvType;
953*9356374aSAndroid Build Coastguard Worker 
954*9356374aSAndroid Build Coastguard Worker   UnaryAnyInvType fun = &square_function;
955*9356374aSAndroid Build Coastguard Worker   fun = &Int::value;
956*9356374aSAndroid Build Coastguard Worker 
957*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
958*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(13, TypeParam::ToUnaryThisParam(fun)(13));
959*9356374aSAndroid Build Coastguard Worker }
960*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignFunctionReferenceDecayNonemptyLhs)961*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, AssignFunctionReferenceDecayNonemptyLhs) {
962*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
963*9356374aSAndroid Build Coastguard Worker 
964*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
965*9356374aSAndroid Build Coastguard Worker   fun = add_function;
966*9356374aSAndroid Build Coastguard Worker 
967*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
968*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
969*9356374aSAndroid Build Coastguard Worker }
970*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs)971*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric,
972*9356374aSAndroid Build Coastguard Worker              AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs) {
973*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
974*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
975*9356374aSAndroid Build Coastguard Worker 
976*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other;
977*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
978*9356374aSAndroid Build Coastguard Worker   fun = std::move(other);
979*9356374aSAndroid Build Coastguard Worker 
980*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
981*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(other, nullptr);               // NOLINT
982*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(nullptr, other);               // NOLINT
983*9356374aSAndroid Build Coastguard Worker 
984*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(fun));
985*9356374aSAndroid Build Coastguard Worker }
986*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs)987*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric,
988*9356374aSAndroid Build Coastguard Worker              AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs) {
989*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
990*9356374aSAndroid Build Coastguard Worker   using CompatibleAnyInvType = typename TypeParam::CompatibleAnyInvType;
991*9356374aSAndroid Build Coastguard Worker 
992*9356374aSAndroid Build Coastguard Worker   CompatibleAnyInvType other = &add_function;
993*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
994*9356374aSAndroid Build Coastguard Worker   fun = std::move(other);
995*9356374aSAndroid Build Coastguard Worker 
996*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(static_cast<bool>(other));  // NOLINT
997*9356374aSAndroid Build Coastguard Worker 
998*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
999*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(24, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1000*9356374aSAndroid Build Coastguard Worker }
1001*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SwapEmptyLhsEmptyRhs)1002*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsEmptyRhs) {
1003*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1004*9356374aSAndroid Build Coastguard Worker 
1005*9356374aSAndroid Build Coastguard Worker   // Swap idiom
1006*9356374aSAndroid Build Coastguard Worker   {
1007*9356374aSAndroid Build Coastguard Worker     AnyInvType fun;
1008*9356374aSAndroid Build Coastguard Worker     AnyInvType other;
1009*9356374aSAndroid Build Coastguard Worker 
1010*9356374aSAndroid Build Coastguard Worker     using std::swap;
1011*9356374aSAndroid Build Coastguard Worker     swap(fun, other);
1012*9356374aSAndroid Build Coastguard Worker 
1013*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(fun));
1014*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(other));
1015*9356374aSAndroid Build Coastguard Worker 
1016*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(
1017*9356374aSAndroid Build Coastguard Worker         absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
1018*9356374aSAndroid Build Coastguard Worker   }
1019*9356374aSAndroid Build Coastguard Worker 
1020*9356374aSAndroid Build Coastguard Worker   // Member swap
1021*9356374aSAndroid Build Coastguard Worker   {
1022*9356374aSAndroid Build Coastguard Worker     AnyInvType fun;
1023*9356374aSAndroid Build Coastguard Worker     AnyInvType other;
1024*9356374aSAndroid Build Coastguard Worker 
1025*9356374aSAndroid Build Coastguard Worker     fun.swap(other);
1026*9356374aSAndroid Build Coastguard Worker 
1027*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(fun));
1028*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(other));
1029*9356374aSAndroid Build Coastguard Worker 
1030*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
1031*9356374aSAndroid Build Coastguard Worker   }
1032*9356374aSAndroid Build Coastguard Worker }
1033*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SwapEmptyLhsNonemptyRhs)1034*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SwapEmptyLhsNonemptyRhs) {
1035*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1036*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1037*9356374aSAndroid Build Coastguard Worker 
1038*9356374aSAndroid Build Coastguard Worker   // Swap idiom
1039*9356374aSAndroid Build Coastguard Worker   {
1040*9356374aSAndroid Build Coastguard Worker     AnyInvType fun;
1041*9356374aSAndroid Build Coastguard Worker     AnyInvType other(absl::in_place_type<AddType>, 5);
1042*9356374aSAndroid Build Coastguard Worker 
1043*9356374aSAndroid Build Coastguard Worker     using std::swap;
1044*9356374aSAndroid Build Coastguard Worker     swap(fun, other);
1045*9356374aSAndroid Build Coastguard Worker 
1046*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(fun));
1047*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(other));
1048*9356374aSAndroid Build Coastguard Worker 
1049*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1050*9356374aSAndroid Build Coastguard Worker 
1051*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(
1052*9356374aSAndroid Build Coastguard Worker         absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
1053*9356374aSAndroid Build Coastguard Worker   }
1054*9356374aSAndroid Build Coastguard Worker 
1055*9356374aSAndroid Build Coastguard Worker   // Member swap
1056*9356374aSAndroid Build Coastguard Worker   {
1057*9356374aSAndroid Build Coastguard Worker     AnyInvType fun;
1058*9356374aSAndroid Build Coastguard Worker     AnyInvType other(absl::in_place_type<AddType>, 5);
1059*9356374aSAndroid Build Coastguard Worker 
1060*9356374aSAndroid Build Coastguard Worker     fun.swap(other);
1061*9356374aSAndroid Build Coastguard Worker 
1062*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(fun));
1063*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(other));
1064*9356374aSAndroid Build Coastguard Worker 
1065*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1066*9356374aSAndroid Build Coastguard Worker 
1067*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
1068*9356374aSAndroid Build Coastguard Worker   }
1069*9356374aSAndroid Build Coastguard Worker }
1070*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SwapNonemptyLhsEmptyRhs)1071*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsEmptyRhs) {
1072*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1073*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1074*9356374aSAndroid Build Coastguard Worker 
1075*9356374aSAndroid Build Coastguard Worker   // Swap idiom
1076*9356374aSAndroid Build Coastguard Worker   {
1077*9356374aSAndroid Build Coastguard Worker     AnyInvType fun(absl::in_place_type<AddType>, 5);
1078*9356374aSAndroid Build Coastguard Worker     AnyInvType other;
1079*9356374aSAndroid Build Coastguard Worker 
1080*9356374aSAndroid Build Coastguard Worker     using std::swap;
1081*9356374aSAndroid Build Coastguard Worker     swap(fun, other);
1082*9356374aSAndroid Build Coastguard Worker 
1083*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(fun));
1084*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(other));
1085*9356374aSAndroid Build Coastguard Worker 
1086*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
1087*9356374aSAndroid Build Coastguard Worker 
1088*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(
1089*9356374aSAndroid Build Coastguard Worker         absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
1090*9356374aSAndroid Build Coastguard Worker   }
1091*9356374aSAndroid Build Coastguard Worker 
1092*9356374aSAndroid Build Coastguard Worker   // Member swap
1093*9356374aSAndroid Build Coastguard Worker   {
1094*9356374aSAndroid Build Coastguard Worker     AnyInvType fun(absl::in_place_type<AddType>, 5);
1095*9356374aSAndroid Build Coastguard Worker     AnyInvType other;
1096*9356374aSAndroid Build Coastguard Worker 
1097*9356374aSAndroid Build Coastguard Worker     fun.swap(other);
1098*9356374aSAndroid Build Coastguard Worker 
1099*9356374aSAndroid Build Coastguard Worker     EXPECT_FALSE(static_cast<bool>(fun));
1100*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(other));
1101*9356374aSAndroid Build Coastguard Worker 
1102*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
1103*9356374aSAndroid Build Coastguard Worker 
1104*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
1105*9356374aSAndroid Build Coastguard Worker   }
1106*9356374aSAndroid Build Coastguard Worker }
1107*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestCombinatoric,SwapNonemptyLhsNonemptyRhs)1108*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestCombinatoric, SwapNonemptyLhsNonemptyRhs) {
1109*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1110*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1111*9356374aSAndroid Build Coastguard Worker 
1112*9356374aSAndroid Build Coastguard Worker   // Swap idiom
1113*9356374aSAndroid Build Coastguard Worker   {
1114*9356374aSAndroid Build Coastguard Worker     AnyInvType fun(absl::in_place_type<AddType>, 5);
1115*9356374aSAndroid Build Coastguard Worker     AnyInvType other(absl::in_place_type<AddType>, 6);
1116*9356374aSAndroid Build Coastguard Worker 
1117*9356374aSAndroid Build Coastguard Worker     using std::swap;
1118*9356374aSAndroid Build Coastguard Worker     swap(fun, other);
1119*9356374aSAndroid Build Coastguard Worker 
1120*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(fun));
1121*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(other));
1122*9356374aSAndroid Build Coastguard Worker 
1123*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1124*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
1125*9356374aSAndroid Build Coastguard Worker 
1126*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(
1127*9356374aSAndroid Build Coastguard Worker         absl::type_traits_internal::IsNothrowSwappable<AnyInvType>::value);
1128*9356374aSAndroid Build Coastguard Worker   }
1129*9356374aSAndroid Build Coastguard Worker 
1130*9356374aSAndroid Build Coastguard Worker   // Member swap
1131*9356374aSAndroid Build Coastguard Worker   {
1132*9356374aSAndroid Build Coastguard Worker     AnyInvType fun(absl::in_place_type<AddType>, 5);
1133*9356374aSAndroid Build Coastguard Worker     AnyInvType other(absl::in_place_type<AddType>, 6);
1134*9356374aSAndroid Build Coastguard Worker 
1135*9356374aSAndroid Build Coastguard Worker     fun.swap(other);
1136*9356374aSAndroid Build Coastguard Worker 
1137*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(fun));
1138*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(static_cast<bool>(other));
1139*9356374aSAndroid Build Coastguard Worker 
1140*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(30, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1141*9356374aSAndroid Build Coastguard Worker     EXPECT_EQ(29, TypeParam::ToThisParam(other)(7, 8, 9).value);
1142*9356374aSAndroid Build Coastguard Worker 
1143*9356374aSAndroid Build Coastguard Worker     EXPECT_TRUE(IsNothrowMemberSwappable<AnyInvType>::value);
1144*9356374aSAndroid Build Coastguard Worker   }
1145*9356374aSAndroid Build Coastguard Worker }
1146*9356374aSAndroid Build Coastguard Worker 
1147*9356374aSAndroid Build Coastguard Worker template <class T>
1148*9356374aSAndroid Build Coastguard Worker class AnyInvTestMovable : public ::testing::Test {};
1149*9356374aSAndroid Build Coastguard Worker 
1150*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestMovable);
1151*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestMovable,ConversionConstructionUserDefinedType)1152*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionUserDefinedType) {
1153*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1154*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1155*9356374aSAndroid Build Coastguard Worker 
1156*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(AddType(5));
1157*9356374aSAndroid Build Coastguard Worker 
1158*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1159*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1160*9356374aSAndroid Build Coastguard Worker }
1161*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestMovable,ConversionConstructionVoidCovariance)1162*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestMovable, ConversionConstructionVoidCovariance) {
1163*9356374aSAndroid Build Coastguard Worker   using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
1164*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1165*9356374aSAndroid Build Coastguard Worker 
1166*9356374aSAndroid Build Coastguard Worker   VoidAnyInvType fun(AddType(5));
1167*9356374aSAndroid Build Coastguard Worker 
1168*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1169*9356374aSAndroid Build Coastguard Worker }
1170*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestMovable,ConversionAssignUserDefinedTypeEmptyLhs)1171*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeEmptyLhs) {
1172*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1173*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1174*9356374aSAndroid Build Coastguard Worker 
1175*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
1176*9356374aSAndroid Build Coastguard Worker   fun = AddType(5);
1177*9356374aSAndroid Build Coastguard Worker 
1178*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1180*9356374aSAndroid Build Coastguard Worker }
1181*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestMovable,ConversionAssignUserDefinedTypeNonemptyLhs)1182*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestMovable, ConversionAssignUserDefinedTypeNonemptyLhs) {
1183*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1184*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1185*9356374aSAndroid Build Coastguard Worker 
1186*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &add_function;
1187*9356374aSAndroid Build Coastguard Worker   fun = AddType(5);
1188*9356374aSAndroid Build Coastguard Worker 
1189*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1190*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1191*9356374aSAndroid Build Coastguard Worker }
1192*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestMovable,ConversionAssignVoidCovariance)1193*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestMovable, ConversionAssignVoidCovariance) {
1194*9356374aSAndroid Build Coastguard Worker   using VoidAnyInvType = typename TypeParam::VoidAnyInvType;
1195*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1196*9356374aSAndroid Build Coastguard Worker 
1197*9356374aSAndroid Build Coastguard Worker   VoidAnyInvType fun;
1198*9356374aSAndroid Build Coastguard Worker   fun = AddType(5);
1199*9356374aSAndroid Build Coastguard Worker 
1200*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1201*9356374aSAndroid Build Coastguard Worker }
1202*9356374aSAndroid Build Coastguard Worker 
1203*9356374aSAndroid Build Coastguard Worker template <class T>
1204*9356374aSAndroid Build Coastguard Worker class AnyInvTestNoexceptFalse : public ::testing::Test {};
1205*9356374aSAndroid Build Coastguard Worker 
1206*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse);
1207*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNoexceptFalse,ConversionConstructionConstraints)1208*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionConstructionConstraints) {
1209*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1210*9356374aSAndroid Build Coastguard Worker 
1211*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_constructible<
1212*9356374aSAndroid Build Coastguard Worker                AnyInvType,
1213*9356374aSAndroid Build Coastguard Worker                typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
1214*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((
1215*9356374aSAndroid Build Coastguard Worker       std::is_constructible<AnyInvType,
1216*9356374aSAndroid Build Coastguard Worker                             typename TypeParam::IncompatibleInvocable>::value));
1217*9356374aSAndroid Build Coastguard Worker }
1218*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNoexceptFalse,ConversionAssignConstraints)1219*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNoexceptFalse, ConversionAssignConstraints) {
1220*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1221*9356374aSAndroid Build Coastguard Worker 
1222*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE((std::is_assignable<
1223*9356374aSAndroid Build Coastguard Worker                AnyInvType&,
1224*9356374aSAndroid Build Coastguard Worker                typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
1225*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
1226*9356374aSAndroid Build Coastguard Worker       (std::is_assignable<AnyInvType&,
1227*9356374aSAndroid Build Coastguard Worker                           typename TypeParam::IncompatibleInvocable>::value));
1228*9356374aSAndroid Build Coastguard Worker }
1229*9356374aSAndroid Build Coastguard Worker 
1230*9356374aSAndroid Build Coastguard Worker template <class T>
1231*9356374aSAndroid Build Coastguard Worker class AnyInvTestNoexceptTrue : public ::testing::Test {};
1232*9356374aSAndroid Build Coastguard Worker 
1233*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue);
1234*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNoexceptTrue,ConversionConstructionConstraints)1235*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionConstructionConstraints) {
1236*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
1237*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "Noexcept was not part of the type system before C++17.";
1238*9356374aSAndroid Build Coastguard Worker #else
1239*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1240*9356374aSAndroid Build Coastguard Worker 
1241*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_constructible<
1242*9356374aSAndroid Build Coastguard Worker                 AnyInvType,
1243*9356374aSAndroid Build Coastguard Worker                 typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
1244*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((
1245*9356374aSAndroid Build Coastguard Worker       std::is_constructible<AnyInvType,
1246*9356374aSAndroid Build Coastguard Worker                             typename TypeParam::IncompatibleInvocable>::value));
1247*9356374aSAndroid Build Coastguard Worker #endif
1248*9356374aSAndroid Build Coastguard Worker }
1249*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNoexceptTrue,ConversionAssignConstraints)1250*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNoexceptTrue, ConversionAssignConstraints) {
1251*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
1252*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "Noexcept was not part of the type system before C++17.";
1253*9356374aSAndroid Build Coastguard Worker #else
1254*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1255*9356374aSAndroid Build Coastguard Worker 
1256*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((std::is_assignable<
1257*9356374aSAndroid Build Coastguard Worker                 AnyInvType&,
1258*9356374aSAndroid Build Coastguard Worker                 typename TypeParam::AnyInvocableFunTypeNotNoexcept*>::value));
1259*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(
1260*9356374aSAndroid Build Coastguard Worker       (std::is_assignable<AnyInvType&,
1261*9356374aSAndroid Build Coastguard Worker                           typename TypeParam::IncompatibleInvocable>::value));
1262*9356374aSAndroid Build Coastguard Worker #endif
1263*9356374aSAndroid Build Coastguard Worker }
1264*9356374aSAndroid Build Coastguard Worker 
1265*9356374aSAndroid Build Coastguard Worker template <class T>
1266*9356374aSAndroid Build Coastguard Worker class AnyInvTestNonRvalue : public ::testing::Test {};
1267*9356374aSAndroid Build Coastguard Worker 
1268*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestNonRvalue);
1269*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNonRvalue,ConversionConstructionReferenceWrapper)1270*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNonRvalue, ConversionConstructionReferenceWrapper) {
1271*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1272*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1273*9356374aSAndroid Build Coastguard Worker 
1274*9356374aSAndroid Build Coastguard Worker   AddType add(4);
1275*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = std::ref(add);
1276*9356374aSAndroid Build Coastguard Worker   add.state = 5;
1277*9356374aSAndroid Build Coastguard Worker 
1278*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1279*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1280*9356374aSAndroid Build Coastguard Worker 
1281*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1282*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
1283*9356374aSAndroid Build Coastguard Worker }
1284*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNonRvalue,NonMoveableResultType)1285*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNonRvalue, NonMoveableResultType) {
1286*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
1287*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "Copy/move elision was not standard before C++17";
1288*9356374aSAndroid Build Coastguard Worker #else
1289*9356374aSAndroid Build Coastguard Worker   // Define a result type that cannot be copy- or move-constructed.
1290*9356374aSAndroid Build Coastguard Worker   struct Result {
1291*9356374aSAndroid Build Coastguard Worker     int x;
1292*9356374aSAndroid Build Coastguard Worker 
1293*9356374aSAndroid Build Coastguard Worker     explicit Result(const int x_in) : x(x_in) {}
1294*9356374aSAndroid Build Coastguard Worker     Result(Result&&) = delete;
1295*9356374aSAndroid Build Coastguard Worker   };
1296*9356374aSAndroid Build Coastguard Worker 
1297*9356374aSAndroid Build Coastguard Worker   static_assert(!std::is_move_constructible<Result>::value, "");
1298*9356374aSAndroid Build Coastguard Worker   static_assert(!std::is_copy_constructible<Result>::value, "");
1299*9356374aSAndroid Build Coastguard Worker 
1300*9356374aSAndroid Build Coastguard Worker   // Assumption check: it should nevertheless be possible to use functors that
1301*9356374aSAndroid Build Coastguard Worker   // return a Result struct according to the language rules.
1302*9356374aSAndroid Build Coastguard Worker   const auto return_17 = []() noexcept { return Result(17); };
1303*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(17, return_17().x);
1304*9356374aSAndroid Build Coastguard Worker 
1305*9356374aSAndroid Build Coastguard Worker   // Just like plain functors, it should work fine to use an AnyInvocable that
1306*9356374aSAndroid Build Coastguard Worker   // returns the non-moveable type.
1307*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFun =
1308*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>;
1309*9356374aSAndroid Build Coastguard Worker 
1310*9356374aSAndroid Build Coastguard Worker   using Fun =
1311*9356374aSAndroid Build Coastguard Worker       GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>;
1312*9356374aSAndroid Build Coastguard Worker 
1313*9356374aSAndroid Build Coastguard Worker   AnyInvocable<Fun> any_inv(return_17);
1314*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(17, any_inv().x);
1315*9356374aSAndroid Build Coastguard Worker #endif
1316*9356374aSAndroid Build Coastguard Worker }
1317*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNonRvalue,ConversionAssignReferenceWrapperEmptyLhs)1318*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperEmptyLhs) {
1319*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1320*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1321*9356374aSAndroid Build Coastguard Worker 
1322*9356374aSAndroid Build Coastguard Worker   AddType add(4);
1323*9356374aSAndroid Build Coastguard Worker   AnyInvType fun;
1324*9356374aSAndroid Build Coastguard Worker   fun = std::ref(add);
1325*9356374aSAndroid Build Coastguard Worker   add.state = 5;
1326*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
1327*9356374aSAndroid Build Coastguard Worker       (std::is_nothrow_assignable<AnyInvType&,
1328*9356374aSAndroid Build Coastguard Worker                                   std::reference_wrapper<AddType>>::value));
1329*9356374aSAndroid Build Coastguard Worker 
1330*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1331*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1332*9356374aSAndroid Build Coastguard Worker 
1333*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1334*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
1335*9356374aSAndroid Build Coastguard Worker }
1336*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestNonRvalue,ConversionAssignReferenceWrapperNonemptyLhs)1337*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestNonRvalue, ConversionAssignReferenceWrapperNonemptyLhs) {
1338*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1339*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1340*9356374aSAndroid Build Coastguard Worker 
1341*9356374aSAndroid Build Coastguard Worker   AddType add(4);
1342*9356374aSAndroid Build Coastguard Worker   AnyInvType fun = &mult_function;
1343*9356374aSAndroid Build Coastguard Worker   fun = std::ref(add);
1344*9356374aSAndroid Build Coastguard Worker   add.state = 5;
1345*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(
1346*9356374aSAndroid Build Coastguard Worker       (std::is_nothrow_assignable<AnyInvType&,
1347*9356374aSAndroid Build Coastguard Worker                                   std::reference_wrapper<AddType>>::value));
1348*9356374aSAndroid Build Coastguard Worker 
1349*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1350*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(29, TypeParam::ToThisParam(fun)(7, 8, 9).value);
1351*9356374aSAndroid Build Coastguard Worker 
1352*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1353*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(38, TypeParam::ToThisParam(fun)(10, 11, 12).value);
1354*9356374aSAndroid Build Coastguard Worker }
1355*9356374aSAndroid Build Coastguard Worker 
1356*9356374aSAndroid Build Coastguard Worker template <class T>
1357*9356374aSAndroid Build Coastguard Worker class AnyInvTestRvalue : public ::testing::Test {};
1358*9356374aSAndroid Build Coastguard Worker 
1359*9356374aSAndroid Build Coastguard Worker TYPED_TEST_SUITE_P(AnyInvTestRvalue);
1360*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestRvalue,ConversionConstructionReferenceWrapper)1361*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestRvalue, ConversionConstructionReferenceWrapper) {
1362*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1363*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1364*9356374aSAndroid Build Coastguard Worker 
1365*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((
1366*9356374aSAndroid Build Coastguard Worker       std::is_convertible<std::reference_wrapper<AddType>, AnyInvType>::value));
1367*9356374aSAndroid Build Coastguard Worker }
1368*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestRvalue,NonMoveableResultType)1369*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestRvalue, NonMoveableResultType) {
1370*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG < 201703L
1371*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "Copy/move elision was not standard before C++17";
1372*9356374aSAndroid Build Coastguard Worker #else
1373*9356374aSAndroid Build Coastguard Worker   // Define a result type that cannot be copy- or move-constructed.
1374*9356374aSAndroid Build Coastguard Worker   struct Result {
1375*9356374aSAndroid Build Coastguard Worker     int x;
1376*9356374aSAndroid Build Coastguard Worker 
1377*9356374aSAndroid Build Coastguard Worker     explicit Result(const int x_in) : x(x_in) {}
1378*9356374aSAndroid Build Coastguard Worker     Result(Result&&) = delete;
1379*9356374aSAndroid Build Coastguard Worker   };
1380*9356374aSAndroid Build Coastguard Worker 
1381*9356374aSAndroid Build Coastguard Worker   static_assert(!std::is_move_constructible<Result>::value, "");
1382*9356374aSAndroid Build Coastguard Worker   static_assert(!std::is_copy_constructible<Result>::value, "");
1383*9356374aSAndroid Build Coastguard Worker 
1384*9356374aSAndroid Build Coastguard Worker   // Assumption check: it should nevertheless be possible to use functors that
1385*9356374aSAndroid Build Coastguard Worker   // return a Result struct according to the language rules.
1386*9356374aSAndroid Build Coastguard Worker   const auto return_17 = []() noexcept { return Result(17); };
1387*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(17, return_17().x);
1388*9356374aSAndroid Build Coastguard Worker 
1389*9356374aSAndroid Build Coastguard Worker   // Just like plain functors, it should work fine to use an AnyInvocable that
1390*9356374aSAndroid Build Coastguard Worker   // returns the non-moveable type.
1391*9356374aSAndroid Build Coastguard Worker   using UnqualifiedFun =
1392*9356374aSAndroid Build Coastguard Worker       absl::conditional_t<TypeParam::kIsNoexcept, Result() noexcept, Result()>;
1393*9356374aSAndroid Build Coastguard Worker 
1394*9356374aSAndroid Build Coastguard Worker   using Fun =
1395*9356374aSAndroid Build Coastguard Worker       GiveQualifiersToFun<typename TypeParam::Qualifiers, UnqualifiedFun>;
1396*9356374aSAndroid Build Coastguard Worker 
1397*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(17, AnyInvocable<Fun>(return_17)().x);
1398*9356374aSAndroid Build Coastguard Worker #endif
1399*9356374aSAndroid Build Coastguard Worker }
1400*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestRvalue,ConversionAssignReferenceWrapper)1401*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestRvalue, ConversionAssignReferenceWrapper) {
1402*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1403*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1404*9356374aSAndroid Build Coastguard Worker 
1405*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE((
1406*9356374aSAndroid Build Coastguard Worker       std::is_assignable<AnyInvType&, std::reference_wrapper<AddType>>::value));
1407*9356374aSAndroid Build Coastguard Worker }
1408*9356374aSAndroid Build Coastguard Worker 
TYPED_TEST_P(AnyInvTestRvalue,NonConstCrashesOnSecondCall)1409*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestRvalue, NonConstCrashesOnSecondCall) {
1410*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1411*9356374aSAndroid Build Coastguard Worker   using AddType = typename TypeParam::AddType;
1412*9356374aSAndroid Build Coastguard Worker 
1413*9356374aSAndroid Build Coastguard Worker   AnyInvType fun(absl::in_place_type<AddType>, 5);
1414*9356374aSAndroid Build Coastguard Worker 
1415*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));
1416*9356374aSAndroid Build Coastguard Worker   std::move(fun)(7, 8, 9);
1417*9356374aSAndroid Build Coastguard Worker 
1418*9356374aSAndroid Build Coastguard Worker   // Ensure we're still valid
1419*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(static_cast<bool>(fun));  // NOLINT(bugprone-use-after-move)
1420*9356374aSAndroid Build Coastguard Worker 
1421*9356374aSAndroid Build Coastguard Worker #if !defined(NDEBUG)
1422*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(std::move(fun)(7, 8, 9), "");
1423*9356374aSAndroid Build Coastguard Worker #endif
1424*9356374aSAndroid Build Coastguard Worker }
1425*9356374aSAndroid Build Coastguard Worker 
1426*9356374aSAndroid Build Coastguard Worker // Ensure that any qualifiers (in particular &&-qualifiers) do not affect
1427*9356374aSAndroid Build Coastguard Worker // when the destructor is actually run.
TYPED_TEST_P(AnyInvTestRvalue,QualifierIndependentObjectLifetime)1428*9356374aSAndroid Build Coastguard Worker TYPED_TEST_P(AnyInvTestRvalue, QualifierIndependentObjectLifetime) {
1429*9356374aSAndroid Build Coastguard Worker   using AnyInvType = typename TypeParam::AnyInvType;
1430*9356374aSAndroid Build Coastguard Worker 
1431*9356374aSAndroid Build Coastguard Worker   auto refs = std::make_shared<std::nullptr_t>();
1432*9356374aSAndroid Build Coastguard Worker   {
1433*9356374aSAndroid Build Coastguard Worker     AnyInvType fun([refs](auto&&...) noexcept { return 0; });
1434*9356374aSAndroid Build Coastguard Worker     EXPECT_GT(refs.use_count(), 1);
1435*9356374aSAndroid Build Coastguard Worker 
1436*9356374aSAndroid Build Coastguard Worker     std::move(fun)(7, 8, 9);
1437*9356374aSAndroid Build Coastguard Worker 
1438*9356374aSAndroid Build Coastguard Worker     // Ensure destructor hasn't run even if rref-qualified
1439*9356374aSAndroid Build Coastguard Worker     EXPECT_GT(refs.use_count(), 1);
1440*9356374aSAndroid Build Coastguard Worker   }
1441*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(refs.use_count(), 1);
1442*9356374aSAndroid Build Coastguard Worker }
1443*9356374aSAndroid Build Coastguard Worker 
1444*9356374aSAndroid Build Coastguard Worker // NOTE: This test suite originally attempted to enumerate all possible
1445*9356374aSAndroid Build Coastguard Worker // combinations of type properties but the build-time started getting too large.
1446*9356374aSAndroid Build Coastguard Worker // Instead, it is now assumed that certain parameters are orthogonal and so
1447*9356374aSAndroid Build Coastguard Worker // some combinations are elided.
1448*9356374aSAndroid Build Coastguard Worker 
1449*9356374aSAndroid Build Coastguard Worker // A metafunction to form a TypeList of all cv and non-rvalue ref combinations,
1450*9356374aSAndroid Build Coastguard Worker // coupled with all of the other explicitly specified parameters.
1451*9356374aSAndroid Build Coastguard Worker template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec,
1452*9356374aSAndroid Build Coastguard Worker           ObjSize Size, ObjAlign Align>
1453*9356374aSAndroid Build Coastguard Worker using NonRvalueQualifiedTestParams = ::testing::Types<               //
1454*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, _, CallExceptionSpec, Size, Align>,        //
1455*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, const _, CallExceptionSpec, Size, Align>,  //
1456*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, _&, CallExceptionSpec, Size, Align>,       //
1457*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, const _&, CallExceptionSpec, Size, Align>>;
1458*9356374aSAndroid Build Coastguard Worker 
1459*9356374aSAndroid Build Coastguard Worker // A metafunction to form a TypeList of const and non-const rvalue ref
1460*9356374aSAndroid Build Coastguard Worker // qualifiers, coupled with all of the other explicitly specified parameters.
1461*9356374aSAndroid Build Coastguard Worker template <Movable Mov, Destructible Dest, NothrowCall CallExceptionSpec,
1462*9356374aSAndroid Build Coastguard Worker           ObjSize Size, ObjAlign Align>
1463*9356374aSAndroid Build Coastguard Worker using RvalueQualifiedTestParams = ::testing::Types<
1464*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, _&&, CallExceptionSpec, Size, Align>,       //
1465*9356374aSAndroid Build Coastguard Worker     TestParams<Mov, Dest, const _&&, CallExceptionSpec, Size, Align>  //
1466*9356374aSAndroid Build Coastguard Worker     >;
1467*9356374aSAndroid Build Coastguard Worker 
1468*9356374aSAndroid Build Coastguard Worker // All qualifier combinations and a noexcept function type
1469*9356374aSAndroid Build Coastguard Worker using TestParameterListNonRvalueQualifiersNothrowCall =
1470*9356374aSAndroid Build Coastguard Worker     NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
1471*9356374aSAndroid Build Coastguard Worker                                  NothrowCall::yes, ObjSize::small,
1472*9356374aSAndroid Build Coastguard Worker                                  ObjAlign::normal>;
1473*9356374aSAndroid Build Coastguard Worker using TestParameterListRvalueQualifiersNothrowCall =
1474*9356374aSAndroid Build Coastguard Worker     RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
1475*9356374aSAndroid Build Coastguard Worker                               NothrowCall::yes, ObjSize::small,
1476*9356374aSAndroid Build Coastguard Worker                               ObjAlign::normal>;
1477*9356374aSAndroid Build Coastguard Worker 
1478*9356374aSAndroid Build Coastguard Worker // All qualifier combinations and a non-noexcept function type
1479*9356374aSAndroid Build Coastguard Worker using TestParameterListNonRvalueQualifiersCallMayThrow =
1480*9356374aSAndroid Build Coastguard Worker     NonRvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
1481*9356374aSAndroid Build Coastguard Worker                                  NothrowCall::no, ObjSize::small,
1482*9356374aSAndroid Build Coastguard Worker                                  ObjAlign::normal>;
1483*9356374aSAndroid Build Coastguard Worker using TestParameterListRvalueQualifiersCallMayThrow =
1484*9356374aSAndroid Build Coastguard Worker     RvalueQualifiedTestParams<Movable::trivial, Destructible::trivial,
1485*9356374aSAndroid Build Coastguard Worker                               NothrowCall::no, ObjSize::small,
1486*9356374aSAndroid Build Coastguard Worker                               ObjAlign::normal>;
1487*9356374aSAndroid Build Coastguard Worker 
1488*9356374aSAndroid Build Coastguard Worker // Lists of various cases that should lead to remote storage
1489*9356374aSAndroid Build Coastguard Worker using TestParameterListRemoteMovable = ::testing::Types<
1490*9356374aSAndroid Build Coastguard Worker     // "Normal" aligned types that are large and have trivial destructors
1491*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
1492*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1493*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
1494*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1495*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no,
1496*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1497*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::yes, Destructible::trivial, _, NothrowCall::no,
1498*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1499*9356374aSAndroid Build Coastguard Worker 
1500*9356374aSAndroid Build Coastguard Worker     // Same as above but with non-trivial destructors
1501*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no,
1502*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1503*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no,
1504*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1505*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no,
1506*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1507*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::yes, Destructible::nothrow, _, NothrowCall::no,
1508*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>  //
1509*9356374aSAndroid Build Coastguard Worker 
1510*9356374aSAndroid Build Coastguard Worker // Dynamic memory allocation for over-aligned data was introduced in C++17.
1511*9356374aSAndroid Build Coastguard Worker // See https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html
1512*9356374aSAndroid Build Coastguard Worker #if ABSL_INTERNAL_CPLUSPLUS_LANG >= 201703L
1513*9356374aSAndroid Build Coastguard Worker     // Types that must use remote storage because of a large alignment.
1514*9356374aSAndroid Build Coastguard Worker     ,
1515*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
1516*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::large>,  //
1517*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
1518*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::large>,  //
1519*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::nothrow, _, NothrowCall::no,
1520*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::large>,  //
1521*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::nothrow, _, NothrowCall::no,
1522*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::large>  //
1523*9356374aSAndroid Build Coastguard Worker #endif
1524*9356374aSAndroid Build Coastguard Worker     >;
1525*9356374aSAndroid Build Coastguard Worker using TestParameterListRemoteNonMovable = ::testing::Types<
1526*9356374aSAndroid Build Coastguard Worker     // "Normal" aligned types that are large and have trivial destructors
1527*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no,
1528*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1529*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::no, Destructible::trivial, _, NothrowCall::no,
1530*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>,  //
1531*9356374aSAndroid Build Coastguard Worker     // Same as above but with non-trivial destructors
1532*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no,
1533*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1534*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::no, Destructible::nothrow, _, NothrowCall::no,
1535*9356374aSAndroid Build Coastguard Worker                ObjSize::large, ObjAlign::normal>  //
1536*9356374aSAndroid Build Coastguard Worker     >;
1537*9356374aSAndroid Build Coastguard Worker 
1538*9356374aSAndroid Build Coastguard Worker // Parameters that lead to local storage
1539*9356374aSAndroid Build Coastguard Worker using TestParameterListLocal = ::testing::Types<
1540*9356374aSAndroid Build Coastguard Worker     // Types that meet the requirements and have trivial destructors
1541*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
1542*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1543*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
1544*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1545*9356374aSAndroid Build Coastguard Worker 
1546*9356374aSAndroid Build Coastguard Worker     // Same as above but with non-trivial destructors
1547*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::trivial, Destructible::trivial, _, NothrowCall::no,
1548*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>,  //
1549*9356374aSAndroid Build Coastguard Worker     TestParams<Movable::nothrow, Destructible::trivial, _, NothrowCall::no,
1550*9356374aSAndroid Build Coastguard Worker                ObjSize::small, ObjAlign::normal>  //
1551*9356374aSAndroid Build Coastguard Worker     >;
1552*9356374aSAndroid Build Coastguard Worker 
1553*9356374aSAndroid Build Coastguard Worker // All of the tests that are run for every possible combination of types.
1554*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(
1555*9356374aSAndroid Build Coastguard Worker     AnyInvTestBasic, DefaultConstruction, ConstructionNullptr,
1556*9356374aSAndroid Build Coastguard Worker     ConstructionNullFunctionPtr, ConstructionNullMemberFunctionPtr,
1557*9356374aSAndroid Build Coastguard Worker     ConstructionNullMemberObjectPtr, ConstructionMemberFunctionPtr,
1558*9356374aSAndroid Build Coastguard Worker     ConstructionMemberObjectPtr, ConstructionFunctionReferenceDecay,
1559*9356374aSAndroid Build Coastguard Worker     ConstructionCompatibleAnyInvocableEmpty,
1560*9356374aSAndroid Build Coastguard Worker     ConstructionCompatibleAnyInvocableNonempty, InPlaceConstruction,
1561*9356374aSAndroid Build Coastguard Worker     ConversionToBool, Invocation, InPlaceConstructionInitializerList,
1562*9356374aSAndroid Build Coastguard Worker     InPlaceNullFunPtrConstruction, InPlaceNullFunPtrConstructionValueInit,
1563*9356374aSAndroid Build Coastguard Worker     InPlaceNullMemFunPtrConstruction, InPlaceNullMemFunPtrConstructionValueInit,
1564*9356374aSAndroid Build Coastguard Worker     InPlaceNullMemObjPtrConstruction, InPlaceNullMemObjPtrConstructionValueInit,
1565*9356374aSAndroid Build Coastguard Worker     InPlaceVoidCovarianceConstruction, MoveConstructionFromEmpty,
1566*9356374aSAndroid Build Coastguard Worker     MoveConstructionFromNonEmpty, ComparisonWithNullptrEmpty,
1567*9356374aSAndroid Build Coastguard Worker     ComparisonWithNullptrNonempty, ResultType);
1568*9356374aSAndroid Build Coastguard Worker 
1569*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(
1570*9356374aSAndroid Build Coastguard Worker     NonRvalueCallMayThrow, AnyInvTestBasic,
1571*9356374aSAndroid Build Coastguard Worker     TestParameterListNonRvalueQualifiersCallMayThrow);
1572*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestBasic,
1573*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersCallMayThrow);
1574*9356374aSAndroid Build Coastguard Worker 
1575*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestBasic,
1576*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteMovable);
1577*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestBasic,
1578*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteNonMovable);
1579*9356374aSAndroid Build Coastguard Worker 
1580*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestBasic, TestParameterListLocal);
1581*9356374aSAndroid Build Coastguard Worker 
1582*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestBasic,
1583*9356374aSAndroid Build Coastguard Worker                                TestParameterListNonRvalueQualifiersNothrowCall);
1584*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestBasic,
1585*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersNothrowCall);
1586*9356374aSAndroid Build Coastguard Worker 
1587*9356374aSAndroid Build Coastguard Worker // Tests for functions that take two operands.
1588*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(
1589*9356374aSAndroid Build Coastguard Worker     AnyInvTestCombinatoric, MoveAssignEmptyEmptyLhsRhs,
1590*9356374aSAndroid Build Coastguard Worker     MoveAssignEmptyLhsNonemptyRhs, MoveAssignNonemptyEmptyLhsRhs,
1591*9356374aSAndroid Build Coastguard Worker     MoveAssignNonemptyLhsNonemptyRhs, SelfMoveAssignEmpty,
1592*9356374aSAndroid Build Coastguard Worker     SelfMoveAssignNonempty, AssignNullptrEmptyLhs,
1593*9356374aSAndroid Build Coastguard Worker     AssignNullFunctionPtrEmptyLhs, AssignNullMemberFunctionPtrEmptyLhs,
1594*9356374aSAndroid Build Coastguard Worker     AssignNullMemberObjectPtrEmptyLhs, AssignMemberFunctionPtrEmptyLhs,
1595*9356374aSAndroid Build Coastguard Worker     AssignMemberObjectPtrEmptyLhs, AssignFunctionReferenceDecayEmptyLhs,
1596*9356374aSAndroid Build Coastguard Worker     AssignCompatibleAnyInvocableEmptyLhsEmptyRhs,
1597*9356374aSAndroid Build Coastguard Worker     AssignCompatibleAnyInvocableEmptyLhsNonemptyRhs, AssignNullptrNonemptyLhs,
1598*9356374aSAndroid Build Coastguard Worker     AssignNullFunctionPtrNonemptyLhs, AssignNullMemberFunctionPtrNonemptyLhs,
1599*9356374aSAndroid Build Coastguard Worker     AssignNullMemberObjectPtrNonemptyLhs, AssignMemberFunctionPtrNonemptyLhs,
1600*9356374aSAndroid Build Coastguard Worker     AssignMemberObjectPtrNonemptyLhs, AssignFunctionReferenceDecayNonemptyLhs,
1601*9356374aSAndroid Build Coastguard Worker     AssignCompatibleAnyInvocableNonemptyLhsEmptyRhs,
1602*9356374aSAndroid Build Coastguard Worker     AssignCompatibleAnyInvocableNonemptyLhsNonemptyRhs, SwapEmptyLhsEmptyRhs,
1603*9356374aSAndroid Build Coastguard Worker     SwapEmptyLhsNonemptyRhs, SwapNonemptyLhsEmptyRhs,
1604*9356374aSAndroid Build Coastguard Worker     SwapNonemptyLhsNonemptyRhs);
1605*9356374aSAndroid Build Coastguard Worker 
1606*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(
1607*9356374aSAndroid Build Coastguard Worker     NonRvalueCallMayThrow, AnyInvTestCombinatoric,
1608*9356374aSAndroid Build Coastguard Worker     TestParameterListNonRvalueQualifiersCallMayThrow);
1609*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestCombinatoric,
1610*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersCallMayThrow);
1611*9356374aSAndroid Build Coastguard Worker 
1612*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestCombinatoric,
1613*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteMovable);
1614*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestCombinatoric,
1615*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteNonMovable);
1616*9356374aSAndroid Build Coastguard Worker 
1617*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestCombinatoric,
1618*9356374aSAndroid Build Coastguard Worker                                TestParameterListLocal);
1619*9356374aSAndroid Build Coastguard Worker 
1620*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestCombinatoric,
1621*9356374aSAndroid Build Coastguard Worker                                TestParameterListNonRvalueQualifiersNothrowCall);
1622*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestCombinatoric,
1623*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersNothrowCall);
1624*9356374aSAndroid Build Coastguard Worker 
1625*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AnyInvTestMovable,
1626*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionUserDefinedType,
1627*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionVoidCovariance,
1628*9356374aSAndroid Build Coastguard Worker                             ConversionAssignUserDefinedTypeEmptyLhs,
1629*9356374aSAndroid Build Coastguard Worker                             ConversionAssignUserDefinedTypeNonemptyLhs,
1630*9356374aSAndroid Build Coastguard Worker                             ConversionAssignVoidCovariance);
1631*9356374aSAndroid Build Coastguard Worker 
1632*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(
1633*9356374aSAndroid Build Coastguard Worker     NonRvalueCallMayThrow, AnyInvTestMovable,
1634*9356374aSAndroid Build Coastguard Worker     TestParameterListNonRvalueQualifiersCallMayThrow);
1635*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestMovable,
1636*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersCallMayThrow);
1637*9356374aSAndroid Build Coastguard Worker 
1638*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestMovable,
1639*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteMovable);
1640*9356374aSAndroid Build Coastguard Worker 
1641*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestMovable,
1642*9356374aSAndroid Build Coastguard Worker                                TestParameterListLocal);
1643*9356374aSAndroid Build Coastguard Worker 
1644*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestMovable,
1645*9356374aSAndroid Build Coastguard Worker                                TestParameterListNonRvalueQualifiersNothrowCall);
1646*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestMovable,
1647*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersNothrowCall);
1648*9356374aSAndroid Build Coastguard Worker 
1649*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptFalse,
1650*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionConstraints,
1651*9356374aSAndroid Build Coastguard Worker                             ConversionAssignConstraints);
1652*9356374aSAndroid Build Coastguard Worker 
1653*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(
1654*9356374aSAndroid Build Coastguard Worker     NonRvalueCallMayThrow, AnyInvTestNoexceptFalse,
1655*9356374aSAndroid Build Coastguard Worker     TestParameterListNonRvalueQualifiersCallMayThrow);
1656*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestNoexceptFalse,
1657*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersCallMayThrow);
1658*9356374aSAndroid Build Coastguard Worker 
1659*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNoexceptFalse,
1660*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteMovable);
1661*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNoexceptFalse,
1662*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteNonMovable);
1663*9356374aSAndroid Build Coastguard Worker 
1664*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNoexceptFalse,
1665*9356374aSAndroid Build Coastguard Worker                                TestParameterListLocal);
1666*9356374aSAndroid Build Coastguard Worker 
1667*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNoexceptTrue,
1668*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionConstraints,
1669*9356374aSAndroid Build Coastguard Worker                             ConversionAssignConstraints);
1670*9356374aSAndroid Build Coastguard Worker 
1671*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNoexceptTrue,
1672*9356374aSAndroid Build Coastguard Worker                                TestParameterListNonRvalueQualifiersNothrowCall);
1673*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallNothrow, AnyInvTestNoexceptTrue,
1674*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersNothrowCall);
1675*9356374aSAndroid Build Coastguard Worker 
1676*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AnyInvTestNonRvalue,
1677*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionReferenceWrapper,
1678*9356374aSAndroid Build Coastguard Worker                             NonMoveableResultType,
1679*9356374aSAndroid Build Coastguard Worker                             ConversionAssignReferenceWrapperEmptyLhs,
1680*9356374aSAndroid Build Coastguard Worker                             ConversionAssignReferenceWrapperNonemptyLhs);
1681*9356374aSAndroid Build Coastguard Worker 
1682*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(
1683*9356374aSAndroid Build Coastguard Worker     NonRvalueCallMayThrow, AnyInvTestNonRvalue,
1684*9356374aSAndroid Build Coastguard Worker     TestParameterListNonRvalueQualifiersCallMayThrow);
1685*9356374aSAndroid Build Coastguard Worker 
1686*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteMovable, AnyInvTestNonRvalue,
1687*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteMovable);
1688*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RemoteNonMovable, AnyInvTestNonRvalue,
1689*9356374aSAndroid Build Coastguard Worker                                TestParameterListRemoteNonMovable);
1690*9356374aSAndroid Build Coastguard Worker 
1691*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(Local, AnyInvTestNonRvalue,
1692*9356374aSAndroid Build Coastguard Worker                                TestParameterListLocal);
1693*9356374aSAndroid Build Coastguard Worker 
1694*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(NonRvalueCallNothrow, AnyInvTestNonRvalue,
1695*9356374aSAndroid Build Coastguard Worker                                TestParameterListNonRvalueQualifiersNothrowCall);
1696*9356374aSAndroid Build Coastguard Worker 
1697*9356374aSAndroid Build Coastguard Worker REGISTER_TYPED_TEST_SUITE_P(AnyInvTestRvalue,
1698*9356374aSAndroid Build Coastguard Worker                             ConversionConstructionReferenceWrapper,
1699*9356374aSAndroid Build Coastguard Worker                             NonMoveableResultType,
1700*9356374aSAndroid Build Coastguard Worker                             ConversionAssignReferenceWrapper,
1701*9356374aSAndroid Build Coastguard Worker                             NonConstCrashesOnSecondCall,
1702*9356374aSAndroid Build Coastguard Worker                             QualifierIndependentObjectLifetime);
1703*9356374aSAndroid Build Coastguard Worker 
1704*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(RvalueCallMayThrow, AnyInvTestRvalue,
1705*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersCallMayThrow);
1706*9356374aSAndroid Build Coastguard Worker 
1707*9356374aSAndroid Build Coastguard Worker INSTANTIATE_TYPED_TEST_SUITE_P(CallNothrowRvalue, AnyInvTestRvalue,
1708*9356374aSAndroid Build Coastguard Worker                                TestParameterListRvalueQualifiersNothrowCall);
1709*9356374aSAndroid Build Coastguard Worker 
1710*9356374aSAndroid Build Coastguard Worker // Minimal SFINAE testing for platforms where we can't run the tests, but we can
1711*9356374aSAndroid Build Coastguard Worker // build binaries for.
1712*9356374aSAndroid Build Coastguard Worker static_assert(
1713*9356374aSAndroid Build Coastguard Worker     std::is_convertible<void (*)(), absl::AnyInvocable<void() &&>>::value, "");
1714*9356374aSAndroid Build Coastguard Worker static_assert(!std::is_convertible<void*, absl::AnyInvocable<void() &&>>::value,
1715*9356374aSAndroid Build Coastguard Worker               "");
1716*9356374aSAndroid Build Coastguard Worker 
1717*9356374aSAndroid Build Coastguard Worker #undef ABSL_INTERNAL_NOEXCEPT_SPEC
1718*9356374aSAndroid Build Coastguard Worker 
1719*9356374aSAndroid Build Coastguard Worker }  // namespace
1720