Change `ReturnArg` to use perfect forwarding of arguments (#3733) 49/287049/1 accepted/tizen_7.0_unified tizen_7.0 accepted/tizen/7.0/unified/20230120.182124
authorDino Radakovic <dinor@google.com>
Wed, 26 Jan 2022 16:38:44 +0000 (08:38 -0800)
committerDongHun Kwak <dh0128.kwak@samsung.com>
Thu, 19 Jan 2023 06:19:05 +0000 (15:19 +0900)
PiperOrigin-RevId: 424355706
Change-Id: I618e5574b4b2c56a343905c20d8cc6d2a70cbcd1
Signed-off-by: DongHun Kwak <dh0128.kwak@samsung.com>
googlemock/include/gmock/gmock-actions.h
googlemock/test/gmock-more-actions_test.cc

index f2393bd..43bf45a 100644 (file)
@@ -1079,9 +1079,9 @@ struct ReturnNewAction {
 template <size_t k>
 struct ReturnArgAction {
   template <typename... Args>
-  auto operator()(const Args&... args) const ->
-      typename std::tuple_element<k, std::tuple<Args...>>::type {
-    return std::get<k>(std::tie(args...));
+  auto operator()(Args&&... args) const -> decltype(std::get<k>(
+      std::forward_as_tuple(std::forward<Args>(args)...))) {
+    return std::get<k>(std::forward_as_tuple(std::forward<Args>(args)...));
   }
 };
 
index 53bb029..fdc8c70 100644 (file)
@@ -462,6 +462,12 @@ TEST(ReturnArgActionTest, WorksForMultiArgStringArg2) {
   EXPECT_EQ("seven", a.Perform(std::make_tuple(5, 6, std::string("seven"), 8)));
 }
 
+TEST(ReturnArgActionTest, WorksForNonConstRefArg0) {
+  const Action<std::string&(std::string&)> a = ReturnArg<0>();
+  std::string s = "12345";
+  EXPECT_EQ(&s, &a.Perform(std::forward_as_tuple(s)));
+}
+
 TEST(SaveArgActionTest, WorksForSameType) {
   int result = 0;
   const Action<void(int n)> a1 = SaveArg<0>(&result);