tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

gmock-actions.h (92515B)


      1 // Copyright 2007, Google Inc.
      2 // All rights reserved.
      3 //
      4 // Redistribution and use in source and binary forms, with or without
      5 // modification, are permitted provided that the following conditions are
      6 // met:
      7 //
      8 //     * Redistributions of source code must retain the above copyright
      9 // notice, this list of conditions and the following disclaimer.
     10 //     * Redistributions in binary form must reproduce the above
     11 // copyright notice, this list of conditions and the following disclaimer
     12 // in the documentation and/or other materials provided with the
     13 // distribution.
     14 //     * Neither the name of Google Inc. nor the names of its
     15 // contributors may be used to endorse or promote products derived from
     16 // this software without specific prior written permission.
     17 //
     18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29 
     30 // Google Mock - a framework for writing C++ mock classes.
     31 //
     32 // The ACTION* family of macros can be used in a namespace scope to
     33 // define custom actions easily.  The syntax:
     34 //
     35 //   ACTION(name) { statements; }
     36 //
     37 // will define an action with the given name that executes the
     38 // statements.  The value returned by the statements will be used as
     39 // the return value of the action.  Inside the statements, you can
     40 // refer to the K-th (0-based) argument of the mock function by
     41 // 'argK', and refer to its type by 'argK_type'.  For example:
     42 //
     43 //   ACTION(IncrementArg1) {
     44 //     arg1_type temp = arg1;
     45 //     return ++(*temp);
     46 //   }
     47 //
     48 // allows you to write
     49 //
     50 //   ...WillOnce(IncrementArg1());
     51 //
     52 // You can also refer to the entire argument tuple and its type by
     53 // 'args' and 'args_type', and refer to the mock function type and its
     54 // return type by 'function_type' and 'return_type'.
     55 //
     56 // Note that you don't need to specify the types of the mock function
     57 // arguments.  However rest assured that your code is still type-safe:
     58 // you'll get a compiler error if *arg1 doesn't support the ++
     59 // operator, or if the type of ++(*arg1) isn't compatible with the
     60 // mock function's return type, for example.
     61 //
     62 // Sometimes you'll want to parameterize the action.   For that you can use
     63 // another macro:
     64 //
     65 //   ACTION_P(name, param_name) { statements; }
     66 //
     67 // For example:
     68 //
     69 //   ACTION_P(Add, n) { return arg0 + n; }
     70 //
     71 // will allow you to write:
     72 //
     73 //   ...WillOnce(Add(5));
     74 //
     75 // Note that you don't need to provide the type of the parameter
     76 // either.  If you need to reference the type of a parameter named
     77 // 'foo', you can write 'foo_type'.  For example, in the body of
     78 // ACTION_P(Add, n) above, you can write 'n_type' to refer to the type
     79 // of 'n'.
     80 //
     81 // We also provide ACTION_P2, ACTION_P3, ..., up to ACTION_P10 to support
     82 // multi-parameter actions.
     83 //
     84 // For the purpose of typing, you can view
     85 //
     86 //   ACTION_Pk(Foo, p1, ..., pk) { ... }
     87 //
     88 // as shorthand for
     89 //
     90 //   template <typename p1_type, ..., typename pk_type>
     91 //   FooActionPk<p1_type, ..., pk_type> Foo(p1_type p1, ..., pk_type pk) { ... }
     92 //
     93 // In particular, you can provide the template type arguments
     94 // explicitly when invoking Foo(), as in Foo<long, bool>(5, false);
     95 // although usually you can rely on the compiler to infer the types
     96 // for you automatically.  You can assign the result of expression
     97 // Foo(p1, ..., pk) to a variable of type FooActionPk<p1_type, ...,
     98 // pk_type>.  This can be useful when composing actions.
     99 //
    100 // You can also overload actions with different numbers of parameters:
    101 //
    102 //   ACTION_P(Plus, a) { ... }
    103 //   ACTION_P2(Plus, a, b) { ... }
    104 //
    105 // While it's tempting to always use the ACTION* macros when defining
    106 // a new action, you should also consider implementing ActionInterface
    107 // or using MakePolymorphicAction() instead, especially if you need to
    108 // use the action a lot.  While these approaches require more work,
    109 // they give you more control on the types of the mock function
    110 // arguments and the action parameters, which in general leads to
    111 // better compiler error messages that pay off in the long run.  They
    112 // also allow overloading actions based on parameter types (as opposed
    113 // to just based on the number of parameters).
    114 //
    115 // CAVEAT:
    116 //
    117 // ACTION*() can only be used in a namespace scope as templates cannot be
    118 // declared inside of a local class.
    119 // Users can, however, define any local functors (e.g. a lambda) that
    120 // can be used as actions.
    121 //
    122 // MORE INFORMATION:
    123 //
    124 // To learn more about using these macros, please search for 'ACTION' on
    125 // https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md
    126 
    127 // IWYU pragma: private, include "gmock/gmock.h"
    128 // IWYU pragma: friend gmock/.*
    129 
    130 #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
    131 #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_
    132 
    133 #ifndef _WIN32_WCE
    134 #include <errno.h>
    135 #endif
    136 
    137 #include <algorithm>
    138 #include <exception>
    139 #include <functional>
    140 #include <memory>
    141 #include <string>
    142 #include <tuple>
    143 #include <type_traits>
    144 #include <utility>
    145 
    146 #include "gmock/internal/gmock-internal-utils.h"
    147 #include "gmock/internal/gmock-port.h"
    148 #include "gmock/internal/gmock-pp.h"
    149 
    150 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
    151 
    152 namespace testing {
    153 
    154 // To implement an action Foo, define:
    155 //   1. a class FooAction that implements the ActionInterface interface, and
    156 //   2. a factory function that creates an Action object from a
    157 //      const FooAction*.
    158 //
    159 // The two-level delegation design follows that of Matcher, providing
    160 // consistency for extension developers.  It also eases ownership
    161 // management as Action objects can now be copied like plain values.
    162 
    163 namespace internal {
    164 
    165 // BuiltInDefaultValueGetter<T, true>::Get() returns a
    166 // default-constructed T value.  BuiltInDefaultValueGetter<T,
    167 // false>::Get() crashes with an error.
    168 //
    169 // This primary template is used when kDefaultConstructible is true.
    170 template <typename T, bool kDefaultConstructible>
    171 struct BuiltInDefaultValueGetter {
    172  static T Get() { return T(); }
    173 };
    174 template <typename T>
    175 struct BuiltInDefaultValueGetter<T, false> {
    176  static T Get() {
    177    Assert(false, __FILE__, __LINE__,
    178           "Default action undefined for the function return type.");
    179 #if defined(__GNUC__) || defined(__clang__)
    180    __builtin_unreachable();
    181 #elif defined(_MSC_VER)
    182    __assume(0);
    183 #else
    184    return Invalid<T>();
    185    // The above statement will never be reached, but is required in
    186    // order for this function to compile.
    187 #endif
    188  }
    189 };
    190 
    191 // BuiltInDefaultValue<T>::Get() returns the "built-in" default value
    192 // for type T, which is NULL when T is a raw pointer type, 0 when T is
    193 // a numeric type, false when T is bool, or "" when T is string or
    194 // std::string.  In addition, in C++11 and above, it turns a
    195 // default-constructed T value if T is default constructible.  For any
    196 // other type T, the built-in default T value is undefined, and the
    197 // function will abort the process.
    198 template <typename T>
    199 class BuiltInDefaultValue {
    200 public:
    201  // This function returns true if and only if type T has a built-in default
    202  // value.
    203  static bool Exists() { return ::std::is_default_constructible<T>::value; }
    204 
    205  static T Get() {
    206    return BuiltInDefaultValueGetter<
    207        T, ::std::is_default_constructible<T>::value>::Get();
    208  }
    209 };
    210 
    211 // This partial specialization says that we use the same built-in
    212 // default value for T and const T.
    213 template <typename T>
    214 class BuiltInDefaultValue<const T> {
    215 public:
    216  static bool Exists() { return BuiltInDefaultValue<T>::Exists(); }
    217  static T Get() { return BuiltInDefaultValue<T>::Get(); }
    218 };
    219 
    220 // This partial specialization defines the default values for pointer
    221 // types.
    222 template <typename T>
    223 class BuiltInDefaultValue<T*> {
    224 public:
    225  static bool Exists() { return true; }
    226  static T* Get() { return nullptr; }
    227 };
    228 
    229 // The following specializations define the default values for
    230 // specific types we care about.
    231 #define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \
    232  template <>                                                     \
    233  class BuiltInDefaultValue<type> {                               \
    234   public:                                                        \
    235    static bool Exists() { return true; }                         \
    236    static type Get() { return value; }                           \
    237  }
    238 
    239 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, );  // NOLINT
    240 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, "");
    241 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);
    242 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0');
    243 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0');
    244 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0');
    245 
    246 // There's no need for a default action for signed wchar_t, as that
    247 // type is the same as wchar_t for gcc, and invalid for MSVC.
    248 //
    249 // There's also no need for a default action for unsigned wchar_t, as
    250 // that type is the same as unsigned int for gcc, and invalid for
    251 // MSVC.
    252 #if GMOCK_WCHAR_T_IS_NATIVE_
    253 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U);  // NOLINT
    254 #endif
    255 
    256 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U);  // NOLINT
    257 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0);     // NOLINT
    258 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U);
    259 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0);
    260 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL);     // NOLINT
    261 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L);        // NOLINT
    262 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long long, 0);  // NOLINT
    263 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long long, 0);    // NOLINT
    264 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0);
    265 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0);
    266 
    267 #undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_
    268 
    269 // Partial implementations of metaprogramming types from the standard library
    270 // not available in C++11.
    271 
    272 template <typename P>
    273 struct negation
    274    // NOLINTNEXTLINE
    275    : std::integral_constant<bool, bool(!P::value)> {};
    276 
    277 // Base case: with zero predicates the answer is always true.
    278 template <typename...>
    279 struct conjunction : std::true_type {};
    280 
    281 // With a single predicate, the answer is that predicate.
    282 template <typename P1>
    283 struct conjunction<P1> : P1 {};
    284 
    285 // With multiple predicates the answer is the first predicate if that is false,
    286 // and we recurse otherwise.
    287 template <typename P1, typename... Ps>
    288 struct conjunction<P1, Ps...>
    289    : std::conditional<bool(P1::value), conjunction<Ps...>, P1>::type {};
    290 
    291 template <typename...>
    292 struct disjunction : std::false_type {};
    293 
    294 template <typename P1>
    295 struct disjunction<P1> : P1 {};
    296 
    297 template <typename P1, typename... Ps>
    298 struct disjunction<P1, Ps...>
    299    // NOLINTNEXTLINE
    300    : std::conditional<!bool(P1::value), disjunction<Ps...>, P1>::type {};
    301 
    302 template <typename...>
    303 using void_t = void;
    304 
    305 // Detects whether an expression of type `From` can be implicitly converted to
    306 // `To` according to [conv]. In C++17, [conv]/3 defines this as follows:
    307 //
    308 //     An expression e can be implicitly converted to a type T if and only if
    309 //     the declaration T t=e; is well-formed, for some invented temporary
    310 //     variable t ([dcl.init]).
    311 //
    312 // [conv]/2 implies we can use function argument passing to detect whether this
    313 // initialization is valid.
    314 //
    315 // Note that this is distinct from is_convertible, which requires this be valid:
    316 //
    317 //     To test() {
    318 //       return declval<From>();
    319 //     }
    320 //
    321 // In particular, is_convertible doesn't give the correct answer when `To` and
    322 // `From` are the same non-moveable type since `declval<From>` will be an rvalue
    323 // reference, defeating the guaranteed copy elision that would otherwise make
    324 // this function work.
    325 //
    326 // REQUIRES: `From` is not cv void.
    327 template <typename From, typename To>
    328 struct is_implicitly_convertible {
    329 private:
    330  // A function that accepts a parameter of type T. This can be called with type
    331  // U successfully only if U is implicitly convertible to T.
    332  template <typename T>
    333  static void Accept(T);
    334 
    335  // A function that creates a value of type T.
    336  template <typename T>
    337  static T Make();
    338 
    339  // An overload be selected when implicit conversion from T to To is possible.
    340  template <typename T, typename = decltype(Accept<To>(Make<T>()))>
    341  static std::true_type TestImplicitConversion(int);
    342 
    343  // A fallback overload selected in all other cases.
    344  template <typename T>
    345  static std::false_type TestImplicitConversion(...);
    346 
    347 public:
    348  using type = decltype(TestImplicitConversion<From>(0));
    349  static constexpr bool value = type::value;
    350 };
    351 
    352 // Like std::invoke_result_t from C++17, but works only for objects with call
    353 // operators (not e.g. member function pointers, which we don't need specific
    354 // support for in OnceAction because std::function deals with them).
    355 template <typename F, typename... Args>
    356 using call_result_t = decltype(std::declval<F>()(std::declval<Args>()...));
    357 
    358 template <typename Void, typename R, typename F, typename... Args>
    359 struct is_callable_r_impl : std::false_type {};
    360 
    361 // Specialize the struct for those template arguments where call_result_t is
    362 // well-formed. When it's not, the generic template above is chosen, resulting
    363 // in std::false_type.
    364 template <typename R, typename F, typename... Args>
    365 struct is_callable_r_impl<void_t<call_result_t<F, Args...>>, R, F, Args...>
    366    : std::conditional<
    367          std::is_void<R>::value,  //
    368          std::true_type,          //
    369          is_implicitly_convertible<call_result_t<F, Args...>, R>>::type {};
    370 
    371 // Like std::is_invocable_r from C++17, but works only for objects with call
    372 // operators. See the note on call_result_t.
    373 template <typename R, typename F, typename... Args>
    374 using is_callable_r = is_callable_r_impl<void, R, F, Args...>;
    375 
    376 // Like std::as_const from C++17.
    377 template <typename T>
    378 typename std::add_const<T>::type& as_const(T& t) {
    379  return t;
    380 }
    381 
    382 }  // namespace internal
    383 
    384 // Specialized for function types below.
    385 template <typename F>
    386 class OnceAction;
    387 
    388 // An action that can only be used once.
    389 //
    390 // This is accepted by WillOnce, which doesn't require the underlying action to
    391 // be copy-constructible (only move-constructible), and promises to invoke it as
    392 // an rvalue reference. This allows the action to work with move-only types like
    393 // std::move_only_function in a type-safe manner.
    394 //
    395 // For example:
    396 //
    397 //     // Assume we have some API that needs to accept a unique pointer to some
    398 //     // non-copyable object Foo.
    399 //     void AcceptUniquePointer(std::unique_ptr<Foo> foo);
    400 //
    401 //     // We can define an action that provides a Foo to that API. Because It
    402 //     // has to give away its unique pointer, it must not be called more than
    403 //     // once, so its call operator is &&-qualified.
    404 //     struct ProvideFoo {
    405 //       std::unique_ptr<Foo> foo;
    406 //
    407 //       void operator()() && {
    408 //         AcceptUniquePointer(std::move(Foo));
    409 //       }
    410 //     };
    411 //
    412 //     // This action can be used with WillOnce.
    413 //     EXPECT_CALL(mock, Call)
    414 //         .WillOnce(ProvideFoo{std::make_unique<Foo>(...)});
    415 //
    416 //     // But a call to WillRepeatedly will fail to compile. This is correct,
    417 //     // since the action cannot correctly be used repeatedly.
    418 //     EXPECT_CALL(mock, Call)
    419 //         .WillRepeatedly(ProvideFoo{std::make_unique<Foo>(...)});
    420 //
    421 // A less-contrived example would be an action that returns an arbitrary type,
    422 // whose &&-qualified call operator is capable of dealing with move-only types.
    423 template <typename Result, typename... Args>
    424 class OnceAction<Result(Args...)> final {
    425 private:
    426  // True iff we can use the given callable type (or lvalue reference) directly
    427  // via StdFunctionAdaptor.
    428  template <typename Callable>
    429  using IsDirectlyCompatible = internal::conjunction<
    430      // It must be possible to capture the callable in StdFunctionAdaptor.
    431      std::is_constructible<typename std::decay<Callable>::type, Callable>,
    432      // The callable must be compatible with our signature.
    433      internal::is_callable_r<Result, typename std::decay<Callable>::type,
    434                              Args...>>;
    435 
    436  // True iff we can use the given callable type via StdFunctionAdaptor once we
    437  // ignore incoming arguments.
    438  template <typename Callable>
    439  using IsCompatibleAfterIgnoringArguments = internal::conjunction<
    440      // It must be possible to capture the callable in a lambda.
    441      std::is_constructible<typename std::decay<Callable>::type, Callable>,
    442      // The callable must be invocable with zero arguments, returning something
    443      // convertible to Result.
    444      internal::is_callable_r<Result, typename std::decay<Callable>::type>>;
    445 
    446 public:
    447  // Construct from a callable that is directly compatible with our mocked
    448  // signature: it accepts our function type's arguments and returns something
    449  // convertible to our result type.
    450  template <typename Callable,
    451            typename std::enable_if<
    452                internal::conjunction<
    453                    // Teach clang on macOS that we're not talking about a
    454                    // copy/move constructor here. Otherwise it gets confused
    455                    // when checking the is_constructible requirement of our
    456                    // traits above.
    457                    internal::negation<std::is_same<
    458                        OnceAction, typename std::decay<Callable>::type>>,
    459                    IsDirectlyCompatible<Callable>>  //
    460                ::value,
    461                int>::type = 0>
    462  OnceAction(Callable&& callable)  // NOLINT
    463      : function_(StdFunctionAdaptor<typename std::decay<Callable>::type>(
    464            {}, std::forward<Callable>(callable))) {}
    465 
    466  // As above, but for a callable that ignores the mocked function's arguments.
    467  template <typename Callable,
    468            typename std::enable_if<
    469                internal::conjunction<
    470                    // Teach clang on macOS that we're not talking about a
    471                    // copy/move constructor here. Otherwise it gets confused
    472                    // when checking the is_constructible requirement of our
    473                    // traits above.
    474                    internal::negation<std::is_same<
    475                        OnceAction, typename std::decay<Callable>::type>>,
    476                    // Exclude callables for which the overload above works.
    477                    // We'd rather provide the arguments if possible.
    478                    internal::negation<IsDirectlyCompatible<Callable>>,
    479                    IsCompatibleAfterIgnoringArguments<Callable>>::value,
    480                int>::type = 0>
    481  OnceAction(Callable&& callable)  // NOLINT
    482                                   // Call the constructor above with a callable
    483                                   // that ignores the input arguments.
    484      : OnceAction(IgnoreIncomingArguments<typename std::decay<Callable>::type>{
    485            std::forward<Callable>(callable)}) {}
    486 
    487  // We are naturally copyable because we store only an std::function, but
    488  // semantically we should not be copyable.
    489  OnceAction(const OnceAction&) = delete;
    490  OnceAction& operator=(const OnceAction&) = delete;
    491  OnceAction(OnceAction&&) = default;
    492 
    493  // Invoke the underlying action callable with which we were constructed,
    494  // handing it the supplied arguments.
    495  Result Call(Args... args) && {
    496    return function_(std::forward<Args>(args)...);
    497  }
    498 
    499 private:
    500  // An adaptor that wraps a callable that is compatible with our signature and
    501  // being invoked as an rvalue reference so that it can be used as an
    502  // StdFunctionAdaptor. This throws away type safety, but that's fine because
    503  // this is only used by WillOnce, which we know calls at most once.
    504  //
    505  // Once we have something like std::move_only_function from C++23, we can do
    506  // away with this.
    507  template <typename Callable>
    508  class StdFunctionAdaptor final {
    509   public:
    510    // A tag indicating that the (otherwise universal) constructor is accepting
    511    // the callable itself, instead of e.g. stealing calls for the move
    512    // constructor.
    513    struct CallableTag final {};
    514 
    515    template <typename F>
    516    explicit StdFunctionAdaptor(CallableTag, F&& callable)
    517        : callable_(std::make_shared<Callable>(std::forward<F>(callable))) {}
    518 
    519    // Rather than explicitly returning Result, we return whatever the wrapped
    520    // callable returns. This allows for compatibility with existing uses like
    521    // the following, when the mocked function returns void:
    522    //
    523    //     EXPECT_CALL(mock_fn_, Call)
    524    //         .WillOnce([&] {
    525    //            [...]
    526    //            return 0;
    527    //         });
    528    //
    529    // Such a callable can be turned into std::function<void()>. If we use an
    530    // explicit return type of Result here then it *doesn't* work with
    531    // std::function, because we'll get a "void function should not return a
    532    // value" error.
    533    //
    534    // We need not worry about incompatible result types because the SFINAE on
    535    // OnceAction already checks this for us. std::is_invocable_r_v itself makes
    536    // the same allowance for void result types.
    537    template <typename... ArgRefs>
    538    internal::call_result_t<Callable, ArgRefs...> operator()(
    539        ArgRefs&&... args) const {
    540      return std::move(*callable_)(std::forward<ArgRefs>(args)...);
    541    }
    542 
    543   private:
    544    // We must put the callable on the heap so that we are copyable, which
    545    // std::function needs.
    546    std::shared_ptr<Callable> callable_;
    547  };
    548 
    549  // An adaptor that makes a callable that accepts zero arguments callable with
    550  // our mocked arguments.
    551  template <typename Callable>
    552  struct IgnoreIncomingArguments {
    553    internal::call_result_t<Callable> operator()(Args&&...) {
    554      return std::move(callable)();
    555    }
    556 
    557    Callable callable;
    558  };
    559 
    560  std::function<Result(Args...)> function_;
    561 };
    562 
    563 // When an unexpected function call is encountered, Google Mock will
    564 // let it return a default value if the user has specified one for its
    565 // return type, or if the return type has a built-in default value;
    566 // otherwise Google Mock won't know what value to return and will have
    567 // to abort the process.
    568 //
    569 // The DefaultValue<T> class allows a user to specify the
    570 // default value for a type T that is both copyable and publicly
    571 // destructible (i.e. anything that can be used as a function return
    572 // type).  The usage is:
    573 //
    574 //   // Sets the default value for type T to be foo.
    575 //   DefaultValue<T>::Set(foo);
    576 template <typename T>
    577 class DefaultValue {
    578 public:
    579  // Sets the default value for type T; requires T to be
    580  // copy-constructable and have a public destructor.
    581  static void Set(T x) {
    582    delete producer_;
    583    producer_ = new FixedValueProducer(x);
    584  }
    585 
    586  // Provides a factory function to be called to generate the default value.
    587  // This method can be used even if T is only move-constructible, but it is not
    588  // limited to that case.
    589  typedef T (*FactoryFunction)();
    590  static void SetFactory(FactoryFunction factory) {
    591    delete producer_;
    592    producer_ = new FactoryValueProducer(factory);
    593  }
    594 
    595  // Unsets the default value for type T.
    596  static void Clear() {
    597    delete producer_;
    598    producer_ = nullptr;
    599  }
    600 
    601  // Returns true if and only if the user has set the default value for type T.
    602  static bool IsSet() { return producer_ != nullptr; }
    603 
    604  // Returns true if T has a default return value set by the user or there
    605  // exists a built-in default value.
    606  static bool Exists() {
    607    return IsSet() || internal::BuiltInDefaultValue<T>::Exists();
    608  }
    609 
    610  // Returns the default value for type T if the user has set one;
    611  // otherwise returns the built-in default value. Requires that Exists()
    612  // is true, which ensures that the return value is well-defined.
    613  static T Get() {
    614    return producer_ == nullptr ? internal::BuiltInDefaultValue<T>::Get()
    615                                : producer_->Produce();
    616  }
    617 
    618 private:
    619  class ValueProducer {
    620   public:
    621    virtual ~ValueProducer() = default;
    622    virtual T Produce() = 0;
    623  };
    624 
    625  class FixedValueProducer : public ValueProducer {
    626   public:
    627    explicit FixedValueProducer(T value) : value_(value) {}
    628    T Produce() override { return value_; }
    629 
    630   private:
    631    const T value_;
    632    FixedValueProducer(const FixedValueProducer&) = delete;
    633    FixedValueProducer& operator=(const FixedValueProducer&) = delete;
    634  };
    635 
    636  class FactoryValueProducer : public ValueProducer {
    637   public:
    638    explicit FactoryValueProducer(FactoryFunction factory)
    639        : factory_(factory) {}
    640    T Produce() override { return factory_(); }
    641 
    642   private:
    643    const FactoryFunction factory_;
    644    FactoryValueProducer(const FactoryValueProducer&) = delete;
    645    FactoryValueProducer& operator=(const FactoryValueProducer&) = delete;
    646  };
    647 
    648  static ValueProducer* producer_;
    649 };
    650 
    651 // This partial specialization allows a user to set default values for
    652 // reference types.
    653 template <typename T>
    654 class DefaultValue<T&> {
    655 public:
    656  // Sets the default value for type T&.
    657  static void Set(T& x) {  // NOLINT
    658    address_ = &x;
    659  }
    660 
    661  // Unsets the default value for type T&.
    662  static void Clear() { address_ = nullptr; }
    663 
    664  // Returns true if and only if the user has set the default value for type T&.
    665  static bool IsSet() { return address_ != nullptr; }
    666 
    667  // Returns true if T has a default return value set by the user or there
    668  // exists a built-in default value.
    669  static bool Exists() {
    670    return IsSet() || internal::BuiltInDefaultValue<T&>::Exists();
    671  }
    672 
    673  // Returns the default value for type T& if the user has set one;
    674  // otherwise returns the built-in default value if there is one;
    675  // otherwise aborts the process.
    676  static T& Get() {
    677    return address_ == nullptr ? internal::BuiltInDefaultValue<T&>::Get()
    678                               : *address_;
    679  }
    680 
    681 private:
    682  static T* address_;
    683 };
    684 
    685 // This specialization allows DefaultValue<void>::Get() to
    686 // compile.
    687 template <>
    688 class DefaultValue<void> {
    689 public:
    690  static bool Exists() { return true; }
    691  static void Get() {}
    692 };
    693 
    694 // Points to the user-set default value for type T.
    695 template <typename T>
    696 typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = nullptr;
    697 
    698 // Points to the user-set default value for type T&.
    699 template <typename T>
    700 T* DefaultValue<T&>::address_ = nullptr;
    701 
    702 // Implement this interface to define an action for function type F.
    703 template <typename F>
    704 class ActionInterface {
    705 public:
    706  typedef typename internal::Function<F>::Result Result;
    707  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
    708 
    709  ActionInterface() = default;
    710  virtual ~ActionInterface() = default;
    711 
    712  // Performs the action.  This method is not const, as in general an
    713  // action can have side effects and be stateful.  For example, a
    714  // get-the-next-element-from-the-collection action will need to
    715  // remember the current element.
    716  virtual Result Perform(const ArgumentTuple& args) = 0;
    717 
    718 private:
    719  ActionInterface(const ActionInterface&) = delete;
    720  ActionInterface& operator=(const ActionInterface&) = delete;
    721 };
    722 
    723 template <typename F>
    724 class Action;
    725 
    726 // An Action<R(Args...)> is a copyable and IMMUTABLE (except by assignment)
    727 // object that represents an action to be taken when a mock function of type
    728 // R(Args...) is called. The implementation of Action<T> is just a
    729 // std::shared_ptr to const ActionInterface<T>. Don't inherit from Action! You
    730 // can view an object implementing ActionInterface<F> as a concrete action
    731 // (including its current state), and an Action<F> object as a handle to it.
    732 template <typename R, typename... Args>
    733 class Action<R(Args...)> {
    734 private:
    735  using F = R(Args...);
    736 
    737  // Adapter class to allow constructing Action from a legacy ActionInterface.
    738  // New code should create Actions from functors instead.
    739  struct ActionAdapter {
    740    // Adapter must be copyable to satisfy std::function requirements.
    741    ::std::shared_ptr<ActionInterface<F>> impl_;
    742 
    743    template <typename... InArgs>
    744    typename internal::Function<F>::Result operator()(InArgs&&... args) {
    745      return impl_->Perform(
    746          ::std::forward_as_tuple(::std::forward<InArgs>(args)...));
    747    }
    748  };
    749 
    750  template <typename G>
    751  using IsCompatibleFunctor = std::is_constructible<std::function<F>, G>;
    752 
    753 public:
    754  typedef typename internal::Function<F>::Result Result;
    755  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
    756 
    757  // Constructs a null Action.  Needed for storing Action objects in
    758  // STL containers.
    759  Action() = default;
    760 
    761  // Construct an Action from a specified callable.
    762  // This cannot take std::function directly, because then Action would not be
    763  // directly constructible from lambda (it would require two conversions).
    764  template <
    765      typename G,
    766      typename = typename std::enable_if<internal::disjunction<
    767          IsCompatibleFunctor<G>, std::is_constructible<std::function<Result()>,
    768                                                        G>>::value>::type>
    769  Action(G&& fun) {  // NOLINT
    770    Init(::std::forward<G>(fun), IsCompatibleFunctor<G>());
    771  }
    772 
    773  // Constructs an Action from its implementation.
    774  explicit Action(ActionInterface<F>* impl)
    775      : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}
    776 
    777  // This constructor allows us to turn an Action<Func> object into an
    778  // Action<F>, as long as F's arguments can be implicitly converted
    779  // to Func's and Func's return type can be implicitly converted to F's.
    780  template <typename Func>
    781  Action(const Action<Func>& action)  // NOLINT
    782      : fun_(action.fun_) {}
    783 
    784  // Returns true if and only if this is the DoDefault() action.
    785  bool IsDoDefault() const { return fun_ == nullptr; }
    786 
    787  // Performs the action.  Note that this method is const even though
    788  // the corresponding method in ActionInterface is not.  The reason
    789  // is that a const Action<F> means that it cannot be re-bound to
    790  // another concrete action, not that the concrete action it binds to
    791  // cannot change state.  (Think of the difference between a const
    792  // pointer and a pointer to const.)
    793  Result Perform(ArgumentTuple args) const {
    794    if (IsDoDefault()) {
    795      internal::IllegalDoDefault(__FILE__, __LINE__);
    796    }
    797    return internal::Apply(fun_, ::std::move(args));
    798  }
    799 
    800  // An action can be used as a OnceAction, since it's obviously safe to call it
    801  // once.
    802  operator OnceAction<F>() const {  // NOLINT
    803    // Return a OnceAction-compatible callable that calls Perform with the
    804    // arguments it is provided. We could instead just return fun_, but then
    805    // we'd need to handle the IsDoDefault() case separately.
    806    struct OA {
    807      Action<F> action;
    808 
    809      R operator()(Args... args) && {
    810        return action.Perform(
    811            std::forward_as_tuple(std::forward<Args>(args)...));
    812      }
    813    };
    814 
    815    return OA{*this};
    816  }
    817 
    818 private:
    819  template <typename G>
    820  friend class Action;
    821 
    822  template <typename G>
    823  void Init(G&& g, ::std::true_type) {
    824    fun_ = ::std::forward<G>(g);
    825  }
    826 
    827  template <typename G>
    828  void Init(G&& g, ::std::false_type) {
    829    fun_ = IgnoreArgs<typename ::std::decay<G>::type>{::std::forward<G>(g)};
    830  }
    831 
    832  template <typename FunctionImpl>
    833  struct IgnoreArgs {
    834    template <typename... InArgs>
    835    Result operator()(const InArgs&...) const {
    836      return function_impl();
    837    }
    838    template <typename... InArgs>
    839    Result operator()(const InArgs&...) {
    840      return function_impl();
    841    }
    842 
    843    FunctionImpl function_impl;
    844  };
    845 
    846  // fun_ is an empty function if and only if this is the DoDefault() action.
    847  ::std::function<F> fun_;
    848 };
    849 
    850 // The PolymorphicAction class template makes it easy to implement a
    851 // polymorphic action (i.e. an action that can be used in mock
    852 // functions of than one type, e.g. Return()).
    853 //
    854 // To define a polymorphic action, a user first provides a COPYABLE
    855 // implementation class that has a Perform() method template:
    856 //
    857 //   class FooAction {
    858 //    public:
    859 //     template <typename Result, typename ArgumentTuple>
    860 //     Result Perform(const ArgumentTuple& args) const {
    861 //       // Processes the arguments and returns a result, using
    862 //       // std::get<N>(args) to get the N-th (0-based) argument in the tuple.
    863 //     }
    864 //     ...
    865 //   };
    866 //
    867 // Then the user creates the polymorphic action using
    868 // MakePolymorphicAction(object) where object has type FooAction.  See
    869 // the definition of Return(void) and SetArgumentPointee<N>(value) for
    870 // complete examples.
    871 template <typename Impl>
    872 class PolymorphicAction {
    873 public:
    874  explicit PolymorphicAction(const Impl& impl) : impl_(impl) {}
    875 
    876  template <typename F>
    877  operator Action<F>() const {
    878    return Action<F>(new MonomorphicImpl<F>(impl_));
    879  }
    880 
    881 private:
    882  template <typename F>
    883  class MonomorphicImpl : public ActionInterface<F> {
    884   public:
    885    typedef typename internal::Function<F>::Result Result;
    886    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
    887 
    888    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}
    889 
    890    Result Perform(const ArgumentTuple& args) override {
    891      return impl_.template Perform<Result>(args);
    892    }
    893 
    894   private:
    895    Impl impl_;
    896  };
    897 
    898  Impl impl_;
    899 };
    900 
    901 // Creates an Action from its implementation and returns it.  The
    902 // created Action object owns the implementation.
    903 template <typename F>
    904 Action<F> MakeAction(ActionInterface<F>* impl) {
    905  return Action<F>(impl);
    906 }
    907 
    908 // Creates a polymorphic action from its implementation.  This is
    909 // easier to use than the PolymorphicAction<Impl> constructor as it
    910 // doesn't require you to explicitly write the template argument, e.g.
    911 //
    912 //   MakePolymorphicAction(foo);
    913 // vs
    914 //   PolymorphicAction<TypeOfFoo>(foo);
    915 template <typename Impl>
    916 inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {
    917  return PolymorphicAction<Impl>(impl);
    918 }
    919 
    920 namespace internal {
    921 
    922 // Helper struct to specialize ReturnAction to execute a move instead of a copy
    923 // on return. Useful for move-only types, but could be used on any type.
    924 template <typename T>
    925 struct ByMoveWrapper {
    926  explicit ByMoveWrapper(T value) : payload(std::move(value)) {}
    927  T payload;
    928 };
    929 
    930 // The general implementation of Return(R). Specializations follow below.
    931 template <typename R>
    932 class ReturnAction final {
    933 public:
    934  explicit ReturnAction(R value) : value_(std::move(value)) {}
    935 
    936  template <typename U, typename... Args,
    937            typename = typename std::enable_if<conjunction<
    938                // See the requirements documented on Return.
    939                negation<std::is_same<void, U>>,  //
    940                negation<std::is_reference<U>>,   //
    941                std::is_convertible<R, U>,        //
    942                std::is_move_constructible<U>>::value>::type>
    943  operator OnceAction<U(Args...)>() && {  // NOLINT
    944    return Impl<U>(std::move(value_));
    945  }
    946 
    947  template <typename U, typename... Args,
    948            typename = typename std::enable_if<conjunction<
    949                // See the requirements documented on Return.
    950                negation<std::is_same<void, U>>,   //
    951                negation<std::is_reference<U>>,    //
    952                std::is_convertible<const R&, U>,  //
    953                std::is_copy_constructible<U>>::value>::type>
    954  operator Action<U(Args...)>() const {  // NOLINT
    955    return Impl<U>(value_);
    956  }
    957 
    958 private:
    959  // Implements the Return(x) action for a mock function that returns type U.
    960  template <typename U>
    961  class Impl final {
    962   public:
    963    // The constructor used when the return value is allowed to move from the
    964    // input value (i.e. we are converting to OnceAction).
    965    explicit Impl(R&& input_value)
    966        : state_(new State(std::move(input_value))) {}
    967 
    968    // The constructor used when the return value is not allowed to move from
    969    // the input value (i.e. we are converting to Action).
    970    explicit Impl(const R& input_value) : state_(new State(input_value)) {}
    971 
    972    U operator()() && { return std::move(state_->value); }
    973    U operator()() const& { return state_->value; }
    974 
    975   private:
    976    // We put our state on the heap so that the compiler-generated copy/move
    977    // constructors work correctly even when U is a reference-like type. This is
    978    // necessary only because we eagerly create State::value (see the note on
    979    // that symbol for details). If we instead had only the input value as a
    980    // member then the default constructors would work fine.
    981    //
    982    // For example, when R is std::string and U is std::string_view, value is a
    983    // reference to the string backed by input_value. The copy constructor would
    984    // copy both, so that we wind up with a new input_value object (with the
    985    // same contents) and a reference to the *old* input_value object rather
    986    // than the new one.
    987    struct State {
    988      explicit State(const R& input_value_in)
    989          : input_value(input_value_in),
    990            // Make an implicit conversion to Result before initializing the U
    991            // object we store, avoiding calling any explicit constructor of U
    992            // from R.
    993            //
    994            // This simulates the language rules: a function with return type U
    995            // that does `return R()` requires R to be implicitly convertible to
    996            // U, and uses that path for the conversion, even U Result has an
    997            // explicit constructor from R.
    998            value(ImplicitCast_<U>(internal::as_const(input_value))) {}
    999 
   1000      // As above, but for the case where we're moving from the ReturnAction
   1001      // object because it's being used as a OnceAction.
   1002      explicit State(R&& input_value_in)
   1003          : input_value(std::move(input_value_in)),
   1004            // For the same reason as above we make an implicit conversion to U
   1005            // before initializing the value.
   1006            //
   1007            // Unlike above we provide the input value as an rvalue to the
   1008            // implicit conversion because this is a OnceAction: it's fine if it
   1009            // wants to consume the input value.
   1010            value(ImplicitCast_<U>(std::move(input_value))) {}
   1011 
   1012      // A copy of the value originally provided by the user. We retain this in
   1013      // addition to the value of the mock function's result type below in case
   1014      // the latter is a reference-like type. See the std::string_view example
   1015      // in the documentation on Return.
   1016      R input_value;
   1017 
   1018      // The value we actually return, as the type returned by the mock function
   1019      // itself.
   1020      //
   1021      // We eagerly initialize this here, rather than lazily doing the implicit
   1022      // conversion automatically each time Perform is called, for historical
   1023      // reasons: in 2009-11, commit a070cbd91c (Google changelist 13540126)
   1024      // made the Action<U()> conversion operator eagerly convert the R value to
   1025      // U, but without keeping the R alive. This broke the use case discussed
   1026      // in the documentation for Return, making reference-like types such as
   1027      // std::string_view not safe to use as U where the input type R is a
   1028      // value-like type such as std::string.
   1029      //
   1030      // The example the commit gave was not very clear, nor was the issue
   1031      // thread (https://github.com/google/googlemock/issues/86), but it seems
   1032      // the worry was about reference-like input types R that flatten to a
   1033      // value-like type U when being implicitly converted. An example of this
   1034      // is std::vector<bool>::reference, which is often a proxy type with an
   1035      // reference to the underlying vector:
   1036      //
   1037      //     // Helper method: have the mock function return bools according
   1038      //     // to the supplied script.
   1039      //     void SetActions(MockFunction<bool(size_t)>& mock,
   1040      //                     const std::vector<bool>& script) {
   1041      //       for (size_t i = 0; i < script.size(); ++i) {
   1042      //         EXPECT_CALL(mock, Call(i)).WillOnce(Return(script[i]));
   1043      //       }
   1044      //     }
   1045      //
   1046      //     TEST(Foo, Bar) {
   1047      //       // Set actions using a temporary vector, whose operator[]
   1048      //       // returns proxy objects that references that will be
   1049      //       // dangling once the call to SetActions finishes and the
   1050      //       // vector is destroyed.
   1051      //       MockFunction<bool(size_t)> mock;
   1052      //       SetActions(mock, {false, true});
   1053      //
   1054      //       EXPECT_FALSE(mock.AsStdFunction()(0));
   1055      //       EXPECT_TRUE(mock.AsStdFunction()(1));
   1056      //     }
   1057      //
   1058      // This eager conversion helps with a simple case like this, but doesn't
   1059      // fully make these types work in general. For example the following still
   1060      // uses a dangling reference:
   1061      //
   1062      //     TEST(Foo, Baz) {
   1063      //       MockFunction<std::vector<std::string>()> mock;
   1064      //
   1065      //       // Return the same vector twice, and then the empty vector
   1066      //       // thereafter.
   1067      //       auto action = Return(std::initializer_list<std::string>{
   1068      //           "taco", "burrito",
   1069      //       });
   1070      //
   1071      //       EXPECT_CALL(mock, Call)
   1072      //           .WillOnce(action)
   1073      //           .WillOnce(action)
   1074      //           .WillRepeatedly(Return(std::vector<std::string>{}));
   1075      //
   1076      //       EXPECT_THAT(mock.AsStdFunction()(),
   1077      //                   ElementsAre("taco", "burrito"));
   1078      //       EXPECT_THAT(mock.AsStdFunction()(),
   1079      //                   ElementsAre("taco", "burrito"));
   1080      //       EXPECT_THAT(mock.AsStdFunction()(), IsEmpty());
   1081      //     }
   1082      //
   1083      U value;
   1084    };
   1085 
   1086    const std::shared_ptr<State> state_;
   1087  };
   1088 
   1089  R value_;
   1090 };
   1091 
   1092 // A specialization of ReturnAction<R> when R is ByMoveWrapper<T> for some T.
   1093 //
   1094 // This version applies the type system-defeating hack of moving from T even in
   1095 // the const call operator, checking at runtime that it isn't called more than
   1096 // once, since the user has declared their intent to do so by using ByMove.
   1097 template <typename T>
   1098 class ReturnAction<ByMoveWrapper<T>> final {
   1099 public:
   1100  explicit ReturnAction(ByMoveWrapper<T> wrapper)
   1101      : state_(new State(std::move(wrapper.payload))) {}
   1102 
   1103  T operator()() const {
   1104    GTEST_CHECK_(!state_->called)
   1105        << "A ByMove() action must be performed at most once.";
   1106 
   1107    state_->called = true;
   1108    return std::move(state_->value);
   1109  }
   1110 
   1111 private:
   1112  // We store our state on the heap so that we are copyable as required by
   1113  // Action, despite the fact that we are stateful and T may not be copyable.
   1114  struct State {
   1115    explicit State(T&& value_in) : value(std::move(value_in)) {}
   1116 
   1117    T value;
   1118    bool called = false;
   1119  };
   1120 
   1121  const std::shared_ptr<State> state_;
   1122 };
   1123 
   1124 // Implements the ReturnNull() action.
   1125 class ReturnNullAction {
   1126 public:
   1127  // Allows ReturnNull() to be used in any pointer-returning function. In C++11
   1128  // this is enforced by returning nullptr, and in non-C++11 by asserting a
   1129  // pointer type on compile time.
   1130  template <typename Result, typename ArgumentTuple>
   1131  static Result Perform(const ArgumentTuple&) {
   1132    return nullptr;
   1133  }
   1134 };
   1135 
   1136 // Implements the Return() action.
   1137 class ReturnVoidAction {
   1138 public:
   1139  // Allows Return() to be used in any void-returning function.
   1140  template <typename Result, typename ArgumentTuple>
   1141  static void Perform(const ArgumentTuple&) {
   1142    static_assert(std::is_void<Result>::value, "Result should be void.");
   1143  }
   1144 };
   1145 
   1146 // Implements the polymorphic ReturnRef(x) action, which can be used
   1147 // in any function that returns a reference to the type of x,
   1148 // regardless of the argument types.
   1149 template <typename T>
   1150 class ReturnRefAction {
   1151 public:
   1152  // Constructs a ReturnRefAction object from the reference to be returned.
   1153  explicit ReturnRefAction(T& ref) : ref_(ref) {}  // NOLINT
   1154 
   1155  // This template type conversion operator allows ReturnRef(x) to be
   1156  // used in ANY function that returns a reference to x's type.
   1157  template <typename F>
   1158  operator Action<F>() const {
   1159    typedef typename Function<F>::Result Result;
   1160    // Asserts that the function return type is a reference.  This
   1161    // catches the user error of using ReturnRef(x) when Return(x)
   1162    // should be used, and generates some helpful error message.
   1163    static_assert(std::is_reference<Result>::value,
   1164                  "use Return instead of ReturnRef to return a value");
   1165    return Action<F>(new Impl<F>(ref_));
   1166  }
   1167 
   1168 private:
   1169  // Implements the ReturnRef(x) action for a particular function type F.
   1170  template <typename F>
   1171  class Impl : public ActionInterface<F> {
   1172   public:
   1173    typedef typename Function<F>::Result Result;
   1174    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
   1175 
   1176    explicit Impl(T& ref) : ref_(ref) {}  // NOLINT
   1177 
   1178    Result Perform(const ArgumentTuple&) override { return ref_; }
   1179 
   1180   private:
   1181    T& ref_;
   1182  };
   1183 
   1184  T& ref_;
   1185 };
   1186 
   1187 // Implements the polymorphic ReturnRefOfCopy(x) action, which can be
   1188 // used in any function that returns a reference to the type of x,
   1189 // regardless of the argument types.
   1190 template <typename T>
   1191 class ReturnRefOfCopyAction {
   1192 public:
   1193  // Constructs a ReturnRefOfCopyAction object from the reference to
   1194  // be returned.
   1195  explicit ReturnRefOfCopyAction(const T& value) : value_(value) {}  // NOLINT
   1196 
   1197  // This template type conversion operator allows ReturnRefOfCopy(x) to be
   1198  // used in ANY function that returns a reference to x's type.
   1199  template <typename F>
   1200  operator Action<F>() const {
   1201    typedef typename Function<F>::Result Result;
   1202    // Asserts that the function return type is a reference.  This
   1203    // catches the user error of using ReturnRefOfCopy(x) when Return(x)
   1204    // should be used, and generates some helpful error message.
   1205    static_assert(std::is_reference<Result>::value,
   1206                  "use Return instead of ReturnRefOfCopy to return a value");
   1207    return Action<F>(new Impl<F>(value_));
   1208  }
   1209 
   1210 private:
   1211  // Implements the ReturnRefOfCopy(x) action for a particular function type F.
   1212  template <typename F>
   1213  class Impl : public ActionInterface<F> {
   1214   public:
   1215    typedef typename Function<F>::Result Result;
   1216    typedef typename Function<F>::ArgumentTuple ArgumentTuple;
   1217 
   1218    explicit Impl(const T& value) : value_(value) {}  // NOLINT
   1219 
   1220    Result Perform(const ArgumentTuple&) override { return value_; }
   1221 
   1222   private:
   1223    T value_;
   1224  };
   1225 
   1226  const T value_;
   1227 };
   1228 
   1229 // Implements the polymorphic ReturnRoundRobin(v) action, which can be
   1230 // used in any function that returns the element_type of v.
   1231 template <typename T>
   1232 class ReturnRoundRobinAction {
   1233 public:
   1234  explicit ReturnRoundRobinAction(std::vector<T> values) {
   1235    GTEST_CHECK_(!values.empty())
   1236        << "ReturnRoundRobin requires at least one element.";
   1237    state_->values = std::move(values);
   1238  }
   1239 
   1240  template <typename... Args>
   1241  T operator()(Args&&...) const {
   1242    return state_->Next();
   1243  }
   1244 
   1245 private:
   1246  struct State {
   1247    T Next() {
   1248      T ret_val = values[i++];
   1249      if (i == values.size()) i = 0;
   1250      return ret_val;
   1251    }
   1252 
   1253    std::vector<T> values;
   1254    size_t i = 0;
   1255  };
   1256  std::shared_ptr<State> state_ = std::make_shared<State>();
   1257 };
   1258 
   1259 // Implements the polymorphic DoDefault() action.
   1260 class DoDefaultAction {
   1261 public:
   1262  // This template type conversion operator allows DoDefault() to be
   1263  // used in any function.
   1264  template <typename F>
   1265  operator Action<F>() const {
   1266    return Action<F>();
   1267  }  // NOLINT
   1268 };
   1269 
   1270 // Implements the Assign action to set a given pointer referent to a
   1271 // particular value.
   1272 template <typename T1, typename T2>
   1273 class AssignAction {
   1274 public:
   1275  AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {}
   1276 
   1277  template <typename Result, typename ArgumentTuple>
   1278  void Perform(const ArgumentTuple& /* args */) const {
   1279    *ptr_ = value_;
   1280  }
   1281 
   1282 private:
   1283  T1* const ptr_;
   1284  const T2 value_;
   1285 };
   1286 
   1287 #ifndef GTEST_OS_WINDOWS_MOBILE
   1288 
   1289 // Implements the SetErrnoAndReturn action to simulate return from
   1290 // various system calls and libc functions.
   1291 template <typename T>
   1292 class SetErrnoAndReturnAction {
   1293 public:
   1294  SetErrnoAndReturnAction(int errno_value, T result)
   1295      : errno_(errno_value), result_(result) {}
   1296  template <typename Result, typename ArgumentTuple>
   1297  Result Perform(const ArgumentTuple& /* args */) const {
   1298    errno = errno_;
   1299    return result_;
   1300  }
   1301 
   1302 private:
   1303  const int errno_;
   1304  const T result_;
   1305 };
   1306 
   1307 #endif  // !GTEST_OS_WINDOWS_MOBILE
   1308 
   1309 // Implements the SetArgumentPointee<N>(x) action for any function
   1310 // whose N-th argument (0-based) is a pointer to x's type.
   1311 template <size_t N, typename A, typename = void>
   1312 struct SetArgumentPointeeAction {
   1313  A value;
   1314 
   1315  template <typename... Args>
   1316  void operator()(const Args&... args) const {
   1317    *::std::get<N>(std::tie(args...)) = value;
   1318  }
   1319 };
   1320 
   1321 // Implements the Invoke(object_ptr, &Class::Method) action.
   1322 template <class Class, typename MethodPtr>
   1323 struct InvokeMethodAction {
   1324  Class* const obj_ptr;
   1325  const MethodPtr method_ptr;
   1326 
   1327  template <typename... Args>
   1328  auto operator()(Args&&... args) const
   1329      -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {
   1330    return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);
   1331  }
   1332 };
   1333 
   1334 // Implements the InvokeWithoutArgs(f) action.  The template argument
   1335 // FunctionImpl is the implementation type of f, which can be either a
   1336 // function pointer or a functor.  InvokeWithoutArgs(f) can be used as an
   1337 // Action<F> as long as f's type is compatible with F.
   1338 template <typename FunctionImpl>
   1339 struct InvokeWithoutArgsAction {
   1340  FunctionImpl function_impl;
   1341 
   1342  // Allows InvokeWithoutArgs(f) to be used as any action whose type is
   1343  // compatible with f.
   1344  template <typename... Args>
   1345  auto operator()(const Args&...) -> decltype(function_impl()) {
   1346    return function_impl();
   1347  }
   1348 };
   1349 
   1350 // Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.
   1351 template <class Class, typename MethodPtr>
   1352 struct InvokeMethodWithoutArgsAction {
   1353  Class* const obj_ptr;
   1354  const MethodPtr method_ptr;
   1355 
   1356  using ReturnType =
   1357      decltype((std::declval<Class*>()->*std::declval<MethodPtr>())());
   1358 
   1359  template <typename... Args>
   1360  ReturnType operator()(const Args&...) const {
   1361    return (obj_ptr->*method_ptr)();
   1362  }
   1363 };
   1364 
   1365 // Implements the IgnoreResult(action) action.
   1366 template <typename A>
   1367 class IgnoreResultAction {
   1368 public:
   1369  explicit IgnoreResultAction(const A& action) : action_(action) {}
   1370 
   1371  template <typename F>
   1372  operator Action<F>() const {
   1373    // Assert statement belongs here because this is the best place to verify
   1374    // conditions on F. It produces the clearest error messages
   1375    // in most compilers.
   1376    // Impl really belongs in this scope as a local class but can't
   1377    // because MSVC produces duplicate symbols in different translation units
   1378    // in this case. Until MS fixes that bug we put Impl into the class scope
   1379    // and put the typedef both here (for use in assert statement) and
   1380    // in the Impl class. But both definitions must be the same.
   1381    typedef typename internal::Function<F>::Result Result;
   1382 
   1383    // Asserts at compile time that F returns void.
   1384    static_assert(std::is_void<Result>::value, "Result type should be void.");
   1385 
   1386    return Action<F>(new Impl<F>(action_));
   1387  }
   1388 
   1389 private:
   1390  template <typename F>
   1391  class Impl : public ActionInterface<F> {
   1392   public:
   1393    typedef typename internal::Function<F>::Result Result;
   1394    typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;
   1395 
   1396    explicit Impl(const A& action) : action_(action) {}
   1397 
   1398    void Perform(const ArgumentTuple& args) override {
   1399      // Performs the action and ignores its result.
   1400      action_.Perform(args);
   1401    }
   1402 
   1403   private:
   1404    // Type OriginalFunction is the same as F except that its return
   1405    // type is IgnoredValue.
   1406    typedef
   1407        typename internal::Function<F>::MakeResultIgnoredValue OriginalFunction;
   1408 
   1409    const Action<OriginalFunction> action_;
   1410  };
   1411 
   1412  const A action_;
   1413 };
   1414 
   1415 template <typename InnerAction, size_t... I>
   1416 struct WithArgsAction {
   1417  InnerAction inner_action;
   1418 
   1419  // The signature of the function as seen by the inner action, given an out
   1420  // action with the given result and argument types.
   1421  template <typename R, typename... Args>
   1422  using InnerSignature =
   1423      R(typename std::tuple_element<I, std::tuple<Args...>>::type...);
   1424 
   1425  // Rather than a call operator, we must define conversion operators to
   1426  // particular action types. This is necessary for embedded actions like
   1427  // DoDefault(), which rely on an action conversion operators rather than
   1428  // providing a call operator because even with a particular set of arguments
   1429  // they don't have a fixed return type.
   1430 
   1431  template <
   1432      typename R, typename... Args,
   1433      typename std::enable_if<
   1434          std::is_convertible<InnerAction,
   1435                              // Unfortunately we can't use the InnerSignature
   1436                              // alias here; MSVC complains about the I
   1437                              // parameter pack not being expanded (error C3520)
   1438                              // despite it being expanded in the type alias.
   1439                              // TupleElement is also an MSVC workaround.
   1440                              // See its definition for details.
   1441                              OnceAction<R(internal::TupleElement<
   1442                                           I, std::tuple<Args...>>...)>>::value,
   1443          int>::type = 0>
   1444  operator OnceAction<R(Args...)>() && {  // NOLINT
   1445    struct OA {
   1446      OnceAction<InnerSignature<R, Args...>> inner_action;
   1447 
   1448      R operator()(Args&&... args) && {
   1449        return std::move(inner_action)
   1450            .Call(std::get<I>(
   1451                std::forward_as_tuple(std::forward<Args>(args)...))...);
   1452      }
   1453    };
   1454 
   1455    return OA{std::move(inner_action)};
   1456  }
   1457 
   1458  // As above, but in the case where we want to create a OnceAction from a const
   1459  // WithArgsAction. This is fine as long as the inner action doesn't need to
   1460  // move any of its state to create a OnceAction.
   1461  template <
   1462      typename R, typename... Args,
   1463      typename std::enable_if<
   1464          std::is_convertible<const InnerAction&,
   1465                              OnceAction<R(internal::TupleElement<
   1466                                           I, std::tuple<Args...>>...)>>::value,
   1467          int>::type = 0>
   1468  operator OnceAction<R(Args...)>() const& {  // NOLINT
   1469    struct OA {
   1470      OnceAction<InnerSignature<R, Args...>> inner_action;
   1471 
   1472      R operator()(Args&&... args) && {
   1473        return std::move(inner_action)
   1474            .Call(std::get<I>(
   1475                std::forward_as_tuple(std::forward<Args>(args)...))...);
   1476      }
   1477    };
   1478 
   1479    return OA{inner_action};
   1480  }
   1481 
   1482  template <
   1483      typename R, typename... Args,
   1484      typename std::enable_if<
   1485          std::is_convertible<const InnerAction&,
   1486                              // Unfortunately we can't use the InnerSignature
   1487                              // alias here; MSVC complains about the I
   1488                              // parameter pack not being expanded (error C3520)
   1489                              // despite it being expanded in the type alias.
   1490                              // TupleElement is also an MSVC workaround.
   1491                              // See its definition for details.
   1492                              Action<R(internal::TupleElement<
   1493                                       I, std::tuple<Args...>>...)>>::value,
   1494          int>::type = 0>
   1495  operator Action<R(Args...)>() const {  // NOLINT
   1496    Action<InnerSignature<R, Args...>> converted(inner_action);
   1497 
   1498    return [converted](Args&&... args) -> R {
   1499      return converted.Perform(std::forward_as_tuple(
   1500          std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));
   1501    };
   1502  }
   1503 };
   1504 
   1505 template <typename... Actions>
   1506 class DoAllAction;
   1507 
   1508 // Base case: only a single action.
   1509 template <typename FinalAction>
   1510 class DoAllAction<FinalAction> {
   1511 public:
   1512  struct UserConstructorTag {};
   1513 
   1514  template <typename T>
   1515  explicit DoAllAction(UserConstructorTag, T&& action)
   1516      : final_action_(std::forward<T>(action)) {}
   1517 
   1518  // Rather than a call operator, we must define conversion operators to
   1519  // particular action types. This is necessary for embedded actions like
   1520  // DoDefault(), which rely on an action conversion operators rather than
   1521  // providing a call operator because even with a particular set of arguments
   1522  // they don't have a fixed return type.
   1523 
   1524  // We support conversion to OnceAction whenever the sub-action does.
   1525  template <typename R, typename... Args,
   1526            typename std::enable_if<
   1527                std::is_convertible<FinalAction, OnceAction<R(Args...)>>::value,
   1528                int>::type = 0>
   1529  operator OnceAction<R(Args...)>() && {  // NOLINT
   1530    return std::move(final_action_);
   1531  }
   1532 
   1533  // We also support conversion to OnceAction whenever the sub-action supports
   1534  // conversion to Action (since any Action can also be a OnceAction).
   1535  template <
   1536      typename R, typename... Args,
   1537      typename std::enable_if<
   1538          conjunction<
   1539              negation<
   1540                  std::is_convertible<FinalAction, OnceAction<R(Args...)>>>,
   1541              std::is_convertible<FinalAction, Action<R(Args...)>>>::value,
   1542          int>::type = 0>
   1543  operator OnceAction<R(Args...)>() && {  // NOLINT
   1544    return Action<R(Args...)>(std::move(final_action_));
   1545  }
   1546 
   1547  // We support conversion to Action whenever the sub-action does.
   1548  template <
   1549      typename R, typename... Args,
   1550      typename std::enable_if<
   1551          std::is_convertible<const FinalAction&, Action<R(Args...)>>::value,
   1552          int>::type = 0>
   1553  operator Action<R(Args...)>() const {  // NOLINT
   1554    return final_action_;
   1555  }
   1556 
   1557 private:
   1558  FinalAction final_action_;
   1559 };
   1560 
   1561 // Recursive case: support N actions by calling the initial action and then
   1562 // calling through to the base class containing N-1 actions.
   1563 template <typename InitialAction, typename... OtherActions>
   1564 class DoAllAction<InitialAction, OtherActions...>
   1565    : private DoAllAction<OtherActions...> {
   1566 private:
   1567  using Base = DoAllAction<OtherActions...>;
   1568 
   1569  // The type of reference that should be provided to an initial action for a
   1570  // mocked function parameter of type T.
   1571  //
   1572  // There are two quirks here:
   1573  //
   1574  //  *  Unlike most forwarding functions, we pass scalars through by value.
   1575  //     This isn't strictly necessary because an lvalue reference would work
   1576  //     fine too and be consistent with other non-reference types, but it's
   1577  //     perhaps less surprising.
   1578  //
   1579  //     For example if the mocked function has signature void(int), then it
   1580  //     might seem surprising for the user's initial action to need to be
   1581  //     convertible to Action<void(const int&)>. This is perhaps less
   1582  //     surprising for a non-scalar type where there may be a performance
   1583  //     impact, or it might even be impossible, to pass by value.
   1584  //
   1585  //  *  More surprisingly, `const T&` is often not a const reference type.
   1586  //     By the reference collapsing rules in C++17 [dcl.ref]/6, if T refers to
   1587  //     U& or U&& for some non-scalar type U, then InitialActionArgType<T> is
   1588  //     U&. In other words, we may hand over a non-const reference.
   1589  //
   1590  //     So for example, given some non-scalar type Obj we have the following
   1591  //     mappings:
   1592  //
   1593  //            T               InitialActionArgType<T>
   1594  //         -------            -----------------------
   1595  //         Obj                const Obj&
   1596  //         Obj&               Obj&
   1597  //         Obj&&              Obj&
   1598  //         const Obj          const Obj&
   1599  //         const Obj&         const Obj&
   1600  //         const Obj&&        const Obj&
   1601  //
   1602  //     In other words, the initial actions get a mutable view of an non-scalar
   1603  //     argument if and only if the mock function itself accepts a non-const
   1604  //     reference type. They are never given an rvalue reference to an
   1605  //     non-scalar type.
   1606  //
   1607  //     This situation makes sense if you imagine use with a matcher that is
   1608  //     designed to write through a reference. For example, if the caller wants
   1609  //     to fill in a reference argument and then return a canned value:
   1610  //
   1611  //         EXPECT_CALL(mock, Call)
   1612  //             .WillOnce(DoAll(SetArgReferee<0>(17), Return(19)));
   1613  //
   1614  template <typename T>
   1615  using InitialActionArgType =
   1616      typename std::conditional<std::is_scalar<T>::value, T, const T&>::type;
   1617 
   1618 public:
   1619  struct UserConstructorTag {};
   1620 
   1621  template <typename T, typename... U>
   1622  explicit DoAllAction(UserConstructorTag, T&& initial_action,
   1623                       U&&... other_actions)
   1624      : Base({}, std::forward<U>(other_actions)...),
   1625        initial_action_(std::forward<T>(initial_action)) {}
   1626 
   1627  // We support conversion to OnceAction whenever both the initial action and
   1628  // the rest support conversion to OnceAction.
   1629  template <
   1630      typename R, typename... Args,
   1631      typename std::enable_if<
   1632          conjunction<std::is_convertible<
   1633                          InitialAction,
   1634                          OnceAction<void(InitialActionArgType<Args>...)>>,
   1635                      std::is_convertible<Base, OnceAction<R(Args...)>>>::value,
   1636          int>::type = 0>
   1637  operator OnceAction<R(Args...)>() && {  // NOLINT
   1638    // Return an action that first calls the initial action with arguments
   1639    // filtered through InitialActionArgType, then forwards arguments directly
   1640    // to the base class to deal with the remaining actions.
   1641    struct OA {
   1642      OnceAction<void(InitialActionArgType<Args>...)> initial_action;
   1643      OnceAction<R(Args...)> remaining_actions;
   1644 
   1645      R operator()(Args... args) && {
   1646        std::move(initial_action)
   1647            .Call(static_cast<InitialActionArgType<Args>>(args)...);
   1648 
   1649        return std::move(remaining_actions).Call(std::forward<Args>(args)...);
   1650      }
   1651    };
   1652 
   1653    return OA{
   1654        std::move(initial_action_),
   1655        std::move(static_cast<Base&>(*this)),
   1656    };
   1657  }
   1658 
   1659  // We also support conversion to OnceAction whenever the initial action
   1660  // supports conversion to Action (since any Action can also be a OnceAction).
   1661  //
   1662  // The remaining sub-actions must also be compatible, but we don't need to
   1663  // special case them because the base class deals with them.
   1664  template <
   1665      typename R, typename... Args,
   1666      typename std::enable_if<
   1667          conjunction<
   1668              negation<std::is_convertible<
   1669                  InitialAction,
   1670                  OnceAction<void(InitialActionArgType<Args>...)>>>,
   1671              std::is_convertible<InitialAction,
   1672                                  Action<void(InitialActionArgType<Args>...)>>,
   1673              std::is_convertible<Base, OnceAction<R(Args...)>>>::value,
   1674          int>::type = 0>
   1675  operator OnceAction<R(Args...)>() && {  // NOLINT
   1676    return DoAll(
   1677        Action<void(InitialActionArgType<Args>...)>(std::move(initial_action_)),
   1678        std::move(static_cast<Base&>(*this)));
   1679  }
   1680 
   1681  // We support conversion to Action whenever both the initial action and the
   1682  // rest support conversion to Action.
   1683  template <
   1684      typename R, typename... Args,
   1685      typename std::enable_if<
   1686          conjunction<
   1687              std::is_convertible<const InitialAction&,
   1688                                  Action<void(InitialActionArgType<Args>...)>>,
   1689              std::is_convertible<const Base&, Action<R(Args...)>>>::value,
   1690          int>::type = 0>
   1691  operator Action<R(Args...)>() const {  // NOLINT
   1692    // Return an action that first calls the initial action with arguments
   1693    // filtered through InitialActionArgType, then forwards arguments directly
   1694    // to the base class to deal with the remaining actions.
   1695    struct OA {
   1696      Action<void(InitialActionArgType<Args>...)> initial_action;
   1697      Action<R(Args...)> remaining_actions;
   1698 
   1699      R operator()(Args... args) const {
   1700        initial_action.Perform(std::forward_as_tuple(
   1701            static_cast<InitialActionArgType<Args>>(args)...));
   1702 
   1703        return remaining_actions.Perform(
   1704            std::forward_as_tuple(std::forward<Args>(args)...));
   1705      }
   1706    };
   1707 
   1708    return OA{
   1709        initial_action_,
   1710        static_cast<const Base&>(*this),
   1711    };
   1712  }
   1713 
   1714 private:
   1715  InitialAction initial_action_;
   1716 };
   1717 
   1718 template <typename T, typename... Params>
   1719 struct ReturnNewAction {
   1720  T* operator()() const {
   1721    return internal::Apply(
   1722        [](const Params&... unpacked_params) {
   1723          return new T(unpacked_params...);
   1724        },
   1725        params);
   1726  }
   1727  std::tuple<Params...> params;
   1728 };
   1729 
   1730 template <size_t k>
   1731 struct ReturnArgAction {
   1732  template <typename... Args,
   1733            typename = typename std::enable_if<(k < sizeof...(Args))>::type>
   1734  auto operator()(Args&&... args) const -> decltype(std::get<k>(
   1735      std::forward_as_tuple(std::forward<Args>(args)...))) {
   1736    return std::get<k>(std::forward_as_tuple(std::forward<Args>(args)...));
   1737  }
   1738 };
   1739 
   1740 template <size_t k, typename Ptr>
   1741 struct SaveArgAction {
   1742  Ptr pointer;
   1743 
   1744  template <typename... Args>
   1745  void operator()(const Args&... args) const {
   1746    *pointer = std::get<k>(std::tie(args...));
   1747  }
   1748 };
   1749 
   1750 template <size_t k, typename Ptr>
   1751 struct SaveArgByMoveAction {
   1752  Ptr pointer;
   1753 
   1754  template <typename... Args>
   1755  void operator()(Args&&... args) const {
   1756    *pointer = std::move(std::get<k>(std::tie(args...)));
   1757  }
   1758 };
   1759 
   1760 template <size_t k, typename Ptr>
   1761 struct SaveArgPointeeAction {
   1762  Ptr pointer;
   1763 
   1764  template <typename... Args>
   1765  void operator()(const Args&... args) const {
   1766    *pointer = *std::get<k>(std::tie(args...));
   1767  }
   1768 };
   1769 
   1770 template <size_t k, typename T>
   1771 struct SetArgRefereeAction {
   1772  T value;
   1773 
   1774  template <typename... Args>
   1775  void operator()(Args&&... args) const {
   1776    using argk_type =
   1777        typename ::std::tuple_element<k, std::tuple<Args...>>::type;
   1778    static_assert(std::is_lvalue_reference<argk_type>::value,
   1779                  "Argument must be a reference type.");
   1780    std::get<k>(std::tie(args...)) = value;
   1781  }
   1782 };
   1783 
   1784 template <size_t k, typename I1, typename I2>
   1785 struct SetArrayArgumentAction {
   1786  I1 first;
   1787  I2 last;
   1788 
   1789  template <typename... Args>
   1790  void operator()(const Args&... args) const {
   1791    auto value = std::get<k>(std::tie(args...));
   1792    for (auto it = first; it != last; ++it, (void)++value) {
   1793      *value = *it;
   1794    }
   1795  }
   1796 };
   1797 
   1798 template <size_t k>
   1799 class DeleteArgAction {
   1800 public:
   1801  template <typename... Args>
   1802  void operator()(const Args&... args) const {
   1803    DoDelete(std::get<k>(std::tie(args...)));
   1804  }
   1805 
   1806 private:
   1807  template <typename T>
   1808  static void DoDelete(T* ptr) {
   1809    delete ptr;
   1810  }
   1811 
   1812  template <typename T>
   1813  [[deprecated(
   1814      "DeleteArg<N> used for a non-pointer argument, it was likely migrated "
   1815      "to a smart pointer type. This action should be removed.")]]
   1816  static void DoDelete(T&) {}
   1817 };
   1818 
   1819 template <typename Ptr>
   1820 struct ReturnPointeeAction {
   1821  Ptr pointer;
   1822  template <typename... Args>
   1823  auto operator()(const Args&...) const -> decltype(*pointer) {
   1824    return *pointer;
   1825  }
   1826 };
   1827 
   1828 #if GTEST_HAS_EXCEPTIONS
   1829 template <typename T>
   1830 struct ThrowAction {
   1831  T exception;
   1832  // We use a conversion operator to adapt to any return type.
   1833  template <typename R, typename... Args>
   1834  operator Action<R(Args...)>() const {  // NOLINT
   1835    T copy = exception;
   1836    return [copy](Args...) -> R { throw copy; };
   1837  }
   1838 };
   1839 struct RethrowAction {
   1840  std::exception_ptr exception;
   1841  template <typename R, typename... Args>
   1842  operator Action<R(Args...)>() const {  // NOLINT
   1843    return [ex = exception](Args...) -> R { std::rethrow_exception(ex); };
   1844  }
   1845 };
   1846 #endif  // GTEST_HAS_EXCEPTIONS
   1847 
   1848 }  // namespace internal
   1849 
   1850 // An Unused object can be implicitly constructed from ANY value.
   1851 // This is handy when defining actions that ignore some or all of the
   1852 // mock function arguments.  For example, given
   1853 //
   1854 //   MOCK_METHOD3(Foo, double(const string& label, double x, double y));
   1855 //   MOCK_METHOD3(Bar, double(int index, double x, double y));
   1856 //
   1857 // instead of
   1858 //
   1859 //   double DistanceToOriginWithLabel(const string& label, double x, double y) {
   1860 //     return sqrt(x*x + y*y);
   1861 //   }
   1862 //   double DistanceToOriginWithIndex(int index, double x, double y) {
   1863 //     return sqrt(x*x + y*y);
   1864 //   }
   1865 //   ...
   1866 //   EXPECT_CALL(mock, Foo("abc", _, _))
   1867 //       .WillOnce(Invoke(DistanceToOriginWithLabel));
   1868 //   EXPECT_CALL(mock, Bar(5, _, _))
   1869 //       .WillOnce(Invoke(DistanceToOriginWithIndex));
   1870 //
   1871 // you could write
   1872 //
   1873 //   // We can declare any uninteresting argument as Unused.
   1874 //   double DistanceToOrigin(Unused, double x, double y) {
   1875 //     return sqrt(x*x + y*y);
   1876 //   }
   1877 //   ...
   1878 //   EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin));
   1879 //   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));
   1880 typedef internal::IgnoredValue Unused;
   1881 
   1882 // Deprecated single-argument DoAll.
   1883 template <typename Action>
   1884 GTEST_INTERNAL_DEPRECATE_AND_INLINE("Avoid using DoAll() for single actions")
   1885 typename std::decay<Action>::type DoAll(Action&& action) {
   1886  return std::forward<Action>(action);
   1887 }
   1888 
   1889 // Creates an action that does actions a1, a2, ..., sequentially in
   1890 // each invocation. All but the last action will have a readonly view of the
   1891 // arguments.
   1892 template <typename... Action>
   1893 internal::DoAllAction<typename std::decay<Action>::type...> DoAll(
   1894    Action&&... action) {
   1895  return internal::DoAllAction<typename std::decay<Action>::type...>(
   1896      {}, std::forward<Action>(action)...);
   1897 }
   1898 
   1899 // WithArg<k>(an_action) creates an action that passes the k-th
   1900 // (0-based) argument of the mock function to an_action and performs
   1901 // it.  It adapts an action accepting one argument to one that accepts
   1902 // multiple arguments.  For convenience, we also provide
   1903 // WithArgs<k>(an_action) (defined below) as a synonym.
   1904 template <size_t k, typename InnerAction>
   1905 internal::WithArgsAction<typename std::decay<InnerAction>::type, k> WithArg(
   1906    InnerAction&& action) {
   1907  return {std::forward<InnerAction>(action)};
   1908 }
   1909 
   1910 // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes
   1911 // the selected arguments of the mock function to an_action and
   1912 // performs it.  It serves as an adaptor between actions with
   1913 // different argument lists.
   1914 template <size_t k, size_t... ks, typename InnerAction>
   1915 internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...>
   1916 WithArgs(InnerAction&& action) {
   1917  return {std::forward<InnerAction>(action)};
   1918 }
   1919 
   1920 // WithoutArgs(inner_action) can be used in a mock function with a
   1921 // non-empty argument list to perform inner_action, which takes no
   1922 // argument.  In other words, it adapts an action accepting no
   1923 // argument to one that accepts (and ignores) arguments.
   1924 template <typename InnerAction>
   1925 internal::WithArgsAction<typename std::decay<InnerAction>::type> WithoutArgs(
   1926    InnerAction&& action) {
   1927  return {std::forward<InnerAction>(action)};
   1928 }
   1929 
   1930 // Creates an action that returns a value.
   1931 //
   1932 // The returned type can be used with a mock function returning a non-void,
   1933 // non-reference type U as follows:
   1934 //
   1935 //  *  If R is convertible to U and U is move-constructible, then the action can
   1936 //     be used with WillOnce.
   1937 //
   1938 //  *  If const R& is convertible to U and U is copy-constructible, then the
   1939 //     action can be used with both WillOnce and WillRepeatedly.
   1940 //
   1941 // The mock expectation contains the R value from which the U return value is
   1942 // constructed (a move/copy of the argument to Return). This means that the R
   1943 // value will survive at least until the mock object's expectations are cleared
   1944 // or the mock object is destroyed, meaning that U can safely be a
   1945 // reference-like type such as std::string_view:
   1946 //
   1947 //     // The mock function returns a view of a copy of the string fed to
   1948 //     // Return. The view is valid even after the action is performed.
   1949 //     MockFunction<std::string_view()> mock;
   1950 //     EXPECT_CALL(mock, Call).WillOnce(Return(std::string("taco")));
   1951 //     const std::string_view result = mock.AsStdFunction()();
   1952 //     EXPECT_EQ("taco", result);
   1953 //
   1954 template <typename R>
   1955 internal::ReturnAction<R> Return(R value) {
   1956  return internal::ReturnAction<R>(std::move(value));
   1957 }
   1958 
   1959 // Creates an action that returns NULL.
   1960 inline PolymorphicAction<internal::ReturnNullAction> ReturnNull() {
   1961  return MakePolymorphicAction(internal::ReturnNullAction());
   1962 }
   1963 
   1964 // Creates an action that returns from a void function.
   1965 inline PolymorphicAction<internal::ReturnVoidAction> Return() {
   1966  return MakePolymorphicAction(internal::ReturnVoidAction());
   1967 }
   1968 
   1969 // Creates an action that returns the reference to a variable.
   1970 template <typename R>
   1971 inline internal::ReturnRefAction<R> ReturnRef(R& x) {  // NOLINT
   1972  return internal::ReturnRefAction<R>(x);
   1973 }
   1974 
   1975 // Prevent using ReturnRef on reference to temporary.
   1976 template <typename R, R* = nullptr>
   1977 internal::ReturnRefAction<R> ReturnRef(R&&) = delete;
   1978 
   1979 // Creates an action that returns the reference to a copy of the
   1980 // argument.  The copy is created when the action is constructed and
   1981 // lives as long as the action.
   1982 template <typename R>
   1983 inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {
   1984  return internal::ReturnRefOfCopyAction<R>(x);
   1985 }
   1986 
   1987 // DEPRECATED: use Return(x) directly with WillOnce.
   1988 //
   1989 // Modifies the parent action (a Return() action) to perform a move of the
   1990 // argument instead of a copy.
   1991 // Return(ByMove()) actions can only be executed once and will assert this
   1992 // invariant.
   1993 template <typename R>
   1994 internal::ByMoveWrapper<R> ByMove(R x) {
   1995  return internal::ByMoveWrapper<R>(std::move(x));
   1996 }
   1997 
   1998 // Creates an action that returns an element of `vals`. Calling this action will
   1999 // repeatedly return the next value from `vals` until it reaches the end and
   2000 // will restart from the beginning.
   2001 template <typename T>
   2002 internal::ReturnRoundRobinAction<T> ReturnRoundRobin(std::vector<T> vals) {
   2003  return internal::ReturnRoundRobinAction<T>(std::move(vals));
   2004 }
   2005 
   2006 // Creates an action that returns an element of `vals`. Calling this action will
   2007 // repeatedly return the next value from `vals` until it reaches the end and
   2008 // will restart from the beginning.
   2009 template <typename T>
   2010 internal::ReturnRoundRobinAction<T> ReturnRoundRobin(
   2011    std::initializer_list<T> vals) {
   2012  return internal::ReturnRoundRobinAction<T>(std::vector<T>(vals));
   2013 }
   2014 
   2015 // Creates an action that does the default action for the give mock function.
   2016 inline internal::DoDefaultAction DoDefault() {
   2017  return internal::DoDefaultAction();
   2018 }
   2019 
   2020 // Creates an action that sets the variable pointed by the N-th
   2021 // (0-based) function argument to 'value'.
   2022 template <size_t N, typename T>
   2023 internal::SetArgumentPointeeAction<N, T> SetArgPointee(T value) {
   2024  return {std::move(value)};
   2025 }
   2026 
   2027 // The following version is DEPRECATED.
   2028 template <size_t N, typename T>
   2029 internal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T value) {
   2030  return {std::move(value)};
   2031 }
   2032 
   2033 // Creates an action that sets a pointer referent to a given value.
   2034 template <typename T1, typename T2>
   2035 PolymorphicAction<internal::AssignAction<T1, T2>> Assign(T1* ptr, T2 val) {
   2036  return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val));
   2037 }
   2038 
   2039 #ifndef GTEST_OS_WINDOWS_MOBILE
   2040 
   2041 // Creates an action that sets errno and returns the appropriate error.
   2042 template <typename T>
   2043 PolymorphicAction<internal::SetErrnoAndReturnAction<T>> SetErrnoAndReturn(
   2044    int errval, T result) {
   2045  return MakePolymorphicAction(
   2046      internal::SetErrnoAndReturnAction<T>(errval, result));
   2047 }
   2048 
   2049 #endif  // !GTEST_OS_WINDOWS_MOBILE
   2050 
   2051 // Various overloads for Invoke().
   2052 
   2053 // Legacy function.
   2054 // This function exists for backwards compatibility.
   2055 template <typename FunctionImpl>
   2056 GTEST_INTERNAL_DEPRECATE_AND_INLINE(
   2057    "Actions can now be implicitly constructed from callables. No need to "
   2058    "create wrapper objects using Invoke().")
   2059 typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {
   2060  return std::forward<FunctionImpl>(function_impl);
   2061 }
   2062 
   2063 // Creates an action that invokes the given method on the given object
   2064 // with the mock function's arguments.
   2065 template <class Class, typename MethodPtr>
   2066 internal::InvokeMethodAction<Class, MethodPtr> Invoke(Class* obj_ptr,
   2067                                                      MethodPtr method_ptr) {
   2068  return {obj_ptr, method_ptr};
   2069 }
   2070 
   2071 // Creates an action that invokes 'function_impl' with no argument.
   2072 template <typename FunctionImpl>
   2073 internal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type>
   2074 InvokeWithoutArgs(FunctionImpl function_impl) {
   2075  return {std::move(function_impl)};
   2076 }
   2077 
   2078 // Creates an action that invokes the given method on the given object
   2079 // with no argument.
   2080 template <class Class, typename MethodPtr>
   2081 internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> InvokeWithoutArgs(
   2082    Class* obj_ptr, MethodPtr method_ptr) {
   2083  return {obj_ptr, method_ptr};
   2084 }
   2085 
   2086 // Creates an action that performs an_action and throws away its
   2087 // result.  In other words, it changes the return type of an_action to
   2088 // void.  an_action MUST NOT return void, or the code won't compile.
   2089 template <typename A>
   2090 inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {
   2091  return internal::IgnoreResultAction<A>(an_action);
   2092 }
   2093 
   2094 // Creates a reference wrapper for the given L-value.  If necessary,
   2095 // you can explicitly specify the type of the reference.  For example,
   2096 // suppose 'derived' is an object of type Derived, ByRef(derived)
   2097 // would wrap a Derived&.  If you want to wrap a const Base& instead,
   2098 // where Base is a base class of Derived, just write:
   2099 //
   2100 //   ByRef<const Base>(derived)
   2101 //
   2102 // N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper.
   2103 // However, it may still be used for consistency with ByMove().
   2104 template <typename T>
   2105 inline ::std::reference_wrapper<T> ByRef(T& l_value) {  // NOLINT
   2106  return ::std::reference_wrapper<T>(l_value);
   2107 }
   2108 
   2109 // The ReturnNew<T>(a1, a2, ..., a_k) action returns a pointer to a new
   2110 // instance of type T, constructed on the heap with constructor arguments
   2111 // a1, a2, ..., and a_k. The caller assumes ownership of the returned value.
   2112 template <typename T, typename... Params>
   2113 internal::ReturnNewAction<T, typename std::decay<Params>::type...> ReturnNew(
   2114    Params&&... params) {
   2115  return {std::forward_as_tuple(std::forward<Params>(params)...)};
   2116 }
   2117 
   2118 // Action ReturnArg<k>() returns the k-th argument of the mock function.
   2119 template <size_t k>
   2120 internal::ReturnArgAction<k> ReturnArg() {
   2121  return {};
   2122 }
   2123 
   2124 // Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the
   2125 // mock function to *pointer.
   2126 template <size_t k, typename Ptr>
   2127 internal::SaveArgAction<k, Ptr> SaveArg(Ptr pointer) {
   2128  return {pointer};
   2129 }
   2130 
   2131 // Action SaveArgByMove<k>(pointer) moves the k-th (0-based) argument of the
   2132 // mock function into *pointer.
   2133 template <size_t k, typename Ptr>
   2134 internal::SaveArgByMoveAction<k, Ptr> SaveArgByMove(Ptr pointer) {
   2135  return {pointer};
   2136 }
   2137 
   2138 // Action SaveArgPointee<k>(pointer) saves the value pointed to
   2139 // by the k-th (0-based) argument of the mock function to *pointer.
   2140 template <size_t k, typename Ptr>
   2141 internal::SaveArgPointeeAction<k, Ptr> SaveArgPointee(Ptr pointer) {
   2142  return {pointer};
   2143 }
   2144 
   2145 // Action SetArgReferee<k>(value) assigns 'value' to the variable
   2146 // referenced by the k-th (0-based) argument of the mock function.
   2147 template <size_t k, typename T>
   2148 internal::SetArgRefereeAction<k, typename std::decay<T>::type> SetArgReferee(
   2149    T&& value) {
   2150  return {std::forward<T>(value)};
   2151 }
   2152 
   2153 // Action SetArrayArgument<k>(first, last) copies the elements in
   2154 // source range [first, last) to the array pointed to by the k-th
   2155 // (0-based) argument, which can be either a pointer or an
   2156 // iterator. The action does not take ownership of the elements in the
   2157 // source range.
   2158 template <size_t k, typename I1, typename I2>
   2159 internal::SetArrayArgumentAction<k, I1, I2> SetArrayArgument(I1 first,
   2160                                                             I2 last) {
   2161  return {first, last};
   2162 }
   2163 
   2164 // Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock
   2165 // function.
   2166 template <size_t k>
   2167 internal::DeleteArgAction<k> DeleteArg() {
   2168  return {};
   2169 }
   2170 
   2171 // This action returns the value pointed to by 'pointer'.
   2172 template <typename Ptr>
   2173 internal::ReturnPointeeAction<Ptr> ReturnPointee(Ptr pointer) {
   2174  return {pointer};
   2175 }
   2176 
   2177 #if GTEST_HAS_EXCEPTIONS
   2178 // Action Throw(exception) can be used in a mock function of any type
   2179 // to throw the given exception.  Any copyable value can be thrown,
   2180 // except for std::exception_ptr, which is likely a mistake if
   2181 // thrown directly.
   2182 template <typename T>
   2183 typename std::enable_if<
   2184    !std::is_base_of<std::exception_ptr, typename std::decay<T>::type>::value,
   2185    internal::ThrowAction<typename std::decay<T>::type>>::type
   2186 Throw(T&& exception) {
   2187  return {std::forward<T>(exception)};
   2188 }
   2189 // Action Rethrow(exception_ptr) can be used in a mock function of any type
   2190 // to rethrow any exception_ptr. Note that the same object is thrown each time.
   2191 inline internal::RethrowAction Rethrow(std::exception_ptr exception) {
   2192  return {std::move(exception)};
   2193 }
   2194 #endif  // GTEST_HAS_EXCEPTIONS
   2195 
   2196 namespace internal {
   2197 
   2198 // A macro from the ACTION* family (defined later in gmock-generated-actions.h)
   2199 // defines an action that can be used in a mock function.  Typically,
   2200 // these actions only care about a subset of the arguments of the mock
   2201 // function.  For example, if such an action only uses the second
   2202 // argument, it can be used in any mock function that takes >= 2
   2203 // arguments where the type of the second argument is compatible.
   2204 //
   2205 // Therefore, the action implementation must be prepared to take more
   2206 // arguments than it needs.  The ExcessiveArg type is used to
   2207 // represent those excessive arguments.  In order to keep the compiler
   2208 // error messages tractable, we define it in the testing namespace
   2209 // instead of testing::internal.  However, this is an INTERNAL TYPE
   2210 // and subject to change without notice, so a user MUST NOT USE THIS
   2211 // TYPE DIRECTLY.
   2212 struct ExcessiveArg {};
   2213 
   2214 // Builds an implementation of an Action<> for some particular signature, using
   2215 // a class defined by an ACTION* macro.
   2216 template <typename F, typename Impl>
   2217 struct ActionImpl;
   2218 
   2219 template <typename Impl>
   2220 struct ImplBase {
   2221  struct Holder {
   2222    // Allows each copy of the Action<> to get to the Impl.
   2223    explicit operator const Impl&() const { return *ptr; }
   2224    std::shared_ptr<Impl> ptr;
   2225  };
   2226  using type = typename std::conditional<std::is_constructible<Impl>::value,
   2227                                         Impl, Holder>::type;
   2228 };
   2229 
   2230 template <typename R, typename... Args, typename Impl>
   2231 struct ActionImpl<R(Args...), Impl> : ImplBase<Impl>::type {
   2232  using Base = typename ImplBase<Impl>::type;
   2233  using function_type = R(Args...);
   2234  using args_type = std::tuple<Args...>;
   2235 
   2236  ActionImpl() = default;  // Only defined if appropriate for Base.
   2237  explicit ActionImpl(std::shared_ptr<Impl> impl) : Base{std::move(impl)} {}
   2238 
   2239  R operator()(Args&&... arg) const {
   2240    static constexpr size_t kMaxArgs =
   2241        sizeof...(Args) <= 10 ? sizeof...(Args) : 10;
   2242    return Apply(std::make_index_sequence<kMaxArgs>{},
   2243                 std::make_index_sequence<10 - kMaxArgs>{},
   2244                 args_type{std::forward<Args>(arg)...});
   2245  }
   2246 
   2247  template <std::size_t... arg_id, std::size_t... excess_id>
   2248  R Apply(std::index_sequence<arg_id...>, std::index_sequence<excess_id...>,
   2249          const args_type& args) const {
   2250    // Impl need not be specific to the signature of action being implemented;
   2251    // only the implementing function body needs to have all of the specific
   2252    // types instantiated.  Up to 10 of the args that are provided by the
   2253    // args_type get passed, followed by a dummy of unspecified type for the
   2254    // remainder up to 10 explicit args.
   2255    static constexpr ExcessiveArg kExcessArg{};
   2256    return static_cast<const Impl&>(*this)
   2257        .template gmock_PerformImpl<
   2258            /*function_type=*/function_type, /*return_type=*/R,
   2259            /*args_type=*/args_type,
   2260            /*argN_type=*/
   2261            typename std::tuple_element<arg_id, args_type>::type...>(
   2262            /*args=*/args, std::get<arg_id>(args)...,
   2263            ((void)excess_id, kExcessArg)...);
   2264  }
   2265 };
   2266 
   2267 // Stores a default-constructed Impl as part of the Action<>'s
   2268 // std::function<>. The Impl should be trivial to copy.
   2269 template <typename F, typename Impl>
   2270 ::testing::Action<F> MakeAction() {
   2271  return ::testing::Action<F>(ActionImpl<F, Impl>());
   2272 }
   2273 
   2274 // Stores just the one given instance of Impl.
   2275 template <typename F, typename Impl>
   2276 ::testing::Action<F> MakeAction(std::shared_ptr<Impl> impl) {
   2277  return ::testing::Action<F>(ActionImpl<F, Impl>(std::move(impl)));
   2278 }
   2279 
   2280 #define GMOCK_INTERNAL_ARG_UNUSED(i, data, el) \
   2281  , [[maybe_unused]] const arg##i##_type& arg##i
   2282 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_          \
   2283  [[maybe_unused]] const args_type& args GMOCK_PP_REPEAT( \
   2284      GMOCK_INTERNAL_ARG_UNUSED, , 10)
   2285 
   2286 #define GMOCK_INTERNAL_ARG(i, data, el) , const arg##i##_type& arg##i
   2287 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_ \
   2288  const args_type& args GMOCK_PP_REPEAT(GMOCK_INTERNAL_ARG, , 10)
   2289 
   2290 #define GMOCK_INTERNAL_TEMPLATE_ARG(i, data, el) , typename arg##i##_type
   2291 #define GMOCK_ACTION_TEMPLATE_ARGS_NAMES_ \
   2292  GMOCK_PP_TAIL(GMOCK_PP_REPEAT(GMOCK_INTERNAL_TEMPLATE_ARG, , 10))
   2293 
   2294 #define GMOCK_INTERNAL_TYPENAME_PARAM(i, data, param) , typename param##_type
   2295 #define GMOCK_ACTION_TYPENAME_PARAMS_(params) \
   2296  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPENAME_PARAM, , params))
   2297 
   2298 #define GMOCK_INTERNAL_TYPE_PARAM(i, data, param) , param##_type
   2299 #define GMOCK_ACTION_TYPE_PARAMS_(params) \
   2300  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_PARAM, , params))
   2301 
   2302 #define GMOCK_INTERNAL_TYPE_GVALUE_PARAM(i, data, param) \
   2303  , param##_type gmock_p##i
   2304 #define GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params) \
   2305  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_TYPE_GVALUE_PARAM, , params))
   2306 
   2307 #define GMOCK_INTERNAL_GVALUE_PARAM(i, data, param) \
   2308  , std::forward<param##_type>(gmock_p##i)
   2309 #define GMOCK_ACTION_GVALUE_PARAMS_(params) \
   2310  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GVALUE_PARAM, , params))
   2311 
   2312 #define GMOCK_INTERNAL_INIT_PARAM(i, data, param) \
   2313  , param(::std::forward<param##_type>(gmock_p##i))
   2314 #define GMOCK_ACTION_INIT_PARAMS_(params) \
   2315  GMOCK_PP_TAIL(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_INIT_PARAM, , params))
   2316 
   2317 #define GMOCK_INTERNAL_FIELD_PARAM(i, data, param) param##_type param;
   2318 #define GMOCK_ACTION_FIELD_PARAMS_(params) \
   2319  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_FIELD_PARAM, , params)
   2320 
   2321 #define GMOCK_INTERNAL_ACTION(name, full_name, params)                         \
   2322  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                             \
   2323  class full_name {                                                            \
   2324   public:                                                                     \
   2325    explicit full_name(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params))               \
   2326        : impl_(std::make_shared<gmock_Impl>(                                  \
   2327              GMOCK_ACTION_GVALUE_PARAMS_(params))) {}                         \
   2328    full_name(const full_name&) = default;                                     \
   2329    full_name(full_name&&) noexcept = default;                                 \
   2330    template <typename F>                                                      \
   2331    operator ::testing::Action<F>() const {                                    \
   2332      return ::testing::internal::MakeAction<F>(impl_);                        \
   2333    }                                                                          \
   2334                                                                               \
   2335   private:                                                                    \
   2336    class gmock_Impl {                                                         \
   2337     public:                                                                   \
   2338      explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params))            \
   2339          : GMOCK_ACTION_INIT_PARAMS_(params) {}                               \
   2340      template <typename function_type, typename return_type,                  \
   2341                typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>         \
   2342      return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const;  \
   2343      GMOCK_ACTION_FIELD_PARAMS_(params)                                       \
   2344    };                                                                         \
   2345    std::shared_ptr<const gmock_Impl> impl_;                                   \
   2346  };                                                                           \
   2347  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                             \
   2348  [[nodiscard]] inline full_name<GMOCK_ACTION_TYPE_PARAMS_(params)> name(      \
   2349      GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params));                               \
   2350  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                             \
   2351  inline full_name<GMOCK_ACTION_TYPE_PARAMS_(params)> name(                    \
   2352      GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) {                              \
   2353    return full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>(                       \
   2354        GMOCK_ACTION_GVALUE_PARAMS_(params));                                  \
   2355  }                                                                            \
   2356  template <GMOCK_ACTION_TYPENAME_PARAMS_(params)>                             \
   2357  template <typename function_type, typename return_type, typename args_type,  \
   2358            GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>                                 \
   2359  return_type                                                                  \
   2360  full_name<GMOCK_ACTION_TYPE_PARAMS_(params)>::gmock_Impl::gmock_PerformImpl( \
   2361      GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
   2362 
   2363 }  // namespace internal
   2364 
   2365 // Similar to GMOCK_INTERNAL_ACTION, but no bound parameters are stored.
   2366 #define ACTION(name)                                                          \
   2367  class name##Action {                                                        \
   2368   public:                                                                    \
   2369    explicit name##Action() noexcept {}                                       \
   2370    name##Action(const name##Action&) noexcept {}                             \
   2371    template <typename F>                                                     \
   2372    operator ::testing::Action<F>() const {                                   \
   2373      return ::testing::internal::MakeAction<F, gmock_Impl>();                \
   2374    }                                                                         \
   2375                                                                              \
   2376   private:                                                                   \
   2377    class gmock_Impl {                                                        \
   2378     public:                                                                  \
   2379      template <typename function_type, typename return_type,                 \
   2380                typename args_type, GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>        \
   2381      return_type gmock_PerformImpl(GMOCK_ACTION_ARG_TYPES_AND_NAMES_) const; \
   2382    };                                                                        \
   2383  };                                                                          \
   2384  [[nodiscard]] inline name##Action name();                                   \
   2385  inline name##Action name() { return name##Action(); }                       \
   2386  template <typename function_type, typename return_type, typename args_type, \
   2387            GMOCK_ACTION_TEMPLATE_ARGS_NAMES_>                                \
   2388  return_type name##Action::gmock_Impl::gmock_PerformImpl(                    \
   2389      GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_) const
   2390 
   2391 #define ACTION_P(name, ...) \
   2392  GMOCK_INTERNAL_ACTION(name, name##ActionP, (__VA_ARGS__))
   2393 
   2394 #define ACTION_P2(name, ...) \
   2395  GMOCK_INTERNAL_ACTION(name, name##ActionP2, (__VA_ARGS__))
   2396 
   2397 #define ACTION_P3(name, ...) \
   2398  GMOCK_INTERNAL_ACTION(name, name##ActionP3, (__VA_ARGS__))
   2399 
   2400 #define ACTION_P4(name, ...) \
   2401  GMOCK_INTERNAL_ACTION(name, name##ActionP4, (__VA_ARGS__))
   2402 
   2403 #define ACTION_P5(name, ...) \
   2404  GMOCK_INTERNAL_ACTION(name, name##ActionP5, (__VA_ARGS__))
   2405 
   2406 #define ACTION_P6(name, ...) \
   2407  GMOCK_INTERNAL_ACTION(name, name##ActionP6, (__VA_ARGS__))
   2408 
   2409 #define ACTION_P7(name, ...) \
   2410  GMOCK_INTERNAL_ACTION(name, name##ActionP7, (__VA_ARGS__))
   2411 
   2412 #define ACTION_P8(name, ...) \
   2413  GMOCK_INTERNAL_ACTION(name, name##ActionP8, (__VA_ARGS__))
   2414 
   2415 #define ACTION_P9(name, ...) \
   2416  GMOCK_INTERNAL_ACTION(name, name##ActionP9, (__VA_ARGS__))
   2417 
   2418 #define ACTION_P10(name, ...) \
   2419  GMOCK_INTERNAL_ACTION(name, name##ActionP10, (__VA_ARGS__))
   2420 
   2421 }  // namespace testing
   2422 
   2423 GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4100
   2424 
   2425 #endif  // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_