From 22397f28ef576daf9f3dbfac381bdfdf3be58a86 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Thu, 23 Jan 2020 10:06:23 -0500 Subject: [PATCH 01/21] Googletest export Add missing explicit keyword for gmock_Impl constructor. When switching to using GMOCK_PP in ACTION* macroses `explicit` keyword was missed in gmock_Impl constructor causing ClangTidy warnings in ACTION_P macro. PiperOrigin-RevId: 291159975 --- googlemock/include/gmock/gmock-actions.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/googlemock/include/gmock/gmock-actions.h b/googlemock/include/gmock/gmock-actions.h index 88011798..e46bcaa7 100644 --- a/googlemock/include/gmock/gmock-actions.h +++ b/googlemock/include/gmock/gmock-actions.h @@ -1426,7 +1426,7 @@ auto InvokeArgumentAdl(AdlTag, F f, Args... args) -> decltype(f(args...)) { typedef typename ::testing::internal::Function::Result return_type; \ typedef \ typename ::testing::internal::Function::ArgumentTuple args_type; \ - gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ + explicit gmock_Impl(GMOCK_ACTION_TYPE_GVALUE_PARAMS_(params)) \ : GMOCK_ACTION_INIT_PARAMS_(params) {} \ return_type Perform(const args_type& args) override { \ return ::testing::internal::ActionHelper Date: Fri, 24 Jan 2020 13:34:47 -0500 Subject: [PATCH 02/21] Googletest export Deleted an orphaned duplicate file and exclude another that shouldn't be part of :gtest_all_test. This showed up while trying to debug the presubmit failure for: https://github.com/google/googletest/pull/2683 PiperOrigin-RevId: 291398123 --- googletest/test/BUILD.bazel | 1 + googletest/test/googletest-test2_test.cc | 61 ------------------------ 2 files changed, 1 insertion(+), 61 deletions(-) delete mode 100644 googletest/test/googletest-test2_test.cc diff --git a/googletest/test/BUILD.bazel b/googletest/test/BUILD.bazel index 15f7eef8..456cc6f4 100644 --- a/googletest/test/BUILD.bazel +++ b/googletest/test/BUILD.bazel @@ -56,6 +56,7 @@ cc_test( "gtest-listener_test.cc", "gtest-unittest-api_test.cc", "googletest-param-test-test.cc", + "googletest-param-test2-test.cc", "googletest-catch-exceptions-test_.cc", "googletest-color-test_.cc", "googletest-env-var-test_.cc", diff --git a/googletest/test/googletest-test2_test.cc b/googletest/test/googletest-test2_test.cc deleted file mode 100644 index 2e425dae..00000000 --- a/googletest/test/googletest-test2_test.cc +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2008, Google Inc. -// All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// -// Tests for Google Test itself. This verifies that the basic constructs of -// Google Test work. - -#include "gtest/gtest.h" -#include "googletest-param-test-test.h" - -using ::testing::Values; -using ::testing::internal::ParamGenerator; - -// Tests that generators defined in a different translation unit -// are functional. The test using extern_gen_2 is defined -// in googletest-param-test-test.cc. -ParamGenerator extern_gen_2 = Values(33); - -// Tests that a parameterized test case can be defined in one translation unit -// and instantiated in another. The test is defined in -// googletest-param-test-test.cc and ExternalInstantiationTest fixture class is -// defined in gtest-param-test_test.h. -INSTANTIATE_TEST_SUITE_P(MultiplesOf33, - ExternalInstantiationTest, - Values(33, 66)); - -// Tests that a parameterized test case can be instantiated -// in multiple translation units. Another instantiation is defined -// in googletest-param-test-test.cc and -// InstantiationInMultipleTranslationUnitsTest fixture is defined in -// gtest-param-test_test.h -INSTANTIATE_TEST_SUITE_P(Sequence2, - InstantiationInMultipleTranslationUnitsTest, - Values(42*3, 42*4, 42*5)); - From 87061810f4c744cdc1abb8f1cd98970a986eea75 Mon Sep 17 00:00:00 2001 From: Abseil Team Date: Fri, 24 Jan 2020 14:09:22 -0500 Subject: [PATCH 03/21] Googletest export Move part of functionality of Matcher* class to the base one. Reduce copypaste. Make constructor and conversion operator of Matcher* class independent of pump. PiperOrigin-RevId: 291405510 --- .../include/gmock/gmock-generated-matchers.h | 264 +++++------------- .../gmock/gmock-generated-matchers.h.pump | 14 +- googlemock/include/gmock/gmock-matchers.h | 52 ++++ 3 files changed, 122 insertions(+), 208 deletions(-) diff --git a/googlemock/include/gmock/gmock-generated-matchers.h b/googlemock/include/gmock/gmock-generated-matchers.h index 61892380..4234b267 100644 --- a/googlemock/include/gmock/gmock-generated-matchers.h +++ b/googlemock/include/gmock/gmock-generated-matchers.h @@ -261,8 +261,12 @@ // https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md #define MATCHER(name, description)\ - class name##Matcher {\ + class name##Matcher : public \ + ::testing::internal::MatcherBaseImpl {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -290,14 +294,6 @@ ::std::tuple<>()));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl());\ - }\ - name##Matcher() {\ - }\ - private:\ };\ inline name##Matcher name() {\ return name##Matcher();\ @@ -310,8 +306,12 @@ #define MATCHER_P(name, p0, description)\ template \ - class name##MatcherP {\ + class name##MatcherP : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -340,15 +340,6 @@ ::std::tuple(p0)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0));\ - }\ - explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\ - }\ - p0##_type const p0;\ - private:\ };\ template \ inline name##MatcherP name(p0##_type p0) {\ @@ -363,8 +354,13 @@ #define MATCHER_P2(name, p0, p1, description)\ template \ - class name##MatcherP2 {\ + class name##MatcherP2 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -394,18 +390,6 @@ ::std::tuple(p0, p1)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1));\ - }\ - name##MatcherP2(p0##_type gmock_p0, \ - p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - private:\ };\ template \ inline name##MatcherP2 name(p0##_type p0, \ @@ -422,8 +406,13 @@ #define MATCHER_P3(name, p0, p1, p2, description)\ template \ - class name##MatcherP3 {\ + class name##MatcherP3 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -455,19 +444,6 @@ ::std::tuple(p0, p1, p2)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2));\ - }\ - name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - private:\ };\ template \ inline name##MatcherP3 name(p0##_type p0, \ @@ -485,8 +461,13 @@ #define MATCHER_P4(name, p0, p1, p2, p3, description)\ template \ - class name##MatcherP4 {\ + class name##MatcherP4 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -521,21 +502,6 @@ p1, p2, p3)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3));\ - }\ - name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - private:\ };\ template \ @@ -557,8 +523,13 @@ #define MATCHER_P5(name, p0, p1, p2, p3, p4, description)\ template \ - class name##MatcherP5 {\ + class name##MatcherP5 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -595,23 +566,6 @@ p4##_type>(p0, p1, p2, p3, p4)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4));\ - }\ - name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, \ - p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - private:\ };\ template \ @@ -633,8 +587,13 @@ #define MATCHER_P6(name, p0, p1, p2, p3, p4, p5, description)\ template \ - class name##MatcherP6 {\ + class name##MatcherP6 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -672,25 +631,6 @@ p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5));\ - }\ - name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - private:\ };\ template \ @@ -713,8 +653,13 @@ template \ - class name##MatcherP7 {\ + class name##MatcherP7 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -756,26 +701,6 @@ p6)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6));\ - }\ - name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - private:\ };\ template \ - class name##MatcherP8 {\ + class name##MatcherP8 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -845,29 +776,6 @@ p3, p4, p5, p6, p7)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7));\ - }\ - name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, \ - p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - private:\ };\ template \ - class name##MatcherP9 {\ + class name##MatcherP9 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -941,30 +855,6 @@ p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8));\ - }\ - name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - private:\ };\ template \ - class name##MatcherP10 {\ + class name##MatcherP10 : public \ + ::testing::internal::MatcherBaseImpl> {\ + using __internal_base_type = \ + ::testing::internal::MatcherBaseImpl;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -1042,32 +938,6 @@ p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9));\ - }\ - name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \ - p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \ - p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \ - p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \ - p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \ - p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \ - p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \ - p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \ - p9(::std::move(gmock_p9)) {\ - }\ - p0##_type const p0;\ - p1##_type const p1;\ - p2##_type const p2;\ - p3##_type const p3;\ - p4##_type const p4;\ - p5##_type const p5;\ - p6##_type const p6;\ - p7##_type const p7;\ - p8##_type const p8;\ - p9##_type const p9;\ - private:\ };\ template \ ]]]] -$var ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var impl_ctor_param_list = [[$for j, [[p$j##_type gmock_p$j]]]] $var impl_inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] -$var inits = [[$if i==0 [[]] $else [[ : $for j, [[p$j(::std::move(gmock_p$j))]]]]]] $var params = [[$for j, [[p$j]]]] $var param_types = [[$if i==0 [[]] $else [[<$for j, [[p$j##_type]]>]]]] $var param_types_and_names = [[$for j, [[p$j##_type p$j]]]] @@ -294,8 +292,10 @@ $var param_field_decls2 = [[$for j ]]]] #define $macro_name(name$for j [[, p$j]], description)\$template - class $class_name {\ + class $class_name : public ::testing::internal::MatcherBaseImpl<$class_name$param_types> {\ + using __internal_base_type = ::testing::internal::MatcherBaseImpl<$class_name>;\ public:\ + using __internal_base_type::__internal_base_type;\ template \ class gmock_Impl : public ::testing::MatcherInterface<\ GTEST_REFERENCE_TO_CONST_(arg_type)> {\ @@ -323,14 +323,6 @@ $var param_field_decls2 = [[$for j ::std::tuple<$for j, [[p$j##_type]]>($for j, [[p$j]])));\ }\ };\ - template \ - operator ::testing::Matcher() const {\ - return ::testing::Matcher(\ - new gmock_Impl($params));\ - }\ - [[$if i==1 [[explicit ]]]]$class_name($ctor_param_list)$inits {\ - }\$param_field_decls2 - private:\ };\$template inline $class_name$param_types name($param_types_and_names) {\ return $class_name$param_types($params);\ diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index 4baeb1bd..f1805dbb 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -236,6 +236,58 @@ class MatcherCastImpl > { static Matcher Cast(const Matcher& matcher) { return matcher; } }; +// Template specialization for parameterless Matcher. +template +class MatcherBaseImpl { + public: + MatcherBaseImpl() = default; + + template + operator ::testing::Matcher() const { // NOLINT(runtime/explicit) + return ::testing::Matcher(new + typename Derived::template gmock_Impl()); + } +}; + +// Template specialization for Matcher with 1 parameter. +template