"Fossies" - the Fresh Open Source Software Archive

Member "abseil-cpp-20230802.1/absl/functional/any_invocable_test.cc" (18 Sep 2023, 61793 Bytes) of package /linux/misc/abseil-cpp-20230802.1.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "any_invocable_test.cc" see the Fossies "Dox" file reference documentation and the last Fossies "Diffs" side-by-side code changes report: 20230125.3_vs_20230802.0.

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