<div dir="ltr"><div><a class="gmail_plusreply" id="plusReplyChip-1" href="mailto:benny.kra@googlemail.com" tabindex="-1">@benny.kra@gmail.com</a>,<br><br></div>This commit is triggering deprecation warnings that cause build failures for warning-as-errors builds:<br><span style="font-family:monospace">clangd/unittests/PrintASTTests.cpp:56:1: error: 'InstantiateTestCase_P_IsDeprecated' is deprecated: INSTANTIATE_TEST_CASE_P is deprecated, please use INSTANTIATE_TEST_SUITE_P [-Werror,-Wdeprecated-declarations]<br>INSTANTIATE_TEST_CASE_P(ASTUtilsTests, ASTUtils,<br>^</span><br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, May 14, 2021 at 1:17 PM Benjamin Kramer via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>
Author: Benjamin Kramer<br>
Date: 2021-05-14T19:16:31+02:00<br>
New Revision: d4d80a2903c1d074008cac653cdb0b5fe39b8a00<br>
<br>
URL: <a href="https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00</a><br>
DIFF: <a href="https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00.diff" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/d4d80a2903c1d074008cac653cdb0b5fe39b8a00.diff</a><br>
<br>
LOG: Bump googletest to 1.10.0<br>
<br>
Added: <br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
    llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
    llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
<br>
Modified: <br>
    clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
    clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
    clang/unittests/AST/ASTImporterObjCTest.cpp<br>
    clang/unittests/AST/ASTImporterTest.cpp<br>
    clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
    clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
    clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
    clang/unittests/Rename/RenameAliasTest.cpp<br>
    clang/unittests/Rename/RenameClassTest.cpp<br>
    clang/unittests/Rename/RenameEnumTest.cpp<br>
    clang/unittests/Rename/RenameMemberTest.cpp<br>
    clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
    clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
    clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
    clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
    clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
    flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
    lldb/unittests/Host/SocketTest.cpp<br>
    lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
    llvm/include/llvm/Testing/Support/Error.h<br>
    llvm/unittests/ADT/BitVectorTest.cpp<br>
    llvm/unittests/ADT/DenseMapTest.cpp<br>
    llvm/unittests/ADT/DenseSetTest.cpp<br>
    llvm/unittests/ADT/IListBaseTest.cpp<br>
    llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
    llvm/unittests/ADT/MapVectorTest.cpp<br>
    llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
    llvm/unittests/ADT/RangeAdapterTest.cpp<br>
    llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
    llvm/unittests/ADT/SmallVectorTest.cpp<br>
    llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
    llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
    llvm/unittests/CodeGen/DIETest.cpp<br>
    llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
    llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
    llvm/unittests/FileCheck/FileCheckTest.cpp<br>
    llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
    llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
    llvm/unittests/IR/PatternMatch.cpp<br>
    llvm/unittests/IR/ValueMapTest.cpp<br>
    llvm/unittests/Passes/PluginsTest.cpp<br>
    llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
    llvm/unittests/ProfileData/InstrProfTest.cpp<br>
    llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
    llvm/unittests/Support/MathExtrasTest.cpp<br>
    llvm/unittests/Support/MemoryTest.cpp<br>
    llvm/unittests/Support/TargetParserTest.cpp<br>
    llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
    llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
    llvm/unittests/XRay/GraphTest.cpp<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
    llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
    llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
    llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
    llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
    llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
    llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
    llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
    llvm/utils/unittest/googlemock/src/gmock.cc<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
    llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
    llvm/utils/unittest/googletest/src/gtest-all.cc<br>
    llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
    llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
    llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
    llvm/utils/unittest/googletest/src/gtest-port.cc<br>
    llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
    llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
    llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
    llvm/utils/unittest/googletest/src/gtest.cc<br>
<br>
Removed: <br>
    llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
    llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
    llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
<br>
<br>
################################################################################<br>
diff  --git a/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp b/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
index 44930b1043e4a..1206fac15d4a2 100644<br>
--- a/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterGenericRedeclTest.cpp<br>
@@ -417,231 +417,231 @@ struct RedeclChain : ASTImporterOptionSpecificTestBase {<br>
   }<br>
 };<br>
<br>
-#define ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(BaseTemplate, TypeParam,       \<br>
+#define ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(BaseTemplate, TypeParam,       \<br>
                                                 NamePrefix, TestCase)          \<br>
   using BaseTemplate##TypeParam = BaseTemplate<TypeParam>;                     \<br>
   TEST_P(BaseTemplate##TypeParam, NamePrefix##TestCase) {                      \<br>
     TypedTest_##TestCase();                                                    \<br>
   }<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, Function, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, Class, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, EnumClass, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, Variable, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, FunctionTemplate, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, ClassTemplate, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, VariableTemplate, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, FunctionTemplateSpec, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(<br>
     RedeclChain, ClassTemplateSpec, ,<br>
     PrototypeShouldBeImportedAsAPrototypeWhenThereIsNoDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         DefinitionShouldBeImportedAsADefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportPrototypeAfterImportedPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportDefinitionAfterImportedPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportPrototypeAfterImportedDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, , ImportPrototypes)<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportPrototypes)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportPrototypes)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, , ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, , ImportDefinitions)<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportDefinitions)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportDefinitions)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportDefinitionThenPrototype)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportDefinitionThenPrototype)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Class, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Class, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, EnumClass, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, EnumClass, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplate, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportPrototypeThenDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, ClassTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, ClassTemplateSpec, ,<br>
                                         ImportPrototypeThenDefinition)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         WholeRedeclChainIsImportedAtOnce)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         WholeRedeclChainIsImportedAtOnce)<br>
<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Function, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Function, ,<br>
                                         ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, Variable, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, Variable, ,<br>
                                         ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplate, ,<br>
                                         ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, VariableTemplate, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, VariableTemplate, ,<br>
                                         ImportPrototypeThenProtoAndDefinition)<br>
-ASTIMPORTER_INSTANTIATE_TYPED_TEST_CASE(RedeclChain, FunctionTemplateSpec, ,<br>
+ASTIMPORTER_INSTANTIATE_TYPED_TEST_SUITE(RedeclChain, FunctionTemplateSpec, ,<br>
                                         ImportPrototypeThenProtoAndDefinition)<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunction,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClass,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainEnumClass,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainVariable,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplate,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplate,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainVariableTemplate,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainFunctionTemplateSpec,<br>
-                        DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedeclChainClassTemplateSpec,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunction,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClass,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainEnumClass,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainVariable,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunctionTemplate,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClassTemplate,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainVariableTemplate,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainFunctionTemplateSpec,<br>
+                        DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedeclChainClassTemplateSpec,<br>
+                        DefaultTestValuesForRunOptions);<br>
<br>
 } // end namespace ast_matchers<br>
 } // end namespace clang<br>
<br>
diff  --git a/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp b/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
index 10cafe5bc6342..eabdfeb03ede2 100644<br>
--- a/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterODRStrategiesTest.cpp<br>
@@ -382,7 +382,7 @@ struct ODRViolation : ASTImporterOptionSpecificTestBase {<br>
 // Define the parametrized tests.<br>
 // ==============================<br>
<br>
-#define ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(                           \<br>
+#define ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(                           \<br>
     TypeParam, ODRHandlingParam, NamePrefix, TestCase)                         \<br>
   using TypeParam##ODRHandlingParam =                                          \<br>
       ODRViolation<TypeParam, ASTImporter::ODRHandlingType::ODRHandlingParam>; \<br>
@@ -392,167 +392,167 @@ struct ODRViolation : ASTImporterOptionSpecificTestBase {<br>
<br>
 // clang-format off<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Typedef, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     TypedefAlias, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Enum, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     EnumClass, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     EnumConstant, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Class, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     VarTemplate, Liberal, ,<br>
     ImportConflictingDefAfterDef)<br>
 // Class and variable template specializations/instantiatons are always<br>
 // imported conservatively, because the AST holds the specializations in a set,<br>
 // and the key within the set is a hash calculated from the arguments of the<br>
 // specialization.<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplateSpec, Liberal, ,<br>
     DontImportConflictingDefAfterDef) // Don't import !!!<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     VarTemplateSpec, Liberal, ,<br>
     DontImportConflictingDefAfterDef) // Don't import !!!<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Typedef, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     TypedefAlias, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Enum, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     EnumClass, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     EnumConstant, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Class, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     VarTemplate, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplateSpec, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     VarTemplateSpec, Conservative, ,<br>
     DontImportConflictingDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Liberal, ,<br>
     ImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Liberal, ,<br>
     ImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingProtoAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Conservative, ,<br>
     DontImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Conservative, ,<br>
     DontImportConflictingProtoAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingProtoAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Liberal, ,<br>
     ImportConflictingProtoAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingProtoAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Conservative, ,<br>
     DontImportConflictingProtoAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingProtoAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Liberal, ,<br>
     ImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Liberal, ,<br>
     ImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Function, Conservative, ,<br>
     DontImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     Variable, Conservative, ,<br>
     DontImportConflictingDefAfterProto)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingProtoDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingProtoDefAfterProto)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingProtoAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingProtoAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingProtoDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingProtoDefAfterDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Liberal, ,<br>
     ImportConflictingDefAfterProtoDef)<br>
<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     ClassTemplate, Conservative, ,<br>
     DontImportConflictingDefAfterProtoDef)<br>
<br>
@@ -565,28 +565,28 @@ ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
 // has nothing to do with function template specializations. Fully specialized<br>
 // function templates are imported as new nodes if their template arguments are<br>
 // <br>
diff erent.<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplate, Liberal, ,<br>
     ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplateSpec, Liberal, ,<br>
     ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplate, Conservative, ,<br>
     ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplateSpec, Conservative, ,<br>
     ImportDifferentDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplate, Liberal, ,<br>
     DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplateSpec, Liberal, ,<br>
     DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplate, Conservative, ,<br>
     DontImportSameDefAfterDef)<br>
-ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
+ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_SUITE(<br>
     FunctionTemplateSpec, Conservative, ,<br>
     DontImportSameDefAfterDef)<br>
<br>
@@ -596,99 +596,99 @@ ASTIMPORTER_ODR_INSTANTIATE_TYPED_TEST_CASE(<br>
<br>
 // FIXME: These fail on Windows.<br>
 #if !defined(_WIN32)<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions );<br>
 #endif<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, TypedefConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, TypedefAliasConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumClassConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumConstantConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, VariableConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassTemplateConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionTemplateConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions);<br>
 // FIXME: Make VarTemplate tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
     //ODRViolationTests, VarTemplateConservative,<br>
-    //DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    //DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionTemplateSpecConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassTemplateSpecConservative,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions);<br>
 // FIXME: Make VarTemplateSpec tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
     //ODRViolationTests, VarTemplateSpecConservative,<br>
-    //DefaultTestValuesForRunOptions, );<br>
+    //DefaultTestValuesForRunOptions);<br>
<br>
 // FIXME: These fail on Windows.<br>
 #if !defined(_WIN32)<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions);<br>
 #endif<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, TypedefLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, TypedefAliasLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumClassLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, EnumConstantLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, VariableLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassTemplateLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionTemplateLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions);<br>
 // FIXME: Make VarTemplate tests work.<br>
-// INSTANTIATE_TEST_CASE_P(<br>
+// INSTANTIATE_TEST_SUITE_P(<br>
 //     ODRViolationTests, VarTemplateLiberal,<br>
-//     DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+//     DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, ClassTemplateSpecLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+    DefaultTestValuesForRunOptions);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ODRViolationTests, FunctionTemplateSpecLiberal,<br>
-    DefaultTestValuesForRunOptions, );<br>
+    DefaultTestValuesForRunOptions);<br>
 // FIXME: Make VarTemplateSpec tests work.<br>
-//INSTANTIATE_TEST_CASE_P(<br>
+//INSTANTIATE_TEST_SUITE_P(<br>
     //ODRViolationTests, VarTemplateSpecLiberal,<br>
-    //DefaultTestValuesForRunOptions, );<br>
+    //DefaultTestValuesForRunOptions );<br>
<br>
 // clang-format on<br>
<br>
<br>
diff  --git a/clang/unittests/AST/ASTImporterObjCTest.cpp b/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
index 2d848dcf754ed..c9751fd8dda8b 100644<br>
--- a/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterObjCTest.cpp<br>
@@ -85,5 +85,5 @@ static const auto ObjCTestArrayForRunOptions =<br>
 const auto ObjCTestValuesForRunOptions =<br>
     ::testing::ValuesIn(ObjCTestArrayForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportObjCDecl,<br>
-                        ObjCTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportObjCDecl,<br>
+                         ObjCTestValuesForRunOptions);<br>
<br>
diff  --git a/clang/unittests/AST/ASTImporterTest.cpp b/clang/unittests/AST/ASTImporterTest.cpp<br>
index b0a8c829809dd..e62203f286572 100644<br>
--- a/clang/unittests/AST/ASTImporterTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterTest.cpp<br>
@@ -5568,15 +5568,15 @@ TEST_P(ASTImporterOptionSpecificTestBase,<br>
   EXPECT_EQ(ImportedX->isAggregate(), FromX->isAggregate());<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, SVEBuiltins,<br>
-                        ::testing::Values(std::vector<std::string>{<br>
-                            "-target", "aarch64-linux-gnu"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, SVEBuiltins,<br>
+                         ::testing::Values(std::vector<std::string>{<br>
+                             "-target", "aarch64-linux-gnu"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, DeclContextTest,<br>
-                        ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, DeclContextTest,<br>
+                         ::testing::Values(std::vector<std::string>()));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, CanonicalRedeclChain,<br>
-                        ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, CanonicalRedeclChain,<br>
+                         ::testing::Values(std::vector<std::string>()));<br>
<br>
 TEST_P(ASTImporterOptionSpecificTestBase, LambdasAreDifferentiated) {<br>
   Decl *FromTU = getTuDecl(<br>
@@ -6226,8 +6226,8 @@ TEST_P(CTAD, DeductionGuideShouldCopyALocalTypedef) {<br>
   EXPECT_NE(Param->getType()->castAs<TypedefType>()->getDecl(), Typedef);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, CTAD,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, CTAD,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
 TEST_P(ASTImporterOptionSpecificTestBase, TypedefWithAttribute) {<br>
   Decl *TU = getTuDecl(<br>
@@ -6323,79 +6323,79 @@ TEST_P(ASTImporterOptionSpecificTestBase, ImportEnumMemberSpecialization) {<br>
             ToD->getTemplateSpecializationKind());<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterLookupTableTest,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterLookupTableTest,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportPath,<br>
-                        ::testing::Values(std::vector<std::string>()), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportPath,<br>
+                         ::testing::Values(std::vector<std::string>()));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportExpr,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportExpr,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFixedPointExpr,<br>
-                        ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
-                                          std::vector<std::string>{<br>
-                                              "-ffixed-point"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFixedPointExpr,<br>
+                         ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
+                                           std::vector<std::string>{<br>
+                                               "-ffixed-point"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportBlock,<br>
-                        ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
-                                          std::vector<std::string>{<br>
-                                              "-fblocks"}), );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportBlock,<br>
+                         ExtendWithOptions(DefaultTestArrayForRunOptions,<br>
+                                           std::vector<std::string>{<br>
+                                               "-fblocks"}));<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportType,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportType,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportDecl,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportDecl,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ASTImporterOptionSpecificTestBase,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ASTImporterOptionSpecificTestBase,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ErrorHandlingTest,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ErrorHandlingTest,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, RedirectingImporterTest,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, RedirectingImporterTest,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctions,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctions,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportAutoFunctions,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportAutoFunctions,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionTemplates,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctionTemplates,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendFunctionTemplates,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendFunctionTemplates,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportClasses,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportClasses,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendFunctions,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendFunctions,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFriendClasses,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFriendClasses,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
-                        ImportFunctionTemplateSpecializations,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
+                         ImportFunctionTemplateSpecializations,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportImplicitMethods,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportImplicitMethods,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportVariables,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportVariables,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, LLDBLookupTest,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, LLDBLookupTest,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportSourceLocations,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportSourceLocations,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportWithExternalSource,<br>
-                        DefaultTestValuesForRunOptions, );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportWithExternalSource,<br>
+                         DefaultTestValuesForRunOptions);<br>
<br>
 } // end namespace ast_matchers<br>
 } // end namespace clang<br>
<br>
diff  --git a/clang/unittests/AST/ASTImporterVisibilityTest.cpp b/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
index 262402415658f..cf3e51caeac7a 100644<br>
--- a/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
+++ b/clang/unittests/AST/ASTImporterVisibilityTest.cpp<br>
@@ -177,11 +177,11 @@ TEST_P(ImportClassTemplatesVisibilityChain, ImportChain) {<br>
 }<br>
<br>
 // Automatic instantiation of the value-parameterized tests.<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportFunctionsVisibilityChain,<br>
-                        ::testing::Combine(<br>
-                           DefaultTestValuesForRunOptions,<br>
-                           ::testing::Values(ExternF, StaticF, AnonF)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportFunctionsVisibilityChain,<br>
+                         ::testing::Combine(DefaultTestValuesForRunOptions,<br>
+                                            ::testing::Values(ExternF, StaticF,<br>
+                                                              AnonF)));<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportVariablesVisibilityChain,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -192,31 +192,31 @@ INSTANTIATE_TEST_CASE_P(<br>
         // initializer is a tentative definition, subsequent definitions may be<br>
         // provided but they must have the same linkage.  See also the test<br>
         // ImportVariableChainInC which test for this special C Lang case.<br>
-        ::testing::Values(ExternV, AnonV)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+        ::testing::Values(ExternV, AnonV)) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportClassesVisibilityChain,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
-        ::testing::Values(ExternC, AnonC)), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+        ::testing::Values(ExternC, AnonC)) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportScopedEnumsVisibilityChain,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
-        ::testing::Values(ExternEC, AnonEC)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
+        ::testing::Values(ExternEC, AnonEC)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
                         ImportFunctionTemplatesVisibilityChain,<br>
                         ::testing::Combine(DefaultTestValuesForRunOptions,<br>
                                            ::testing::Values(ExternFT, StaticFT,<br>
-                                                             AnonFT)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests,<br>
+                                                             AnonFT)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests,<br>
                         ImportVariableTemplatesVisibilityChain,<br>
                         ::testing::Combine(DefaultTestValuesForRunOptions,<br>
                                            ::testing::Values(ExternVT,<br>
-                                                             AnonVT)), );<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedTests, ImportClassTemplatesVisibilityChain,<br>
+                                                             AnonVT)) );<br>
+INSTANTIATE_TEST_SUITE_P(ParameterizedTests, ImportClassTemplatesVisibilityChain,<br>
                         ::testing::Combine(DefaultTestValuesForRunOptions,<br>
                                            ::testing::Values(ExternCT,<br>
-                                                             AnonCT)), );<br>
+                                                             AnonCT)) );<br>
<br>
 // First value in tuple: Compile options.<br>
 // Second value in tuple: Tuple with informations for the test.<br>
@@ -398,7 +398,7 @@ TEST_P(ImportClassTemplatesVisibility, ImportAfterImport) {<br>
 const bool ExpectLinkedDeclChain = true;<br>
 const bool ExpectUnlinkedDeclChain = false;<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportFunctionsVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -411,8 +411,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(StaticF, AnonF, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonF, ExternF, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonF, StaticF, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonF, AnonF, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonF, AnonF, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportVariablesVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -425,8 +425,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(StaticV, AnonV, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonV, ExternV, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonV, StaticV, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonV, AnonV, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonV, AnonV, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportClassesVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -434,8 +434,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(ExternC, ExternC, ExpectLinkedDeclChain),<br>
             std::make_tuple(ExternC, AnonC, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonC, ExternC, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonC, AnonC, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonC, AnonC, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportEnumsVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -443,8 +443,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(ExternE, ExternE, ExpectLinkedDeclChain),<br>
             std::make_tuple(ExternE, AnonE, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonE, ExternE, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonE, AnonE, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonE, AnonE, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportScopedEnumsVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -452,8 +452,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(ExternEC, ExternEC, ExpectLinkedDeclChain),<br>
             std::make_tuple(ExternEC, AnonEC, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonEC, ExternEC, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonEC, AnonEC, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonEC, AnonEC, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportTypedefNameVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -480,8 +480,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(ExternTypedef, AnonUsing, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonTypedef, ExternUsing, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonTypedef, AnonUsing,<br>
-                            ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+                            ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportFunctionTemplatesVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -494,8 +494,8 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(StaticFT, AnonFT, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonFT, ExternFT, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonFT, StaticFT, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonFT, AnonFT, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonFT, AnonFT, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportVariableTemplatesVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
@@ -508,14 +508,14 @@ INSTANTIATE_TEST_CASE_P(<br>
             std::make_tuple(StaticVT, AnonVT, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonVT, ExternVT, ExpectUnlinkedDeclChain),<br>
             std::make_tuple(AnonVT, StaticVT, ExpectUnlinkedDeclChain),<br>
-            std::make_tuple(AnonVT, AnonVT, ExpectUnlinkedDeclChain))), );<br>
-INSTANTIATE_TEST_CASE_P(<br>
+            std::make_tuple(AnonVT, AnonVT, ExpectUnlinkedDeclChain))) );<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ParameterizedTests, ImportClassTemplatesVisibility,<br>
     ::testing::Combine(<br>
         DefaultTestValuesForRunOptions,<br>
         ::testing::Values(std::make_tuple(ExternCT, ExternCT, ExpectLinkedDeclChain),<br>
                           std::make_tuple(ExternCT, AnonCT, ExpectUnlinkedDeclChain),<br>
                           std::make_tuple(AnonCT, ExternCT, ExpectUnlinkedDeclChain),<br>
-                          std::make_tuple(AnonCT, AnonCT, ExpectUnlinkedDeclChain))), );<br>
+                          std::make_tuple(AnonCT, AnonCT, ExpectUnlinkedDeclChain))) );<br>
 } // end namespace ast_matchers<br>
 } // end namespace clang<br>
<br>
diff  --git a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
index 23b31509cd488..c179ce11fefb9 100644<br>
--- a/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
+++ b/clang/unittests/ASTMatchers/ASTMatchersNodeTest.cpp<br>
@@ -2302,8 +2302,8 @@ static std::vector<TestClangConfig> allTestClangConfigs() {<br>
   return all_configs;<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(ASTMatchersTests, ASTMatchersTest,<br>
-                        testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(ASTMatchersTests, ASTMatchersTest,<br>
+                         testing::ValuesIn(allTestClangConfigs()));<br>
<br>
 } // namespace ast_matchers<br>
 } // namespace clang<br>
<br>
diff  --git a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
index a968d292b53f5..a4410d330d393 100644<br>
--- a/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
+++ b/clang/unittests/Analysis/ExprMutationAnalyzerTest.cpp<br>
@@ -203,9 +203,9 @@ TEST_P(AssignmentTest, AssignmentModifies) {<br>
   }<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllAssignmentOperators, AssignmentTest,<br>
+INSTANTIATE_TEST_SUITE_P(AllAssignmentOperators, AssignmentTest,<br>
                         Values("=", "+=", "-=", "*=", "/=", "%=", "&=", "|=",<br>
-                               "^=", "<<=", ">>="), );<br>
+                               "^=", "<<=", ">>=") );<br>
<br>
 TEST(ExprMutationAnalyzerTest, AssignmentConditionalWithInheritance) {<br>
   const auto AST = buildASTFromCode("struct Base {void nonconst(); };"<br>
@@ -230,9 +230,9 @@ TEST_P(IncDecTest, IncDecModifies) {<br>
   EXPECT_THAT(mutatedBy(Results, AST.get()), ElementsAre(ModExpr));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllIncDecOperators, IncDecTest,<br>
+INSTANTIATE_TEST_SUITE_P(AllIncDecOperators, IncDecTest,<br>
                         Values("++x", "--x", "x++", "x--", "++(x)", "--(x)",<br>
-                               "(x)++", "(x)--"), );<br>
+                               "(x)++", "(x)--") );<br>
<br>
 // Section: member functions<br>
<br>
<br>
diff  --git a/clang/unittests/Rename/RenameAliasTest.cpp b/clang/unittests/Rename/RenameAliasTest.cpp<br>
index ad9ce65ac8492..50fa2c104263f 100644<br>
--- a/clang/unittests/Rename/RenameAliasTest.cpp<br>
+++ b/clang/unittests/Rename/RenameAliasTest.cpp<br>
@@ -45,7 +45,7 @@ class RenameAliasTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameAliasTests, RenameAliasTest,<br>
     testing::ValuesIn(std::vector<Case>({<br>
         // basic functions<br>
@@ -190,7 +190,7 @@ INSTANTIATE_TEST_CASE_P(<br>
          "NewTPtr"},<br>
         {"void f(::TPtr<int> p) {}", "void f(::NewTPtr<int> p) {}", "TPtr",<br>
          "NewTPtr"},<br>
-    })), );<br>
+    })));<br>
<br>
 TEST_P(RenameAliasTest, RenameAlias) {<br>
   auto Param = GetParam();<br>
<br>
diff  --git a/clang/unittests/Rename/RenameClassTest.cpp b/clang/unittests/Rename/RenameClassTest.cpp<br>
index 1b008987a16d3..24370b5795e94 100644<br>
--- a/clang/unittests/Rename/RenameClassTest.cpp<br>
+++ b/clang/unittests/Rename/RenameClassTest.cpp<br>
@@ -45,7 +45,7 @@ class RenameClassTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameClassTests, RenameClassTest,<br>
     testing::ValuesIn(std::vector<Case>({<br>
         // basic classes<br>
@@ -189,7 +189,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         // friends, everyone needs friends.<br>
         {"class Foo { int i; friend class a::Foo; };",<br>
          "class Foo { int i; friend class b::Bar; };", "", ""},<br>
-    })), );<br>
+    })) );<br>
<br>
 TEST_P(RenameClassTest, RenameClasses) {<br>
   auto Param = GetParam();<br>
@@ -217,7 +217,7 @@ class NamespaceDetectionTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameClassTest, NamespaceDetectionTest,<br>
     ::testing::ValuesIn(std::vector<Case>({<br>
         // Test old and new namespace overlap.<br>
@@ -298,7 +298,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         {"namespace o1 { class Foo { int i; friend class Old; }; }",<br>
          "namespace o1 { class Foo { int i; friend class New; }; }",<br>
          "::o1::Old", "::o1::New"},<br>
-    })), );<br>
+    })) );<br>
<br>
 TEST_P(NamespaceDetectionTest, RenameClasses) {<br>
   auto Param = GetParam();<br>
@@ -339,7 +339,7 @@ class TemplatedClassRenameTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameClassTests, TemplatedClassRenameTest,<br>
     ::testing::ValuesIn(std::vector<Case>({<br>
         {"Old<int> gI; Old<bool> gB;", "New<int> gI; New<bool> gB;", "Old",<br>
@@ -394,7 +394,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         {"template <typename T> struct Moo { ns::Old<T> o_; }; Moo<int> m;",<br>
          "template <typename T> struct Moo { ns::New<T> o_; }; Moo<int> m;",<br>
          "ns::Old", "ns::New"},<br>
-    })), );<br>
+    })) );<br>
<br>
 TEST_P(TemplatedClassRenameTest, RenameTemplateClasses) {<br>
   auto Param = GetParam();<br>
<br>
diff  --git a/clang/unittests/Rename/RenameEnumTest.cpp b/clang/unittests/Rename/RenameEnumTest.cpp<br>
index 55dcd11ac4128..dc3440047c4a4 100644<br>
--- a/clang/unittests/Rename/RenameEnumTest.cpp<br>
+++ b/clang/unittests/Rename/RenameEnumTest.cpp<br>
@@ -26,7 +26,7 @@ class RenameEnumTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameEnumTests, RenameEnumTest,<br>
     testing::ValuesIn(std::vector<Case>({<br>
         {"void f(a::A2 arg) { a::A2 t = a::A2::Blue; }",<br>
@@ -142,7 +142,7 @@ INSTANTIATE_TEST_CASE_P(<br>
          "struct Foo { template <typename T> T foo(); }; void g() { Foo f;  "<br>
          "f.foo<b::B2>(); }",<br>
          "a::A2", "b::B2"},<br>
-    })), );<br>
+    })) );<br>
<br>
 TEST_P(RenameEnumTest, RenameEnums) {<br>
   auto Param = GetParam();<br>
<br>
diff  --git a/clang/unittests/Rename/RenameMemberTest.cpp b/clang/unittests/Rename/RenameMemberTest.cpp<br>
index c9192c638a225..c16d16aa25f04 100644<br>
--- a/clang/unittests/Rename/RenameMemberTest.cpp<br>
+++ b/clang/unittests/Rename/RenameMemberTest.cpp<br>
@@ -69,15 +69,15 @@ class RenameMemberTest : public ClangRenameTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DISABLED_RenameTemplatedClassStaticVariableTest, RenameMemberTest,<br>
     testing::ValuesIn(std::vector<Case>({<br>
         // FIXME: support renaming static variables for template classes.<br>
         {"void f() { ns::TA<int>::SMoo; }",<br>
          "void f() { ns::TA<int>::SMeh; }", "ns::TA::SMoo", "ns::TA::SMeh"},<br>
-    })), );<br>
+    })) );<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     RenameMemberTest, RenameMemberTest,<br>
     testing::ValuesIn(std::vector<Case>({<br>
         // Normal methods and fields.<br>
@@ -154,7 +154,7 @@ INSTANTIATE_TEST_CASE_P(<br>
          "TA::SFoo", "TB::SBar"},<br>
         {"void f() { ns::TB<int>::SFoo(); }",<br>
          "void f() { ns::TB<int>::SBar(); }", "ns::TA::SFoo", "ns::TB::SBar"},<br>
-    })), );<br>
+    })) );<br>
<br>
 TEST_P(RenameMemberTest, RenameMembers) {<br>
   auto Param = GetParam();<br>
<br>
diff  --git a/clang/unittests/StaticAnalyzer/RangeSetTest.cpp b/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
index 5be2ee3fc520b..c29a5eef00e16 100644<br>
--- a/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
+++ b/clang/unittests/StaticAnalyzer/RangeSetTest.cpp<br>
@@ -188,7 +188,7 @@ llvm::APSInt RangeSetTest<BaseType>::Base{sizeof(BaseType) * 8, !isSigned()};<br>
<br>
 using IntTypes = ::testing::Types<int8_t, uint8_t, int16_t, uint16_t, int32_t,<br>
                                   uint32_t, int64_t, uint64_t>;<br>
-TYPED_TEST_CASE(RangeSetTest, IntTypes);<br>
+TYPED_TEST_SUITE(RangeSetTest, IntTypes);<br>
<br>
 TYPED_TEST(RangeSetTest, RangeSetNegateTest) {<br>
   // Use next values of the range {MIN, A, B, MID, C, D, MAX}.<br>
<br>
diff  --git a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
index b6bcd4eb2da5d..8529d65265761 100644<br>
--- a/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/BuildTreeTest.cpp<br>
@@ -88,8 +88,8 @@ class BuildSyntaxTreeTest : public SyntaxTreeTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(SyntaxTreeTests, BuildSyntaxTreeTest,<br>
-                        testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SyntaxTreeTests, BuildSyntaxTreeTest,<br>
+                        testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
 TEST_P(BuildSyntaxTreeTest, Simple) {<br>
   EXPECT_TRUE(treeDumpEqual(<br>
<br>
diff  --git a/clang/unittests/Tooling/Syntax/MutationsTest.cpp b/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
index f63d3dffa4597..34279dc2d941b 100644<br>
--- a/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/MutationsTest.cpp<br>
@@ -54,8 +54,8 @@ class MutationTest : public SyntaxTreeTest {<br>
   };<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(SyntaxTreeTests, MutationTest,<br>
-                        ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SyntaxTreeTests, MutationTest,<br>
+                        ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
 TEST_P(MutationTest, RemoveStatement_InCompound) {<br>
   CheckTransformation(RemoveStatement, "void test() { [[100+100;]] test(); }",<br>
<br>
diff  --git a/clang/unittests/Tooling/Syntax/SynthesisTest.cpp b/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
index a815989bc93fe..0bdc7bbdeb0f9 100644<br>
--- a/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/SynthesisTest.cpp<br>
@@ -38,8 +38,8 @@ class SynthesisTest : public SyntaxTreeTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(SynthesisTests, SynthesisTest,<br>
-                        ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(SynthesisTests, SynthesisTest,<br>
+                        ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
 TEST_P(SynthesisTest, Leaf_Punctuation) {<br>
   buildTree("", GetParam());<br>
<br>
diff  --git a/clang/unittests/Tooling/Syntax/TreeTest.cpp b/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
index ed839e269dde4..06da4e80156a4 100644<br>
--- a/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
+++ b/clang/unittests/Tooling/Syntax/TreeTest.cpp<br>
@@ -103,8 +103,8 @@ class TreeTest : public SyntaxTreeTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(TreeTests, TreeTest,<br>
-                        ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(TreeTests, TreeTest,<br>
+                        ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
 TEST_P(TreeTest, FirstLeaf) {<br>
   buildTree("", GetParam());<br>
@@ -222,8 +222,8 @@ class ListTest : public SyntaxTreeTest {<br>
   }<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(TreeTests, ListTest,<br>
-                        ::testing::ValuesIn(allTestClangConfigs()), );<br>
+INSTANTIATE_TEST_SUITE_P(TreeTests, ListTest,<br>
+                        ::testing::ValuesIn(allTestClangConfigs()) );<br>
<br>
 /// "a, b, c"  <=> [("a", ","), ("b", ","), ("c", null)]<br>
 TEST_P(ListTest, List_Separated_WellFormed) {<br>
<br>
diff  --git a/flang/unittests/RuntimeGTest/ListInputTest.cpp b/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
index 9654048f20bb8..7aa42905c4365 100644<br>
--- a/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
+++ b/flang/unittests/RuntimeGTest/ListInputTest.cpp<br>
@@ -183,9 +183,9 @@ TEST_P(SimpleListInputTest, TestListInput) {<br>
   }<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(SimpleListInputTestInstantiation, SimpleListInputTest,<br>
+INSTANTIATE_TEST_SUITE_P(SimpleListInputTestInstantiation, SimpleListInputTest,<br>
     testing::Values(std::make_tuple("", std::vector<int>{}),<br>
         std::make_tuple("0", std::vector<int>{}),<br>
         std::make_tuple("1", std::vector<int>{1}),<br>
         std::make_tuple("1, 2", std::vector<int>{1, 2}),<br>
-        std::make_tuple("3*2", std::vector<int>{2, 2, 2})), );<br>
+        std::make_tuple("3*2", std::vector<int>{2, 2, 2})));<br>
<br>
diff  --git a/lldb/unittests/Host/SocketTest.cpp b/lldb/unittests/Host/SocketTest.cpp<br>
index 901f878d2e466..27d42f835718b 100644<br>
--- a/lldb/unittests/Host/SocketTest.cpp<br>
+++ b/lldb/unittests/Host/SocketTest.cpp<br>
@@ -228,7 +228,7 @@ TEST_P(SocketTest, DomainGetConnectURI) {<br>
 }<br>
 #endif<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     SocketTests, SocketTest,<br>
     testing::Values(SocketTestParams{/*is_ipv6=*/false,<br>
                                      /*localhost_ip=*/"127.0.0.1"},<br>
<br>
diff  --git a/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp b/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
index 203875533d93a..66db61ff65969 100644<br>
--- a/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
+++ b/lldb/unittests/Process/Utility/LinuxProcMapsTest.cpp<br>
@@ -62,7 +62,7 @@ TEST_P(LinuxProcMapsTestFixture, ParseMapRegions) {<br>
<br>
 // Note: ConstString("") != ConstString(nullptr)<br>
 // When a region has no name, it will have the latter in the MemoryRegionInfo<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ProcMapTests, LinuxProcMapsTestFixture,<br>
     ::testing::Values(<br>
         // Nothing in nothing out<br>
@@ -125,11 +125,11 @@ INSTANTIATE_TEST_CASE_P(<br>
                     ConstString("[vsyscall]"), MemoryRegionInfo::eDontKnow, 0,<br>
                     MemoryRegionInfo::eDontKnow),<br>
             },<br>
-            "")), );<br>
+            "")));<br>
<br>
 class LinuxProcSMapsTestFixture : public LinuxProcMapsTestFixture {};<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ProcSMapTests, LinuxProcSMapsTestFixture,<br>
     ::testing::Values(<br>
         // Nothing in nothing out<br>
@@ -253,7 +253,7 @@ INSTANTIATE_TEST_CASE_P(<br>
                                  MemoryRegionInfo::eDontKnow, 0,<br>
                                  MemoryRegionInfo::eDontKnow),<br>
             },<br>
-            "")), );<br>
+            "")));<br>
<br>
 TEST_P(LinuxProcSMapsTestFixture, ParseSMapRegions) {<br>
   auto params = GetParam();<br>
<br>
diff  --git a/llvm/include/llvm/Testing/Support/Error.h b/llvm/include/llvm/Testing/Support/Error.h<br>
index cd5b79cd6bfb0..67e9985b80f55 100644<br>
--- a/llvm/include/llvm/Testing/Support/Error.h<br>
+++ b/llvm/include/llvm/Testing/Support/Error.h<br>
@@ -42,7 +42,7 @@ class ValueMatchesMono<br>
<br>
     bool result = Matcher.MatchAndExplain(*Holder.Exp, listener);<br>
<br>
-    if (result)<br>
+    if (result || !listener->IsInterested())<br>
       return result;<br>
     *listener << "(";<br>
     Matcher.DescribeNegationTo(listener->stream());<br>
<br>
diff  --git a/llvm/unittests/ADT/BitVectorTest.cpp b/llvm/unittests/ADT/BitVectorTest.cpp<br>
index 1779f2fcc9c27..858adb36f22e4 100644<br>
--- a/llvm/unittests/ADT/BitVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/BitVectorTest.cpp<br>
@@ -21,7 +21,7 @@ class BitVectorTest : public ::testing::Test { };<br>
<br>
 // Test both BitVector and SmallBitVector with the same suite of tests.<br>
 typedef ::testing::Types<BitVector, SmallBitVector> BitVectorTestTypes;<br>
-TYPED_TEST_CASE(BitVectorTest, BitVectorTestTypes);<br>
+TYPED_TEST_SUITE(BitVectorTest, BitVectorTestTypes);<br>
<br>
 TYPED_TEST(BitVectorTest, TrivialOperation) {<br>
   TypeParam Vec;<br>
<br>
diff  --git a/llvm/unittests/ADT/DenseMapTest.cpp b/llvm/unittests/ADT/DenseMapTest.cpp<br>
index 9cd974f5bac31..e9fe4cb8d5cd2 100644<br>
--- a/llvm/unittests/ADT/DenseMapTest.cpp<br>
+++ b/llvm/unittests/ADT/DenseMapTest.cpp<br>
@@ -105,7 +105,7 @@ typedef ::testing::Types<DenseMap<uint32_t, uint32_t>,<br>
                          SmallDenseMap<CtorTester, CtorTester, 4,<br>
                                        CtorTesterMapInfo><br>
                          > DenseMapTestTypes;<br>
-TYPED_TEST_CASE(DenseMapTest, DenseMapTestTypes);<br>
+TYPED_TEST_SUITE(DenseMapTest, DenseMapTestTypes);<br>
<br>
 // Empty map tests<br>
 TYPED_TEST(DenseMapTest, EmptyIntMapTest) {<br>
<br>
diff  --git a/llvm/unittests/ADT/DenseSetTest.cpp b/llvm/unittests/ADT/DenseSetTest.cpp<br>
index ada53cac9b78d..1320e283c59aa 100644<br>
--- a/llvm/unittests/ADT/DenseSetTest.cpp<br>
+++ b/llvm/unittests/ADT/DenseSetTest.cpp<br>
@@ -68,7 +68,7 @@ typedef ::testing::Types<DenseSet<unsigned, TestDenseSetInfo>,<br>
                          const SmallDenseSet<unsigned, 4, TestDenseSetInfo>,<br>
                          SmallDenseSet<unsigned, 64, TestDenseSetInfo>><br>
     DenseSetTestTypes;<br>
-TYPED_TEST_CASE(DenseSetTest, DenseSetTestTypes);<br>
+TYPED_TEST_SUITE(DenseSetTest, DenseSetTestTypes);<br>
<br>
 TYPED_TEST(DenseSetTest, Constructor) {<br>
   constexpr unsigned a[] = {1, 2, 4};<br>
<br>
diff  --git a/llvm/unittests/ADT/IListBaseTest.cpp b/llvm/unittests/ADT/IListBaseTest.cpp<br>
index 2983618f07e4a..f4783c46f4194 100644<br>
--- a/llvm/unittests/ADT/IListBaseTest.cpp<br>
+++ b/llvm/unittests/ADT/IListBaseTest.cpp<br>
@@ -19,7 +19,7 @@ template <typename T> class IListBaseTest : public ::testing::Test {};<br>
 // Test variants with the same test.<br>
 typedef ::testing::Types<ilist_base<false>, ilist_base<true>><br>
     IListBaseTestTypes;<br>
-TYPED_TEST_CASE(IListBaseTest, IListBaseTestTypes);<br>
+TYPED_TEST_SUITE(IListBaseTest, IListBaseTestTypes);<br>
<br>
 TYPED_TEST(IListBaseTest, insertBeforeImpl) {<br>
   typedef TypeParam list_base_type;<br>
<br>
diff  --git a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
index 0123709dcf2e3..e35b78484f53a 100644<br>
--- a/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
+++ b/llvm/unittests/ADT/IntrusiveRefCntPtrTest.cpp<br>
@@ -28,7 +28,7 @@ template <typename T> struct IntrusiveRefCntPtrTest : testing::Test {};<br>
 typedef ::testing::Types<SimpleRefCounted<RefCountedBase>,<br>
                          SimpleRefCounted<ThreadSafeRefCountedBase>><br>
     IntrusiveRefCntTypes;<br>
-TYPED_TEST_CASE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes);<br>
+TYPED_TEST_SUITE(IntrusiveRefCntPtrTest, IntrusiveRefCntTypes);<br>
<br>
 TYPED_TEST(IntrusiveRefCntPtrTest, RefCountedBaseCopyDoesNotLeak) {<br>
   EXPECT_EQ(0, NumInstances);<br>
<br>
diff  --git a/llvm/unittests/ADT/MapVectorTest.cpp b/llvm/unittests/ADT/MapVectorTest.cpp<br>
index 7a77df45bce8d..92583e940d9c1 100644<br>
--- a/llvm/unittests/ADT/MapVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/MapVectorTest.cpp<br>
@@ -162,7 +162,7 @@ template <class IntType> struct MapVectorMappedTypeTest : ::testing::Test {<br>
<br>
 using MapIntTypes = ::testing::Types<int, long, long long, unsigned,<br>
                                      unsigned long, unsigned long long>;<br>
-TYPED_TEST_CASE(MapVectorMappedTypeTest, MapIntTypes);<br>
+TYPED_TEST_SUITE(MapVectorMappedTypeTest, MapIntTypes);<br>
<br>
 TYPED_TEST(MapVectorMappedTypeTest, DifferentDenseMap) {<br>
   // Test that using a map with a mapped type other than 'unsigned' compiles<br>
<br>
diff  --git a/llvm/unittests/ADT/PriorityWorklistTest.cpp b/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
index 4dfdd5f9a2611..42dca48d62fc0 100644<br>
--- a/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
+++ b/llvm/unittests/ADT/PriorityWorklistTest.cpp<br>
@@ -22,7 +22,7 @@ using namespace llvm;<br>
 template <typename T> class PriorityWorklistTest : public ::testing::Test {};<br>
 typedef ::testing::Types<PriorityWorklist<int>, SmallPriorityWorklist<int, 2>><br>
     TestTypes;<br>
-TYPED_TEST_CASE(PriorityWorklistTest, TestTypes);<br>
+TYPED_TEST_SUITE(PriorityWorklistTest, TestTypes);<br>
<br>
 TYPED_TEST(PriorityWorklistTest, Basic) {<br>
   TypeParam W;<br>
<br>
diff  --git a/llvm/unittests/ADT/RangeAdapterTest.cpp b/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
index eb1852639a3a6..ba37bcfd3d840 100644<br>
--- a/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
+++ b/llvm/unittests/ADT/RangeAdapterTest.cpp<br>
@@ -129,7 +129,7 @@ template <typename T> class RangeAdapterLValueTest : public ::testing::Test {};<br>
<br>
 typedef ::testing::Types<std::vector<int>, std::list<int>, int[4]><br>
     RangeAdapterLValueTestTypes;<br>
-TYPED_TEST_CASE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes);<br>
+TYPED_TEST_SUITE(RangeAdapterLValueTest, RangeAdapterLValueTestTypes);<br>
<br>
 TYPED_TEST(RangeAdapterLValueTest, TrivialOperation) {<br>
   TypeParam v = {0, 1, 2, 3};<br>
@@ -145,7 +145,7 @@ typedef ::testing::Types<std::vector<int>, std::list<int>, CustomIteratorVector,<br>
                          ReverseOnlyVector, BidirectionalVector,<br>
                          BidirectionalVectorConsts><br>
     RangeAdapterRValueTestTypes;<br>
-TYPED_TEST_CASE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);<br>
+TYPED_TEST_SUITE(RangeAdapterRValueTest, RangeAdapterRValueTestTypes);<br>
<br>
 TYPED_TEST(RangeAdapterRValueTest, TrivialOperation) {<br>
   TestRev(reverse(TypeParam({0, 1, 2, 3})));<br>
<br>
diff  --git a/llvm/unittests/ADT/STLForwardCompatTest.cpp b/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
index f85669516b79d..e8521fad26632 100644<br>
--- a/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
+++ b/llvm/unittests/ADT/STLForwardCompatTest.cpp<br>
@@ -59,7 +59,7 @@ using STLForwardCompatRemoveCVRefTestTypes = ::testing::Types<<br>
     // clang-format on<br>
     >;<br>
<br>
-TYPED_TEST_CASE(STLForwardCompatRemoveCVRefTest,<br>
+TYPED_TEST_SUITE(STLForwardCompatRemoveCVRefTest,<br>
                 STLForwardCompatRemoveCVRefTestTypes);<br>
<br>
 TYPED_TEST(STLForwardCompatRemoveCVRefTest, RemoveCVRef) {<br>
<br>
diff  --git a/llvm/unittests/ADT/SmallVectorTest.cpp b/llvm/unittests/ADT/SmallVectorTest.cpp<br>
index a533bb850a451..4673c659382d4 100644<br>
--- a/llvm/unittests/ADT/SmallVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/SmallVectorTest.cpp<br>
@@ -208,7 +208,7 @@ typedef ::testing::Types<SmallVector<Constructable, 0>,<br>
                          SmallVector<Constructable, 4>,<br>
                          SmallVector<Constructable, 5><br>
                          > SmallVectorTestTypes;<br>
-TYPED_TEST_CASE(SmallVectorTest, SmallVectorTestTypes);<br>
+TYPED_TEST_SUITE(SmallVectorTest, SmallVectorTestTypes);<br>
<br>
 // Constructor test.<br>
 TYPED_TEST(SmallVectorTest, ConstructorNonIterTest) {<br>
@@ -811,7 +811,7 @@ typedef ::testing::Types<<br>
     std::pair<SmallVector<Constructable, 2>, SmallVector<Constructable, 2>><br>
   > DualSmallVectorTestTypes;<br>
<br>
-TYPED_TEST_CASE(DualSmallVectorsTest, DualSmallVectorTestTypes);<br>
+TYPED_TEST_SUITE(DualSmallVectorsTest, DualSmallVectorTestTypes);<br>
<br>
 TYPED_TEST(DualSmallVectorsTest, MoveAssignment) {<br>
   SCOPED_TRACE("MoveAssignTest-DualVectorTypes");<br>
@@ -1095,7 +1095,7 @@ class SmallVectorReferenceInvalidationTest : public SmallVectorTestBase {<br>
 using SmallVectorReferenceInvalidationTestTypes =<br>
     ::testing::Types<SmallVector<int, 3>, SmallVector<Constructable, 3>>;<br>
<br>
-TYPED_TEST_CASE(SmallVectorReferenceInvalidationTest,<br>
+TYPED_TEST_SUITE(SmallVectorReferenceInvalidationTest,<br>
                 SmallVectorReferenceInvalidationTestTypes);<br>
<br>
 TYPED_TEST(SmallVectorReferenceInvalidationTest, PushBack) {<br>
@@ -1382,7 +1382,7 @@ using SmallVectorInternalReferenceInvalidationTestTypes =<br>
     ::testing::Types<SmallVector<std::pair<int, int>, 3>,<br>
                      SmallVector<std::pair<Constructable, Constructable>, 3>>;<br>
<br>
-TYPED_TEST_CASE(SmallVectorInternalReferenceInvalidationTest,<br>
+TYPED_TEST_SUITE(SmallVectorInternalReferenceInvalidationTest,<br>
                 SmallVectorInternalReferenceInvalidationTestTypes);<br>
<br>
 TYPED_TEST(SmallVectorInternalReferenceInvalidationTest, EmplaceBack) {<br>
<br>
diff  --git a/llvm/unittests/ADT/TinyPtrVectorTest.cpp b/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
index f88534787c9e4..d59bd7f4c5b47 100644<br>
--- a/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
+++ b/llvm/unittests/ADT/TinyPtrVectorTest.cpp<br>
@@ -83,7 +83,7 @@ class TinyPtrVectorTest : public testing::Test {<br>
 typedef ::testing::Types<TinyPtrVector<int *>, TinyPtrVector<double *>,<br>
                          TinyPtrVector<PointerIntPair<int *, 1>>><br>
     TinyPtrVectorTestTypes;<br>
-TYPED_TEST_CASE(TinyPtrVectorTest, TinyPtrVectorTestTypes);<br>
+TYPED_TEST_SUITE(TinyPtrVectorTest, TinyPtrVectorTestTypes);<br>
<br>
 TYPED_TEST(TinyPtrVectorTest, EmptyTest) {<br>
   this->expectValues(this->V, this->testArray(0));<br>
<br>
diff  --git a/llvm/unittests/Analysis/ValueTrackingTest.cpp b/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
index 99a0f6daa84db..2cfbc4cc65f55 100644<br>
--- a/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
+++ b/llvm/unittests/Analysis/ValueTrackingTest.cpp<br>
@@ -1859,8 +1859,8 @@ const std::pair<const char *, const char *> IsBytewiseValueTests[] = {<br>
     },<br>
 };<br>
<br>
-INSTANTIATE_TEST_CASE_P(IsBytewiseValueParamTests, IsBytewiseValueTest,<br>
-                        ::testing::ValuesIn(IsBytewiseValueTests),);<br>
+INSTANTIATE_TEST_SUITE_P(IsBytewiseValueParamTests, IsBytewiseValueTest,<br>
+                         ::testing::ValuesIn(IsBytewiseValueTests));<br>
<br>
 TEST_P(IsBytewiseValueTest, IsBytewiseValue) {<br>
   auto M = parseModule(std::string("@test = global ") + GetParam().second);<br>
@@ -2182,5 +2182,5 @@ TEST_P(FindAllocaForValueTest, findAllocaForValueZeroOffset) {<br>
   EXPECT_EQ(!!AI, GetParam().ZeroOffsetResult);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(FindAllocaForValueTest, FindAllocaForValueTest,<br>
-                        ::testing::ValuesIn(FindAllocaForValueTests), );<br>
+INSTANTIATE_TEST_SUITE_P(FindAllocaForValueTest, FindAllocaForValueTest,<br>
+                         ::testing::ValuesIn(FindAllocaForValueTests));<br>
<br>
diff  --git a/llvm/unittests/CodeGen/DIETest.cpp b/llvm/unittests/CodeGen/DIETest.cpp<br>
index 44fb0c0bf6c88..2e3f7b5f76c18 100644<br>
--- a/llvm/unittests/CodeGen/DIETest.cpp<br>
+++ b/llvm/unittests/CodeGen/DIETest.cpp<br>
@@ -67,7 +67,7 @@ TEST_P(DIEExprFixture, EmitValue) {<br>
   Tst.emitValue(TestPrinter->getAP(), Form);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DIETestParams, DIEExprFixture,<br>
     testing::Values(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -75,7 +75,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
-        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
 struct DIELabelFixture : public DIEFixtureBase {<br>
   void SetUp() override {<br>
@@ -113,7 +113,7 @@ TEST_P(DIELabelFixture, EmitValue) {<br>
   EXPECT_EQ(&(ActualArg0->getSymbol()), Val);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DIETestParams, DIELabelFixture,<br>
     testing::Values(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -125,7 +125,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_strp, 8u},<br>
-        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u}), );<br>
+        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_addr, 8u}));<br>
<br>
 struct DIEDeltaFixture : public DIEFixtureBase {<br>
   void SetUp() override {<br>
@@ -158,7 +158,7 @@ TEST_P(DIEDeltaFixture, EmitValue) {<br>
   Tst.emitValue(TestPrinter->getAP(), Form);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DIETestParams, DIEDeltaFixture,<br>
     testing::Values(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_data4, 4u},<br>
@@ -166,7 +166,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data4, 4u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
-        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
 struct DIELocListFixture : public DIEFixtureBase {<br>
   void SetUp() override { DIEFixtureBase::SetUp(); }<br>
@@ -180,7 +180,7 @@ TEST_P(DIELocListFixture, SizeOf) {<br>
   EXPECT_EQ(Size, Tst.SizeOf(TestPrinter->getAP(), Form));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DIETestParams, DIELocListFixture,<br>
     testing::Values(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_loclistx, 2u},<br>
@@ -188,6 +188,6 @@ INSTANTIATE_TEST_CASE_P(<br>
         DIETestParams{4, dwarf::DWARF32, dwarf::DW_FORM_sec_offset, 4u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_loclistx, 2u},<br>
         DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_data8, 8u},<br>
-        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}), );<br>
+        DIETestParams{4, dwarf::DWARF64, dwarf::DW_FORM_sec_offset, 8u}));<br>
<br>
 } // end namespace<br>
<br>
diff  --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
index 987e0e46ed195..9de6c83f5cc66 100644<br>
--- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugLineTest.cpp<br>
@@ -349,10 +349,10 @@ TEST_P(DebugLineUnsupportedVersionFixture, ErrorForUnsupportedVersion) {<br>
                         std::to_string(Version)));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(UnsupportedVersionTestParams,<br>
-                        DebugLineUnsupportedVersionFixture,<br>
-                        Values(/*1 below min */ 1, /* 1 above max */ 6,<br>
-                               /* Maximum possible */ 0xffff), );<br>
+INSTANTIATE_TEST_SUITE_P(UnsupportedVersionTestParams,<br>
+                         DebugLineUnsupportedVersionFixture,<br>
+                         Values(/*1 below min */ 1, /* 1 above max */ 6,<br>
+                                /* Maximum possible */ 0xffff));<br>
<br>
 TEST_F(DebugLineBasicFixture, ErrorForInvalidV5IncludeDirTable) {<br>
   if (!setupGenerator(5))<br>
@@ -477,13 +477,13 @@ TEST_P(DebugLineParameterisedFixture, ErrorForTooShortPrologueLength) {<br>
                     FailedWithMessageArray(testing::ElementsAreArray(Errs)));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     LineTableTestParams, DebugLineParameterisedFixture,<br>
     Values(std::make_pair(<br>
                2, DWARF32), // Test lower-bound of v2-3 fields and DWARF32.<br>
            std::make_pair(3, DWARF32), // Test upper-bound of v2-3 fields.<br>
            std::make_pair(4, DWARF64), // Test v4 fields and DWARF64.<br>
-           std::make_pair(5, DWARF32), std::make_pair(5, DWARF64)), );<br>
+           std::make_pair(5, DWARF32), std::make_pair(5, DWARF64)));<br>
<br>
 TEST_F(DebugLineBasicFixture, ErrorForExtendedOpcodeLengthSmallerThanExpected) {<br>
   if (!setupGenerator())<br>
@@ -950,13 +950,13 @@ TEST_P(MaxOpsPerInstFixture, MaxOpsPerInstProblemsReportedCorrectly) {<br>
               ", which is unsupported. Assuming a value of 1 instead");<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     MaxOpsPerInstParams, MaxOpsPerInstFixture,<br>
     Values(std::make_tuple(3, 0, false), // Test for version < 4 (no error).<br>
            std::make_tuple(4, 0, true),  // Test zero value for V4 (error).<br>
            std::make_tuple(4, 1, false), // Test good value for V4 (no error).<br>
            std::make_tuple(<br>
-               4, 2, true)), ); // Test one higher than permitted V4 (error).<br>
+               4, 2, true))); // Test one higher than permitted V4 (error).<br>
<br>
 struct LineRangeFixture : TestWithParam<std::tuple<uint8_t, bool>>,<br>
                           AdjustAddressFixtureBase {<br>
@@ -993,10 +993,10 @@ TEST_P(LineRangeFixture, LineRangeProblemsReportedCorrectly) {<br>
           "not be adjusted");<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     LineRangeParams, LineRangeFixture,<br>
-    Values(std::make_tuple(0, true),       // Test zero value (error).<br>
-           std::make_tuple(14, false)), ); // Test non-zero value (no error).<br>
+    Values(std::make_tuple(0, true),     // Test zero value (error).<br>
+           std::make_tuple(14, false))); // Test non-zero value (no error).<br>
<br>
 struct BadMinInstLenFixture : TestWithParam<std::tuple<uint8_t, bool>>,<br>
                               AdjustAddressFixtureBase {<br>
@@ -1028,10 +1028,10 @@ TEST_P(BadMinInstLenFixture, MinInstLengthProblemsReportedCorrectly) {<br>
           "prevents any address advancing");<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     BadMinInstLenParams, BadMinInstLenFixture,<br>
-    Values(std::make_tuple(0, true),      // Test zero value (error).<br>
-           std::make_tuple(1, false)), ); // Test non-zero value (no error).<br>
+    Values(std::make_tuple(0, true),    // Test zero value (error).<br>
+           std::make_tuple(1, false))); // Test non-zero value (no error).<br>
<br>
 TEST_F(DebugLineBasicFixture, ParserParsesCorrectly) {<br>
   if (!setupGenerator())<br>
@@ -1422,7 +1422,7 @@ TEST_P(TruncatedPrologueFixture, ErrorForTruncatedPrologue) {<br>
   EXPECT_EQ(Offset, ExpectedOffset);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     TruncatedPrologueParams, TruncatedPrologueFixture,<br>
     Values(<br>
         // Truncated length:<br>
@@ -1501,7 +1501,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         std::make_tuple(<br>
             0x12, 0x12, 4, DWARF32,<br>
             "parsing line table prologue at offset 0x00000001: unexpected end "<br>
-            "of data at offset 0x12 while reading [0x12, 0x13)")), );<br>
+            "of data at offset 0x12 while reading [0x12, 0x13)")));<br>
<br>
 using ValueAndLengths = std::vector<LineTable::ValueAndLength>;<br>
<br>
@@ -1581,7 +1581,7 @@ TEST_P(TruncatedExtendedOpcodeFixture, ErrorForTruncatedExtendedOpcode) {<br>
                     FailedWithMessage(ExpectedErr.str()));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     TruncatedExtendedOpcodeParams, TruncatedExtendedOpcodeFixture,<br>
     Values(<br>
         // Truncated length:<br>
@@ -1648,7 +1648,7 @@ INSTANTIATE_TEST_CASE_P(<br>
             ValueAndLengths{{0x12343412, LineTable::Long}},<br>
             "Unrecognized extended op 0x7f length 5 (<parsing error> 12 34 34)",<br>
             "unexpected end of data at offset 0x35 while reading [0x32, "<br>
-            "0x36)")), );<br>
+            "0x36)")));<br>
<br>
 TEST_P(TruncatedStandardOpcodeFixture, ErrorForTruncatedStandardOpcode) {<br>
   if (!setupGenerator())<br>
@@ -1660,7 +1660,7 @@ TEST_P(TruncatedStandardOpcodeFixture, ErrorForTruncatedStandardOpcode) {<br>
                     FailedWithMessage(ExpectedErr.str()));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     TruncatedStandardOpcodeParams, TruncatedStandardOpcodeFixture,<br>
     Values(<br>
         std::make_tuple(2, DW_LNS_advance_pc,<br>
@@ -1704,7 +1704,7 @@ INSTANTIATE_TEST_CASE_P(<br>
             ValueAndLengths{{0x900, LineTable::ULEB}, {0xa00, LineTable::ULEB}},<br>
             "Unrecognized standard opcode (operands: 0x0000000000000900)",<br>
             "unable to decode LEB128 at offset 0x00000032: "<br>
-            "malformed uleb128, extends past end")), );<br>
+            "malformed uleb128, extends past end")));<br>
<br>
 TEST_F(DebugLineBasicFixture, PrintPathsProperly) {<br>
   if (!setupGenerator(5))<br>
<br>
diff  --git a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
index 0a0b8084f65f0..954abb7691253 100644<br>
--- a/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
+++ b/llvm/unittests/DebugInfo/DWARF/DWARFFormValueTest.cpp<br>
@@ -187,7 +187,7 @@ struct FormSkipValueFixture2 : FormSkipValueFixtureBase {};<br>
 TEST_P(FormSkipValueFixture1, skipValuePart1) { doSkipValueTest(); }<br>
 TEST_P(FormSkipValueFixture2, skipValuePart2) { doSkipValueTest(); }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     SkipValueTestParams1, FormSkipValueFixture1,<br>
     testing::Values(<br>
         // Form, Version, AddrSize, DwarfFormat, InitialData, ExpectedSize,<br>
@@ -246,9 +246,9 @@ INSTANTIATE_TEST_CASE_P(<br>
         ParamType(DW_FORM_strp_sup, 0, 1, DWARF32, SampleU32, 0, false),<br>
         ParamType(DW_FORM_strp_sup, 1, 0, DWARF32, SampleU32, 0, false),<br>
         ParamType(DW_FORM_strp_sup, 1, 1, DWARF32, SampleU32, 4, true),<br>
-        ParamType(DW_FORM_strp_sup, 1, 1, DWARF64, SampleU32, 8, true)), );<br>
+        ParamType(DW_FORM_strp_sup, 1, 1, DWARF64, SampleU32, 8, true)));<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     SkipValueTestParams2, FormSkipValueFixture2,<br>
     testing::Values(<br>
         ParamType(DW_FORM_line_strp, 0, 1, DWARF32, SampleU32, 0, false),<br>
@@ -301,8 +301,7 @@ INSTANTIATE_TEST_CASE_P(<br>
                   ArrayRef<uint8_t>(IndirectIndirectEnd,<br>
                                     sizeof(IndirectIndirectEnd)),<br>
                   2, false),<br>
-        ParamType(/*Unknown=*/Form(0xff), 4, 4, DWARF32, SampleU32, 0,<br>
-                  false)), );<br>
+        ParamType(/*Unknown=*/Form(0xff), 4, 4, DWARF32, SampleU32, 0, false)));<br>
<br>
 using ErrorParams = std::tuple<Form, std::vector<uint8_t>>;<br>
 struct ExtractValueErrorFixture : public testing::TestWithParam<ErrorParams> {<br>
@@ -323,7 +322,7 @@ TEST_P(ExtractValueErrorFixture, Test) {<br>
   EXPECT_FALSE(Form.extractValue(Data, &Offset, {0, 0, DWARF32}));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ExtractValueErrorParams, ExtractValueErrorFixture,<br>
     testing::Values(<br>
         ErrorParams{DW_FORM_ref_addr, {}}, ErrorParams{DW_FORM_block, {}},<br>
@@ -336,8 +335,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         ErrorParams{DW_FORM_udata, {}}, ErrorParams{DW_FORM_string, {}},<br>
         ErrorParams{DW_FORM_indirect, {}},<br>
         ErrorParams{DW_FORM_indirect, {DW_FORM_data1}},<br>
-        ErrorParams{DW_FORM_strp_sup, {}},<br>
-        ErrorParams{DW_FORM_ref_sig8, {}}), );<br>
+        ErrorParams{DW_FORM_strp_sup, {}}, ErrorParams{DW_FORM_ref_sig8, {}}));<br>
<br>
 using DumpValueParams =<br>
     std::tuple<Form, ArrayRef<uint8_t>, DwarfFormat, StringRef>;<br>
@@ -379,7 +377,7 @@ ArrayRef<uint8_t> DumpTestSample32 = toBytes(DumpTestSample32Val);<br>
 const uint64_t DumpTestSample64Val = 0x11223344556677;<br>
 ArrayRef<uint8_t> DumpTestSample64 = toBytes(DumpTestSample64Val);<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     DumpValueParams, DumpValueFixture,<br>
     testing::Values(DumpValueParams{DW_FORM_strp, DumpTestSample32, DWARF32,<br>
                                     " .debug_str[0x00112233] = "},<br>
@@ -393,6 +391,6 @@ INSTANTIATE_TEST_CASE_P(<br>
                     DumpValueParams{DW_FORM_sec_offset, DumpTestSample32,<br>
                                     DWARF32, "0x00112233"},<br>
                     DumpValueParams{DW_FORM_sec_offset, DumpTestSample64,<br>
-                                    DWARF64, "0x0011223344556677"}), );<br>
+                                    DWARF64, "0x0011223344556677"}));<br>
<br>
 } // end anonymous namespace<br>
<br>
diff  --git a/llvm/unittests/FileCheck/FileCheckTest.cpp b/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
index 60ada3836a6a1..f3b5d3d2aaab6 100644<br>
--- a/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
+++ b/llvm/unittests/FileCheck/FileCheckTest.cpp<br>
@@ -330,7 +330,7 @@ TEST_P(ExpressionFormatParameterisedFixture, FormatBoolOperator) {<br>
   EXPECT_TRUE(bool(Format));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     AllowedExplicitExpressionFormat, ExpressionFormatParameterisedFixture,<br>
     ::testing::Values(<br>
         std::make_tuple(ExpressionFormat::Kind::Unsigned, 0, false),<br>
@@ -355,7 +355,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         std::make_tuple(ExpressionFormat::Kind::HexUpper, 16, true),<br>
<br>
         std::make_tuple(ExpressionFormat::Kind::Unsigned, 20, false),<br>
-        std::make_tuple(ExpressionFormat::Kind::Signed, 20, false)), );<br>
+        std::make_tuple(ExpressionFormat::Kind::Signed, 20, false)));<br>
<br>
 TEST_F(FileCheckTest, NoFormatProperties) {<br>
   ExpressionFormat NoFormat(ExpressionFormat::Kind::NoFormat);<br>
<br>
diff  --git a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
index 894311363ba10..35a52310d3767 100644<br>
--- a/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
+++ b/llvm/unittests/Frontend/OpenMPIRBuilderTest.cpp<br>
@@ -1827,7 +1827,7 @@ TEST_P(OpenMPIRBuilderTestWithParams, DynamicWorkShareLoop) {<br>
   EXPECT_FALSE(verifyModule(*M, &errs()));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(OpenMPWSLoopSchedulingTypes,<br>
+INSTANTIATE_TEST_SUITE_P(OpenMPWSLoopSchedulingTypes,<br>
                         OpenMPIRBuilderTestWithParams,<br>
                         ::testing::Values(omp::OMPScheduleType::DynamicChunked,<br>
                                           omp::OMPScheduleType::GuidedChunked,<br>
<br>
diff  --git a/llvm/unittests/IR/PassBuilderCallbacksTest.cpp b/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
index 6d0b9e8abcb6d..e0bd129bc1605 100644<br>
--- a/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
+++ b/llvm/unittests/IR/PassBuilderCallbacksTest.cpp<br>
@@ -27,11 +27,12 @@ using namespace llvm;<br>
 namespace {<br>
 using testing::AnyNumber;<br>
 using testing::AtLeast;<br>
+using testing::DoAll;<br>
 using testing::DoDefault;<br>
-using testing::Not;<br>
-using testing::Return;<br>
 using testing::Expectation;<br>
 using testing::Invoke;<br>
+using testing::Not;<br>
+using testing::Return;<br>
 using testing::WithArgs;<br>
 using testing::_;<br>
<br>
<br>
diff  --git a/llvm/unittests/IR/PatternMatch.cpp b/llvm/unittests/IR/PatternMatch.cpp<br>
index fd4e446738b0b..31b312ba35d15 100644<br>
--- a/llvm/unittests/IR/PatternMatch.cpp<br>
+++ b/llvm/unittests/IR/PatternMatch.cpp<br>
@@ -1641,7 +1641,7 @@ template <typename T> struct MutableConstTest : PatternMatchTest { };<br>
 typedef ::testing::Types<std::tuple<Value*, Instruction*>,<br>
                          std::tuple<const Value*, const Instruction *>><br>
     MutableConstTestTypes;<br>
-TYPED_TEST_CASE(MutableConstTest, MutableConstTestTypes);<br>
+TYPED_TEST_SUITE(MutableConstTest, MutableConstTestTypes);<br>
<br>
 TYPED_TEST(MutableConstTest, ICmp) {<br>
   auto &IRB = PatternMatchTest::IRB;<br>
<br>
diff  --git a/llvm/unittests/IR/ValueMapTest.cpp b/llvm/unittests/IR/ValueMapTest.cpp<br>
index cfb37f0b8df7f..57f2b7bea19ae 100644<br>
--- a/llvm/unittests/IR/ValueMapTest.cpp<br>
+++ b/llvm/unittests/IR/ValueMapTest.cpp<br>
@@ -35,7 +35,7 @@ class ValueMapTest : public testing::Test {<br>
 // Run everything on Value*, a subtype to make sure that casting works as<br>
 // expected, and a const subtype to make sure we cast const correctly.<br>
 typedef ::testing::Types<Value, Instruction, const Instruction> KeyTypes;<br>
-TYPED_TEST_CASE(ValueMapTest, KeyTypes);<br>
+TYPED_TEST_SUITE(ValueMapTest, KeyTypes);<br>
<br>
 TYPED_TEST(ValueMapTest, Null) {<br>
   ValueMap<TypeParam*, int> VM1;<br>
<br>
diff  --git a/llvm/unittests/Passes/PluginsTest.cpp b/llvm/unittests/Passes/PluginsTest.cpp<br>
index 62334c828cb4b..9fa5a0bdaf983 100644<br>
--- a/llvm/unittests/Passes/PluginsTest.cpp<br>
+++ b/llvm/unittests/Passes/PluginsTest.cpp<br>
@@ -27,8 +27,7 @@ using namespace llvm;<br>
 void anchor() {}<br>
<br>
 static std::string LibPath(const std::string Name = "TestPlugin") {<br>
-  const std::vector<testing::internal::string> &Argvs =<br>
-      testing::internal::GetArgvs();<br>
+  const auto &Argvs = testing::internal::GetArgvs();<br>
   const char *Argv0 = Argvs.size() > 0 ? Argvs[0].c_str() : "PluginsTests";<br>
   void *Ptr = (void *)(intptr_t)anchor;<br>
   std::string Path = sys::fs::getMainExecutable(Argv0, Ptr);<br>
<br>
diff  --git a/llvm/unittests/ProfileData/CoverageMappingTest.cpp b/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
index 6434474b06850..f1d09c28f035a 100644<br>
--- a/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
+++ b/llvm/unittests/ProfileData/CoverageMappingTest.cpp<br>
@@ -893,11 +893,12 @@ TEST_P(CoverageMappingTest, skip_duplicate_function_record) {<br>
 }<br>
<br>
 // FIXME: Use ::testing::Combine() when llvm updates its copy of googletest.<br>
-INSTANTIATE_TEST_CASE_P(ParameterizedCovMapTest, CoverageMappingTest,<br>
-                        ::testing::Values(std::pair<bool, bool>({false, false}),<br>
-                                          std::pair<bool, bool>({false, true}),<br>
-                                          std::pair<bool, bool>({true, false}),<br>
-                                          std::pair<bool, bool>({true, true})),);<br>
+INSTANTIATE_TEST_SUITE_P(<br>
+    ParameterizedCovMapTest, CoverageMappingTest,<br>
+    ::testing::Values(std::pair<bool, bool>({false, false}),<br>
+                      std::pair<bool, bool>({false, true}),<br>
+                      std::pair<bool, bool>({true, false}),<br>
+                      std::pair<bool, bool>({true, true})));<br>
<br>
 TEST(CoverageMappingTest, filename_roundtrip) {<br>
   std::vector<std::string> Paths({"dir", "a", "b", "c", "d", "e"});<br>
<br>
diff  --git a/llvm/unittests/ProfileData/InstrProfTest.cpp b/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
index d94906991b0c6..d7661776d75fa 100644<br>
--- a/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
+++ b/llvm/unittests/ProfileData/InstrProfTest.cpp<br>
@@ -1041,8 +1041,8 @@ TEST_F(SparseInstrProfTest, preserve_no_records) {<br>
   ASSERT_TRUE(I == E);<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(MaybeSparse, MaybeSparseInstrProfTest,<br>
-                        ::testing::Bool(),);<br>
+INSTANTIATE_TEST_SUITE_P(MaybeSparse, MaybeSparseInstrProfTest,<br>
+                         ::testing::Bool());<br>
<br>
 #if defined(_LP64) && defined(EXPENSIVE_CHECKS)<br>
 TEST(ProfileReaderTest, ReadsLargeFiles) {<br>
<br>
diff  --git a/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp b/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
index a06399a0b3133..6c9063775a59d 100644<br>
--- a/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
+++ b/llvm/unittests/Support/DynamicLibrary/DynamicLibraryTest.cpp<br>
@@ -19,8 +19,7 @@ using namespace llvm;<br>
 using namespace llvm::sys;<br>
<br>
 std::string LibPath(const std::string Name = "PipSqueak") {<br>
-  const std::vector<testing::internal::string> &Argvs =<br>
-      testing::internal::GetArgvs();<br>
+  const auto &Argvs = testing::internal::GetArgvs();<br>
   const char *Argv0 =<br>
       Argvs.size() > 0 ? Argvs[0].c_str() : "DynamicLibraryTests";<br>
   void *Ptr = (void*)(intptr_t)TestA;<br>
<br>
diff  --git a/llvm/unittests/Support/MathExtrasTest.cpp b/llvm/unittests/Support/MathExtrasTest.cpp<br>
index d899af9685e30..50dd1513e0274 100644<br>
--- a/llvm/unittests/Support/MathExtrasTest.cpp<br>
+++ b/llvm/unittests/Support/MathExtrasTest.cpp<br>
@@ -483,7 +483,7 @@ class OverflowTest : public ::testing::Test { };<br>
 using OverflowTestTypes = ::testing::Types<signed char, short, int, long,<br>
                                            long long>;<br>
<br>
-TYPED_TEST_CASE(OverflowTest, OverflowTestTypes);<br>
+TYPED_TEST_SUITE(OverflowTest, OverflowTestTypes);<br>
<br>
 TYPED_TEST(OverflowTest, AddNoOverflow) {<br>
   TypeParam Result;<br>
<br>
diff  --git a/llvm/unittests/Support/MemoryTest.cpp b/llvm/unittests/Support/MemoryTest.cpp<br>
index 6e5f7472e4549..bcbbd285823ee 100644<br>
--- a/llvm/unittests/Support/MemoryTest.cpp<br>
+++ b/llvm/unittests/Support/MemoryTest.cpp<br>
@@ -428,8 +428,7 @@ unsigned MemoryFlags[] = {<br>
                            Memory::MF_READ|Memory::MF_WRITE|Memory::MF_EXEC<br>
                          };<br>
<br>
-INSTANTIATE_TEST_CASE_P(AllocationTests,<br>
-                        MappedMemoryTest,<br>
-                        ::testing::ValuesIn(MemoryFlags),);<br>
+INSTANTIATE_TEST_SUITE_P(AllocationTests, MappedMemoryTest,<br>
+                         ::testing::ValuesIn(MemoryFlags));<br>
<br>
 }  // anonymous namespace<br>
<br>
diff  --git a/llvm/unittests/Support/TargetParserTest.cpp b/llvm/unittests/Support/TargetParserTest.cpp<br>
index e820ff8754d22..0d4fd08b7fce1 100644<br>
--- a/llvm/unittests/Support/TargetParserTest.cpp<br>
+++ b/llvm/unittests/Support/TargetParserTest.cpp<br>
@@ -118,7 +118,7 @@ TEST_P(ARMCPUTestFixture, ARMCPUTests) {<br>
 // we expect. This is because the default extensions for a CPU are the sum<br>
 // of the default extensions for its architecture and for the CPU.<br>
 // So if a CPU has no extra extensions, it adds AEK_NONE.<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ARMCPUTestsPart1, ARMCPUTestFixture,<br>
     ::testing::Values(<br>
         ARMCPUTestParams("invalid", "invalid", "invalid", ARM::AEK_NONE, ""),<br>
@@ -194,11 +194,11 @@ INSTANTIATE_TEST_CASE_P(<br>
                              ARM::AEK_SEC | ARM::AEK_VIRT | ARM::AEK_DSP,<br>
                          "7-A"),<br>
         ARMCPUTestParams("cortex-a8", "armv7-a", "neon",<br>
-                         ARM::AEK_SEC | ARM::AEK_DSP, "7-A")), );<br>
+                         ARM::AEK_SEC | ARM::AEK_DSP, "7-A")));<br>
<br>
 // gtest in llvm has a limit of 50 test cases when using ::Values so we split<br>
 // them into 2 blocks<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     ARMCPUTestsPart2, ARMCPUTestFixture,<br>
     ::testing::Values(<br>
         ARMCPUTestParams("cortex-a9", "armv7-a", "neon-fp16",<br>
@@ -309,10 +309,9 @@ INSTANTIATE_TEST_CASE_P(<br>
                              ARM::AEK_FP16 | ARM::AEK_RAS | ARM::AEK_DOTPROD,<br>
                          "8.2-A"),<br>
         ARMCPUTestParams("cortex-a78c", "armv8.2-a", "crypto-neon-fp-armv8",<br>
-                         ARM::AEK_SEC | ARM::AEK_MP |<br>
-                             ARM::AEK_VIRT | ARM::AEK_HWDIVARM |<br>
-                             ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP |<br>
-                             ARM::AEK_CRC | ARM::AEK_RAS |<br>
+                         ARM::AEK_SEC | ARM::AEK_MP | ARM::AEK_VIRT |<br>
+                             ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB |<br>
+                             ARM::AEK_DSP | ARM::AEK_CRC | ARM::AEK_RAS |<br>
                              ARM::AEK_FP16 | ARM::AEK_DOTPROD,<br>
                          "8.2-A"),<br>
         ARMCPUTestParams("cortex-a77", "armv8.2-a", "crypto-neon-fp-armv8",<br>
@@ -390,7 +389,7 @@ INSTANTIATE_TEST_CASE_P(<br>
         ARMCPUTestParams("xscale", "xscale", "none", ARM::AEK_NONE, "xscale"),<br>
         ARMCPUTestParams("swift", "armv7s", "neon-vfpv4",<br>
                          ARM::AEK_HWDIVARM | ARM::AEK_HWDIVTHUMB | ARM::AEK_DSP,<br>
-                         "7-S")), );<br>
+                         "7-S")));<br>
<br>
 static constexpr unsigned NumARMCPUArchs = 92;<br>
<br>
@@ -876,7 +875,7 @@ TEST_P(AArch64CPUTestFixture, testAArch64CPU) {<br>
   EXPECT_EQ(params.CPUAttr, AArch64::getCPUAttr(AK));<br>
 }<br>
<br>
-INSTANTIATE_TEST_CASE_P(<br>
+INSTANTIATE_TEST_SUITE_P(<br>
     AArch64CPUTests, AArch64CPUTestFixture,<br>
     ::testing::Values(<br>
         ARMCPUTestParams("invalid", "invalid", "invalid", AArch64::AEK_NONE,<br>
@@ -1180,7 +1179,7 @@ INSTANTIATE_TEST_CASE_P(<br>
                              AArch64::AEK_FP | AArch64::AEK_SIMD |<br>
                              AArch64::AEK_FP16 | AArch64::AEK_RAS |<br>
                              AArch64::AEK_LSE | AArch64::AEK_RDM,<br>
-                         "8.2-A")), );<br>
+                         "8.2-A")));<br>
<br>
 static constexpr unsigned NumAArch64CPUArchs = 48;<br>
<br>
<br>
diff  --git a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
index 6eff4dfcc505f..f96ba55476d32 100644<br>
--- a/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
+++ b/llvm/unittests/XRay/FDRProducerConsumerTest.cpp<br>
@@ -94,7 +94,7 @@ template <class T> class RoundTripTest : public ::testing::Test {<br>
   std::unique_ptr<Record> Rec;<br>
 };<br>
<br>
-TYPED_TEST_CASE_P(RoundTripTest);<br>
+TYPED_TEST_SUITE_P(RoundTripTest);<br>
<br>
 template <class T> class RoundTripTestV5 : public ::testing::Test {<br>
 public:<br>
@@ -117,7 +117,7 @@ template <class T> class RoundTripTestV5 : public ::testing::Test {<br>
   std::unique_ptr<Record> Rec;<br>
 };<br>
<br>
-TYPED_TEST_CASE_P(RoundTripTestV5);<br>
+TYPED_TEST_SUITE_P(RoundTripTestV5);<br>
<br>
 // This test ensures that the writing and reading implementations are in sync --<br>
 // that given write(read(write(R))) == R.<br>
@@ -160,7 +160,7 @@ TYPED_TEST_P(RoundTripTest, RoundTripsSingleValue) {<br>
   EXPECT_THAT(Records[1]->getRecordType(), Eq(R->getRecordType()));<br>
 }<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(RoundTripTest, RoundTripsSingleValue);<br>
+REGISTER_TYPED_TEST_SUITE_P(RoundTripTest, RoundTripsSingleValue);<br>
<br>
 // We duplicate the above case for the V5 version using <br>
diff erent types and<br>
 // encodings.<br>
@@ -201,21 +201,21 @@ TYPED_TEST_P(RoundTripTestV5, RoundTripsSingleValue) {<br>
   EXPECT_THAT(Records[1]->getRecordType(), Eq(R->getRecordType()));<br>
 }<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(RoundTripTestV5, RoundTripsSingleValue);<br>
+REGISTER_TYPED_TEST_SUITE_P(RoundTripTestV5, RoundTripsSingleValue);<br>
<br>
 // These are the record types we support for v4 and below.<br>
 using RecordTypes =<br>
     ::testing::Types<NewBufferRecord, NewCPUIDRecord, TSCWrapRecord,<br>
                      WallclockRecord, CustomEventRecord, CallArgRecord,<br>
                      PIDRecord, FunctionRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, RoundTripTest, RecordTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, RoundTripTest, RecordTypes);<br>
<br>
 // For V5, we have two new types we're supporting.<br>
 using RecordTypesV5 =<br>
     ::testing::Types<NewBufferRecord, NewCPUIDRecord, TSCWrapRecord,<br>
                      WallclockRecord, CustomEventRecordV5, TypedEventRecord,<br>
                      CallArgRecord, PIDRecord, FunctionRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, RoundTripTestV5, RecordTypesV5);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, RoundTripTestV5, RecordTypesV5);<br>
<br>
 } // namespace<br>
 } // namespace xray<br>
<br>
diff  --git a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
index bfee1c5d388c4..a1fb8c3183dbe 100644<br>
--- a/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
+++ b/llvm/unittests/XRay/FDRRecordPrinterTest.cpp<br>
@@ -107,7 +107,7 @@ template <class T> class PrinterTest : public ::testing::Test {<br>
   PrinterTest() : Data(), OS(Data), P(OS), R(Helper<T>::construct()) {}<br>
 };<br>
<br>
-TYPED_TEST_CASE_P(PrinterTest);<br>
+TYPED_TEST_SUITE_P(PrinterTest);<br>
<br>
 TYPED_TEST_P(PrinterTest, PrintsRecord) {<br>
   ASSERT_NE(nullptr, this->R);<br>
@@ -116,13 +116,13 @@ TYPED_TEST_P(PrinterTest, PrintsRecord) {<br>
   EXPECT_THAT(this->Data, Eq(Helper<TypeParam>::expected()));<br>
 }<br>
<br>
-REGISTER_TYPED_TEST_CASE_P(PrinterTest, PrintsRecord);<br>
+REGISTER_TYPED_TEST_SUITE_P(PrinterTest, PrintsRecord);<br>
 using FDRRecordTypes =<br>
     ::testing::Types<BufferExtents, NewBufferRecord, EndBufferRecord,<br>
                      NewCPUIDRecord, TSCWrapRecord, WallclockRecord,<br>
                      CustomEventRecord, CallArgRecord, BufferExtents,<br>
                      PIDRecord>;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(Records, PrinterTest, FDRRecordTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(Records, PrinterTest, FDRRecordTypes);<br>
<br>
 TEST(FDRRecordPrinterTest, WriteFunctionRecordEnter) {<br>
   std::string Data;<br>
<br>
diff  --git a/llvm/unittests/XRay/GraphTest.cpp b/llvm/unittests/XRay/GraphTest.cpp<br>
index 52580b3068266..f9453f57ebf02 100644<br>
--- a/llvm/unittests/XRay/GraphTest.cpp<br>
+++ b/llvm/unittests/XRay/GraphTest.cpp<br>
@@ -59,7 +59,7 @@ typedef ::testing::Types<GraphT, const GraphT> GraphTestTypes;<br>
 using VVT = typename GraphT::VertexValueType;<br>
 using EVT = typename GraphT::EdgeValueType;<br>
<br>
-TYPED_TEST_CASE(GraphTest, GraphTestTypes);<br>
+TYPED_TEST_SUITE(GraphTest, GraphTestTypes);<br>
<br>
 template <typename T> void graphVertexTester(T &G) {<br>
   std::set<unsigned> V({1u, 2u, 3u, 4u, 5u, 6u});<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
index 5a00f3ba9f461..8cfc292e9b7c8 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-actions.h<br>
@@ -44,15 +44,19 @@<br>
 #endif<br>
<br>
 #include <algorithm><br>
+#include <functional><br>
+#include <memory><br>
 #include <string><br>
+#include <type_traits><br>
+#include <utility><br>
<br>
 #include "gmock/internal/gmock-internal-utils.h"<br>
 #include "gmock/internal/gmock-port.h"<br>
<br>
-#if GTEST_LANG_CXX11  // Defined by gtest-port.h via gmock-port.h.<br>
-#include <functional><br>
-#include <type_traits><br>
-#endif  // GTEST_LANG_CXX11<br>
+#ifdef _MSC_VER<br>
+# pragma warning(push)<br>
+# pragma warning(disable:4100)<br>
+#endif<br>
<br>
 namespace testing {<br>
<br>
@@ -67,9 +71,6 @@ namespace testing {<br>
<br>
 namespace internal {<br>
<br>
-template <typename F1, typename F2><br>
-class ActionAdaptor;<br>
-<br>
 // BuiltInDefaultValueGetter<T, true>::Get() returns a<br>
 // default-constructed T value.  BuiltInDefaultValueGetter<T,<br>
 // false>::Get() crashes with an error.<br>
@@ -100,8 +101,8 @@ struct BuiltInDefaultValueGetter<T, false> {<br>
 template <typename T><br>
 class BuiltInDefaultValue {<br>
  public:<br>
-#if GTEST_LANG_CXX11<br>
-  // This function returns true iff type T has a built-in default value.<br>
+  // This function returns true if and only if type T has a built-in default<br>
+  // value.<br>
   static bool Exists() {<br>
     return ::std::is_default_constructible<T>::value;<br>
   }<br>
@@ -110,18 +111,6 @@ class BuiltInDefaultValue {<br>
     return BuiltInDefaultValueGetter<<br>
         T, ::std::is_default_constructible<T>::value>::Get();<br>
   }<br>
-<br>
-#else  // GTEST_LANG_CXX11<br>
-  // This function returns true iff type T has a built-in default value.<br>
-  static bool Exists() {<br>
-    return false;<br>
-  }<br>
-<br>
-  static T Get() {<br>
-    return BuiltInDefaultValueGetter<T, false>::Get();<br>
-  }<br>
-<br>
-#endif  // GTEST_LANG_CXX11<br>
 };<br>
<br>
 // This partial specialization says that we use the same built-in<br>
@@ -139,7 +128,7 @@ template <typename T><br>
 class BuiltInDefaultValue<T*> {<br>
  public:<br>
   static bool Exists() { return true; }<br>
-  static T* Get() { return NULL; }<br>
+  static T* Get() { return nullptr; }<br>
 };<br>
<br>
 // The following specializations define the default values for<br>
@@ -153,9 +142,6 @@ class BuiltInDefaultValue<T*> {<br>
   }<br>
<br>
 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, );  // NOLINT<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, "");<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, "");<br>
 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false);<br>
 GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0');<br>
@@ -222,11 +208,11 @@ class DefaultValue {<br>
   // Unsets the default value for type T.<br>
   static void Clear() {<br>
     delete producer_;<br>
-    producer_ = NULL;<br>
+    producer_ = nullptr;<br>
   }<br>
<br>
-  // Returns true iff the user has set the default value for type T.<br>
-  static bool IsSet() { return producer_ != NULL; }<br>
+  // Returns true if and only if the user has set the default value for type T.<br>
+  static bool IsSet() { return producer_ != nullptr; }<br>
<br>
   // Returns true if T has a default return value set by the user or there<br>
   // exists a built-in default value.<br>
@@ -238,8 +224,8 @@ class DefaultValue {<br>
   // otherwise returns the built-in default value. Requires that Exists()<br>
   // is true, which ensures that the return value is well-defined.<br>
   static T Get() {<br>
-    return producer_ == NULL ?<br>
-        internal::BuiltInDefaultValue<T>::Get() : producer_->Produce();<br>
+    return producer_ == nullptr ? internal::BuiltInDefaultValue<T>::Get()<br>
+                                : producer_->Produce();<br>
   }<br>
<br>
  private:<br>
@@ -252,7 +238,7 @@ class DefaultValue {<br>
   class FixedValueProducer : public ValueProducer {<br>
    public:<br>
     explicit FixedValueProducer(T value) : value_(value) {}<br>
-    virtual T Produce() { return value_; }<br>
+    T Produce() override { return value_; }<br>
<br>
    private:<br>
     const T value_;<br>
@@ -263,7 +249,7 @@ class DefaultValue {<br>
    public:<br>
     explicit FactoryValueProducer(FactoryFunction factory)<br>
         : factory_(factory) {}<br>
-    virtual T Produce() { return factory_(); }<br>
+    T Produce() override { return factory_(); }<br>
<br>
    private:<br>
     const FactoryFunction factory_;<br>
@@ -284,12 +270,10 @@ class DefaultValue<T&> {<br>
   }<br>
<br>
   // Unsets the default value for type T&.<br>
-  static void Clear() {<br>
-    address_ = NULL;<br>
-  }<br>
+  static void Clear() { address_ = nullptr; }<br>
<br>
-  // Returns true iff the user has set the default value for type T&.<br>
-  static bool IsSet() { return address_ != NULL; }<br>
+  // Returns true if and only if the user has set the default value for type T&.<br>
+  static bool IsSet() { return address_ != nullptr; }<br>
<br>
   // Returns true if T has a default return value set by the user or there<br>
   // exists a built-in default value.<br>
@@ -301,8 +285,8 @@ class DefaultValue<T&> {<br>
   // otherwise returns the built-in default value if there is one;<br>
   // otherwise aborts the process.<br>
   static T& Get() {<br>
-    return address_ == NULL ?<br>
-        internal::BuiltInDefaultValue<T&>::Get() : *address_;<br>
+    return address_ == nullptr ? internal::BuiltInDefaultValue<T&>::Get()<br>
+                               : *address_;<br>
   }<br>
<br>
  private:<br>
@@ -320,11 +304,11 @@ class DefaultValue<void> {<br>
<br>
 // Points to the user-set default value for type T.<br>
 template <typename T><br>
-typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = NULL;<br>
+typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = nullptr;<br>
<br>
 // Points to the user-set default value for type T&.<br>
 template <typename T><br>
-T* DefaultValue<T&>::address_ = NULL;<br>
+T* DefaultValue<T&>::address_ = nullptr;<br>
<br>
 // Implement this interface to define an action for function type F.<br>
 template <typename F><br>
@@ -349,14 +333,25 @@ class ActionInterface {<br>
 // An Action<F> is a copyable and IMMUTABLE (except by assignment)<br>
 // object that represents an action to be taken when a mock function<br>
 // of type F is called.  The implementation of Action<T> is just a<br>
-// linked_ptr to const ActionInterface<T>, so copying is fairly cheap.<br>
-// Don't inherit from Action!<br>
-//<br>
+// std::shared_ptr to const ActionInterface<T>. Don't inherit from Action!<br>
 // You can view an object implementing ActionInterface<F> as a<br>
 // concrete action (including its current state), and an Action<F><br>
 // object as a handle to it.<br>
 template <typename F><br>
 class Action {<br>
+  // Adapter class to allow constructing Action from a legacy ActionInterface.<br>
+  // New code should create Actions from functors instead.<br>
+  struct ActionAdapter {<br>
+    // Adapter must be copyable to satisfy std::function requirements.<br>
+    ::std::shared_ptr<ActionInterface<F>> impl_;<br>
+<br>
+    template <typename... Args><br>
+    typename internal::Function<F>::Result operator()(Args&&... args) {<br>
+      return impl_->Perform(<br>
+          ::std::forward_as_tuple(::std::forward<Args>(args)...));<br>
+    }<br>
+  };<br>
+<br>
  public:<br>
   typedef typename internal::Function<F>::Result Result;<br>
   typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
@@ -365,7 +360,6 @@ class Action {<br>
   // STL containers.<br>
   Action() {}<br>
<br>
-#if GTEST_LANG_CXX11<br>
   // Construct an Action from a specified callable.<br>
   // This cannot take std::function directly, because then Action would not be<br>
   // directly constructible from lambda (it would require two conversions).<br>
@@ -373,26 +367,19 @@ class Action {<br>
             typename = typename ::std::enable_if<<br>
                 ::std::is_constructible<::std::function<F>, G>::value>::type><br>
   Action(G&& fun) : fun_(::std::forward<G>(fun)) {}  // NOLINT<br>
-#endif<br>
<br>
   // Constructs an Action from its implementation.<br>
-  explicit Action(ActionInterface<F>* impl) : impl_(impl) {}<br>
+  explicit Action(ActionInterface<F>* impl)<br>
+      : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {}<br>
<br>
   // This constructor allows us to turn an Action<Func> object into an<br>
   // Action<F>, as long as F's arguments can be implicitly converted<br>
-  // to Func's and Func's return type can be implicitly converted to<br>
-  // F's.<br>
+  // to Func's and Func's return type can be implicitly converted to F's.<br>
   template <typename Func><br>
-  explicit Action(const Action<Func>& action);<br>
-<br>
-  // Returns true iff this is the DoDefault() action.<br>
-  bool IsDoDefault() const {<br>
-#if GTEST_LANG_CXX11<br>
-    return impl_ == nullptr && fun_ == nullptr;<br>
-#else<br>
-    return impl_ == NULL;<br>
-#endif<br>
-  }<br>
+  explicit Action(const Action<Func>& action) : fun_(action.fun_) {}<br>
+<br>
+  // Returns true if and only if this is the DoDefault() action.<br>
+  bool IsDoDefault() const { return fun_ == nullptr; }<br>
<br>
   // Performs the action.  Note that this method is const even though<br>
   // the corresponding method in ActionInterface is not.  The reason<br>
@@ -404,31 +391,15 @@ class Action {<br>
     if (IsDoDefault()) {<br>
       internal::IllegalDoDefault(__FILE__, __LINE__);<br>
     }<br>
-#if GTEST_LANG_CXX11<br>
-    if (fun_ != nullptr) {<br>
-      return internal::Apply(fun_, ::std::move(args));<br>
-    }<br>
-#endif<br>
-    return impl_->Perform(args);<br>
+    return internal::Apply(fun_, ::std::move(args));<br>
   }<br>
<br>
  private:<br>
-  template <typename F1, typename F2><br>
-  friend class internal::ActionAdaptor;<br>
-<br>
   template <typename G><br>
   friend class Action;<br>
<br>
-  // In C++11, Action can be implemented either as a generic functor (through<br>
-  // std::function), or legacy ActionInterface. In C++98, only ActionInterface<br>
-  // is available. The invariants are as follows:<br>
-  // * in C++98, impl_ is null iff this is the default action<br>
-  // * in C++11, at most one of fun_ & impl_ may be nonnull; both are null iff<br>
-  //   this is the default action<br>
-#if GTEST_LANG_CXX11<br>
+  // fun_ is an empty function if and only if this is the DoDefault() action.<br>
   ::std::function<F> fun_;<br>
-#endif<br>
-  internal::linked_ptr<ActionInterface<F> > impl_;<br>
 };<br>
<br>
 // The PolymorphicAction class template makes it easy to implement a<br>
@@ -443,7 +414,7 @@ class Action {<br>
 //     template <typename Result, typename ArgumentTuple><br>
 //     Result Perform(const ArgumentTuple& args) const {<br>
 //       // Processes the arguments and returns a result, using<br>
-//       // tr1::get<N>(args) to get the N-th (0-based) argument in the tuple.<br>
+//       // std::get<N>(args) to get the N-th (0-based) argument in the tuple.<br>
 //     }<br>
 //     ...<br>
 //   };<br>
@@ -471,7 +442,7 @@ class PolymorphicAction {<br>
<br>
     explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
<br>
-    virtual Result Perform(const ArgumentTuple& args) {<br>
+    Result Perform(const ArgumentTuple& args) override {<br>
       return impl_.template Perform<Result>(args);<br>
     }<br>
<br>
@@ -507,31 +478,11 @@ inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) {<br>
<br>
 namespace internal {<br>
<br>
-// Allows an Action<F2> object to pose as an Action<F1>, as long as F2<br>
-// and F1 are compatible.<br>
-template <typename F1, typename F2><br>
-class ActionAdaptor : public ActionInterface<F1> {<br>
- public:<br>
-  typedef typename internal::Function<F1>::Result Result;<br>
-  typedef typename internal::Function<F1>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  explicit ActionAdaptor(const Action<F2>& from) : impl_(from.impl_) {}<br>
-<br>
-  virtual Result Perform(const ArgumentTuple& args) {<br>
-    return impl_->Perform(args);<br>
-  }<br>
-<br>
- private:<br>
-  const internal::linked_ptr<ActionInterface<F2> > impl_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(ActionAdaptor);<br>
-};<br>
-<br>
 // Helper struct to specialize ReturnAction to execute a move instead of a copy<br>
 // on return. Useful for move-only types, but could be used on any type.<br>
 template <typename T><br>
 struct ByMoveWrapper {<br>
-  explicit ByMoveWrapper(T value) : payload(internal::move(value)) {}<br>
+  explicit ByMoveWrapper(T value) : payload(std::move(value)) {}<br>
   T payload;<br>
 };<br>
<br>
@@ -568,12 +519,12 @@ class ReturnAction {<br>
   // Constructs a ReturnAction object from the value to be returned.<br>
   // 'value' is passed by value instead of by const reference in order<br>
   // to allow Return("string literal") to compile.<br>
-  explicit ReturnAction(R value) : value_(new R(internal::move(value))) {}<br>
+  explicit ReturnAction(R value) : value_(new R(std::move(value))) {}<br>
<br>
   // This template type conversion operator allows Return(x) to be<br>
   // used in ANY function that returns x's type.<br>
   template <typename F><br>
-  operator Action<F>() const {<br>
+  operator Action<F>() const {  // NOLINT<br>
     // Assert statement belongs here because this is the best place to verify<br>
     // conditions on F. It produces the clearest error messages<br>
     // in most compilers.<br>
@@ -584,8 +535,10 @@ class ReturnAction {<br>
     // in the Impl class. But both definitions must be the same.<br>
     typedef typename Function<F>::Result Result;<br>
     GTEST_COMPILE_ASSERT_(<br>
-        !is_reference<Result>::value,<br>
+        !std::is_reference<Result>::value,<br>
         use_ReturnRef_instead_of_Return_to_return_a_reference);<br>
+    static_assert(!std::is_void<Result>::value,<br>
+                  "Can't use Return() on an action expected to return `void`.");<br>
     return Action<F>(new Impl<R, F>(value_));<br>
   }<br>
<br>
@@ -604,14 +557,14 @@ class ReturnAction {<br>
     // Result to call.  ImplicitCast_ forces the compiler to convert R to<br>
     // Result without considering explicit constructors, thus resolving the<br>
     // ambiguity. value_ is then initialized using its copy constructor.<br>
-    explicit Impl(const linked_ptr<R>& value)<br>
+    explicit Impl(const std::shared_ptr<R>& value)<br>
         : value_before_cast_(*value),<br>
           value_(ImplicitCast_<Result>(value_before_cast_)) {}<br>
<br>
-    virtual Result Perform(const ArgumentTuple&) { return value_; }<br>
+    Result Perform(const ArgumentTuple&) override { return value_; }<br>
<br>
    private:<br>
-    GTEST_COMPILE_ASSERT_(!is_reference<Result>::value,<br>
+    GTEST_COMPILE_ASSERT_(!std::is_reference<Result>::value,<br>
                           Result_cannot_be_a_reference_type);<br>
     // We save the value before casting just in case it is being cast to a<br>
     // wrapper type.<br>
@@ -629,24 +582,24 @@ class ReturnAction {<br>
     typedef typename Function<F>::Result Result;<br>
     typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
<br>
-    explicit Impl(const linked_ptr<R>& wrapper)<br>
+    explicit Impl(const std::shared_ptr<R>& wrapper)<br>
         : performed_(false), wrapper_(wrapper) {}<br>
<br>
-    virtual Result Perform(const ArgumentTuple&) {<br>
+    Result Perform(const ArgumentTuple&) override {<br>
       GTEST_CHECK_(!performed_)<br>
           << "A ByMove() action should only be performed once.";<br>
       performed_ = true;<br>
-      return internal::move(wrapper_->payload);<br>
+      return std::move(wrapper_->payload);<br>
     }<br>
<br>
    private:<br>
     bool performed_;<br>
-    const linked_ptr<R> wrapper_;<br>
+    const std::shared_ptr<R> wrapper_;<br>
<br>
     GTEST_DISALLOW_ASSIGN_(Impl);<br>
   };<br>
<br>
-  const linked_ptr<R> value_;<br>
+  const std::shared_ptr<R> value_;<br>
<br>
   GTEST_DISALLOW_ASSIGN_(ReturnAction);<br>
 };<br>
@@ -659,13 +612,7 @@ class ReturnNullAction {<br>
   // pointer type on compile time.<br>
   template <typename Result, typename ArgumentTuple><br>
   static Result Perform(const ArgumentTuple&) {<br>
-#if GTEST_LANG_CXX11<br>
     return nullptr;<br>
-#else<br>
-    GTEST_COMPILE_ASSERT_(internal::is_pointer<Result>::value,<br>
-                          ReturnNull_can_be_used_to_return_a_pointer_only);<br>
-    return NULL;<br>
-#endif  // GTEST_LANG_CXX11<br>
   }<br>
 };<br>
<br>
@@ -675,7 +622,7 @@ class ReturnVoidAction {<br>
   // Allows Return() to be used in any void-returning function.<br>
   template <typename Result, typename ArgumentTuple><br>
   static void Perform(const ArgumentTuple&) {<br>
-    CompileAssertTypesEqual<void, Result>();<br>
+    static_assert(std::is_void<Result>::value, "Result should be void.");<br>
   }<br>
 };<br>
<br>
@@ -696,7 +643,7 @@ class ReturnRefAction {<br>
     // Asserts that the function return type is a reference.  This<br>
     // catches the user error of using ReturnRef(x) when Return(x)<br>
     // should be used, and generates some helpful error message.<br>
-    GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value,<br>
+    GTEST_COMPILE_ASSERT_(std::is_reference<Result>::value,<br>
                           use_Return_instead_of_ReturnRef_to_return_a_value);<br>
     return Action<F>(new Impl<F>(ref_));<br>
   }<br>
@@ -711,9 +658,7 @@ class ReturnRefAction {<br>
<br>
     explicit Impl(T& ref) : ref_(ref) {}  // NOLINT<br>
<br>
-    virtual Result Perform(const ArgumentTuple&) {<br>
-      return ref_;<br>
-    }<br>
+    Result Perform(const ArgumentTuple&) override { return ref_; }<br>
<br>
    private:<br>
     T& ref_;<br>
@@ -745,7 +690,7 @@ class ReturnRefOfCopyAction {<br>
     // catches the user error of using ReturnRefOfCopy(x) when Return(x)<br>
     // should be used, and generates some helpful error message.<br>
     GTEST_COMPILE_ASSERT_(<br>
-        internal::is_reference<Result>::value,<br>
+        std::is_reference<Result>::value,<br>
         use_Return_instead_of_ReturnRefOfCopy_to_return_a_value);<br>
     return Action<F>(new Impl<F>(value_));<br>
   }<br>
@@ -760,9 +705,7 @@ class ReturnRefOfCopyAction {<br>
<br>
     explicit Impl(const T& value) : value_(value) {}  // NOLINT<br>
<br>
-    virtual Result Perform(const ArgumentTuple&) {<br>
-      return value_;<br>
-    }<br>
+    Result Perform(const ArgumentTuple&) override { return value_; }<br>
<br>
    private:<br>
     T value_;<br>
@@ -829,114 +772,58 @@ class SetErrnoAndReturnAction {<br>
 #endif  // !GTEST_OS_WINDOWS_MOBILE<br>
<br>
 // Implements the SetArgumentPointee<N>(x) action for any function<br>
-// whose N-th argument (0-based) is a pointer to x's type.  The<br>
-// template parameter kIsProto is true iff type A is ProtocolMessage,<br>
-// proto2::Message, or a sub-class of those.<br>
-template <size_t N, typename A, bool kIsProto><br>
-class SetArgumentPointeeAction {<br>
- public:<br>
-  // Constructs an action that sets the variable pointed to by the<br>
-  // N-th function argument to 'value'.<br>
-  explicit SetArgumentPointeeAction(const A& value) : value_(value) {}<br>
-<br>
-  template <typename Result, typename ArgumentTuple><br>
-  void Perform(const ArgumentTuple& args) const {<br>
-    CompileAssertTypesEqual<void, Result>();<br>
-    *::testing::get<N>(args) = value_;<br>
+// whose N-th argument (0-based) is a pointer to x's type.<br>
+template <size_t N, typename A, typename = void><br>
+struct SetArgumentPointeeAction {<br>
+  A value;<br>
+<br>
+  template <typename... Args><br>
+  void operator()(const Args&... args) const {<br>
+    *::std::get<N>(std::tie(args...)) = value;<br>
   }<br>
-<br>
- private:<br>
-  const A value_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);<br>
 };<br>
<br>
-template <size_t N, typename Proto><br>
-class SetArgumentPointeeAction<N, Proto, true> {<br>
- public:<br>
-  // Constructs an action that sets the variable pointed to by the<br>
-  // N-th function argument to 'proto'.  Both ProtocolMessage and<br>
-  // proto2::Message have the CopyFrom() method, so the same<br>
-  // implementation works for both.<br>
-  explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) {<br>
-    proto_->CopyFrom(proto);<br>
-  }<br>
-<br>
-  template <typename Result, typename ArgumentTuple><br>
-  void Perform(const ArgumentTuple& args) const {<br>
-    CompileAssertTypesEqual<void, Result>();<br>
-    ::testing::get<N>(args)->CopyFrom(*proto_);<br>
+// Implements the Invoke(object_ptr, &Class::Method) action.<br>
+template <class Class, typename MethodPtr><br>
+struct InvokeMethodAction {<br>
+  Class* const obj_ptr;<br>
+  const MethodPtr method_ptr;<br>
+<br>
+  template <typename... Args><br>
+  auto operator()(Args&&... args) const<br>
+      -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) {<br>
+    return (obj_ptr->*method_ptr)(std::forward<Args>(args)...);<br>
   }<br>
-<br>
- private:<br>
-  const internal::linked_ptr<Proto> proto_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction);<br>
 };<br>
<br>
 // Implements the InvokeWithoutArgs(f) action.  The template argument<br>
 // FunctionImpl is the implementation type of f, which can be either a<br>
 // function pointer or a functor.  InvokeWithoutArgs(f) can be used as an<br>
-// Action<F> as long as f's type is compatible with F (i.e. f can be<br>
-// assigned to a tr1::function<F>).<br>
+// Action<F> as long as f's type is compatible with F.<br>
 template <typename FunctionImpl><br>
-class InvokeWithoutArgsAction {<br>
- public:<br>
-  // The c'tor makes a copy of function_impl (either a function<br>
-  // pointer or a functor).<br>
-  explicit InvokeWithoutArgsAction(FunctionImpl function_impl)<br>
-      : function_impl_(function_impl) {}<br>
+struct InvokeWithoutArgsAction {<br>
+  FunctionImpl function_impl;<br>
<br>
   // Allows InvokeWithoutArgs(f) to be used as any action whose type is<br>
   // compatible with f.<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple&) { return function_impl_(); }<br>
-<br>
- private:<br>
-  FunctionImpl function_impl_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(InvokeWithoutArgsAction);<br>
+  template <typename... Args><br>
+  auto operator()(const Args&...) -> decltype(function_impl()) {<br>
+    return function_impl();<br>
+  }<br>
 };<br>
<br>
 // Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action.<br>
 template <class Class, typename MethodPtr><br>
-class InvokeMethodWithoutArgsAction {<br>
- public:<br>
-  InvokeMethodWithoutArgsAction(Class* obj_ptr, MethodPtr method_ptr)<br>
-      : obj_ptr_(obj_ptr), method_ptr_(method_ptr) {}<br>
-<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple&) const {<br>
-    return (obj_ptr_->*method_ptr_)();<br>
-  }<br>
+struct InvokeMethodWithoutArgsAction {<br>
+  Class* const obj_ptr;<br>
+  const MethodPtr method_ptr;<br>
<br>
- private:<br>
-  Class* const obj_ptr_;<br>
-  const MethodPtr method_ptr_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(InvokeMethodWithoutArgsAction);<br>
-};<br>
+  using ReturnType = typename std::result_of<MethodPtr(Class*)>::type;<br>
<br>
-// Implements the InvokeWithoutArgs(callback) action.<br>
-template <typename CallbackType><br>
-class InvokeCallbackWithoutArgsAction {<br>
- public:<br>
-  // The c'tor takes ownership of the callback.<br>
-  explicit InvokeCallbackWithoutArgsAction(CallbackType* callback)<br>
-      : callback_(callback) {<br>
-    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.<br>
+  template <typename... Args><br>
+  ReturnType operator()(const Args&...) const {<br>
+    return (obj_ptr->*method_ptr)();<br>
   }<br>
-<br>
-  // This type conversion operator template allows Invoke(callback) to<br>
-  // be used wherever the callback's return type can be implicitly<br>
-  // converted to that of the mock function.<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple&) const { return callback_->Run(); }<br>
-<br>
- private:<br>
-  const internal::linked_ptr<CallbackType> callback_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(InvokeCallbackWithoutArgsAction);<br>
 };<br>
<br>
 // Implements the IgnoreResult(action) action.<br>
@@ -958,7 +845,7 @@ class IgnoreResultAction {<br>
     typedef typename internal::Function<F>::Result Result;<br>
<br>
     // Asserts at compile time that F returns void.<br>
-    CompileAssertTypesEqual<void, Result>();<br>
+    static_assert(std::is_void<Result>::value, "Result type should be void.");<br>
<br>
     return Action<F>(new Impl<F>(action_));<br>
   }<br>
@@ -972,7 +859,7 @@ class IgnoreResultAction {<br>
<br>
     explicit Impl(const A& action) : action_(action) {}<br>
<br>
-    virtual void Perform(const ArgumentTuple& args) {<br>
+    void Perform(const ArgumentTuple& args) override {<br>
       // Performs the action and ignores its result.<br>
       action_.Perform(args);<br>
     }<br>
@@ -993,76 +880,51 @@ class IgnoreResultAction {<br>
   GTEST_DISALLOW_ASSIGN_(IgnoreResultAction);<br>
 };<br>
<br>
-// A ReferenceWrapper<T> object represents a reference to type T,<br>
-// which can be either const or not.  It can be explicitly converted<br>
-// from, and implicitly converted to, a T&.  Unlike a reference,<br>
-// ReferenceWrapper<T> can be copied and can survive template type<br>
-// inference.  This is used to support by-reference arguments in the<br>
-// InvokeArgument<N>(...) action.  The idea was from "reference<br>
-// wrappers" in tr1, which we don't have in our source tree yet.<br>
-template <typename T><br>
-class ReferenceWrapper {<br>
- public:<br>
-  // Constructs a ReferenceWrapper<T> object from a T&.<br>
-  explicit ReferenceWrapper(T& l_value) : pointer_(&l_value) {}  // NOLINT<br>
-<br>
-  // Allows a ReferenceWrapper<T> object to be implicitly converted to<br>
-  // a T&.<br>
-  operator T&() const { return *pointer_; }<br>
- private:<br>
-  T* pointer_;<br>
+template <typename InnerAction, size_t... I><br>
+struct WithArgsAction {<br>
+  InnerAction action;<br>
+<br>
+  // The inner action could be anything convertible to Action<X>.<br>
+  // We use the conversion operator to detect the signature of the inner Action.<br>
+  template <typename R, typename... Args><br>
+  operator Action<R(Args...)>() const {  // NOLINT<br>
+    Action<R(typename std::tuple_element<I, std::tuple<Args...>>::type...)><br>
+        converted(action);<br>
+<br>
+    return [converted](Args... args) -> R {<br>
+      return converted.Perform(std::forward_as_tuple(<br>
+        std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...));<br>
+    };<br>
+  }<br>
 };<br>
<br>
-// Allows the expression ByRef(x) to be printed as a reference to x.<br>
-template <typename T><br>
-void PrintTo(const ReferenceWrapper<T>& ref, ::std::ostream* os) {<br>
-  T& value = ref;<br>
-  UniversalPrinter<T&>::Print(value, os);<br>
-}<br>
+template <typename... Actions><br>
+struct DoAllAction {<br>
+ private:<br>
+  template <typename... Args, size_t... I><br>
+  std::vector<Action<void(Args...)>> Convert(IndexSequence<I...>) const {<br>
+    return {std::get<I>(actions)...};<br>
+  }<br>
<br>
-// Does two actions sequentially.  Used for implementing the DoAll(a1,<br>
-// a2, ...) action.<br>
-template <typename Action1, typename Action2><br>
-class DoBothAction {<br>
  public:<br>
-  DoBothAction(Action1 action1, Action2 action2)<br>
-      : action1_(action1), action2_(action2) {}<br>
-<br>
-  // This template type conversion operator allows DoAll(a1, ..., a_n)<br>
-  // to be used in ANY function of compatible type.<br>
-  template <typename F><br>
-  operator Action<F>() const {<br>
-    return Action<F>(new Impl<F>(action1_, action2_));<br>
+  std::tuple<Actions...> actions;<br>
+<br>
+  template <typename R, typename... Args><br>
+  operator Action<R(Args...)>() const {  // NOLINT<br>
+    struct Op {<br>
+      std::vector<Action<void(Args...)>> converted;<br>
+      Action<R(Args...)> last;<br>
+      R operator()(Args... args) const {<br>
+        auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...);<br>
+        for (auto& a : converted) {<br>
+          a.Perform(tuple_args);<br>
+        }<br>
+        return last.Perform(tuple_args);<br>
+      }<br>
+    };<br>
+    return Op{Convert<Args...>(MakeIndexSequence<sizeof...(Actions) - 1>()),<br>
+              std::get<sizeof...(Actions) - 1>(actions)};<br>
   }<br>
-<br>
- private:<br>
-  // Implements the DoAll(...) action for a particular function type F.<br>
-  template <typename F><br>
-  class Impl : public ActionInterface<F> {<br>
-   public:<br>
-    typedef typename Function<F>::Result Result;<br>
-    typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
-    typedef typename Function<F>::MakeResultVoid VoidResult;<br>
-<br>
-    Impl(const Action<VoidResult>& action1, const Action<F>& action2)<br>
-        : action1_(action1), action2_(action2) {}<br>
-<br>
-    virtual Result Perform(const ArgumentTuple& args) {<br>
-      action1_.Perform(args);<br>
-      return action2_.Perform(args);<br>
-    }<br>
-<br>
-   private:<br>
-    const Action<VoidResult> action1_;<br>
-    const Action<F> action2_;<br>
-<br>
-    GTEST_DISALLOW_ASSIGN_(Impl);<br>
-  };<br>
-<br>
-  Action1 action1_;<br>
-  Action2 action2_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(DoBothAction);<br>
 };<br>
<br>
 }  // namespace internal<br>
@@ -1099,19 +961,43 @@ class DoBothAction {<br>
 //   EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin));<br>
 typedef internal::IgnoredValue Unused;<br>
<br>
-// This constructor allows us to turn an Action<From> object into an<br>
-// Action<To>, as long as To's arguments can be implicitly converted<br>
-// to From's and From's return type cann be implicitly converted to<br>
-// To's.<br>
-template <typename To><br>
-template <typename From><br>
-Action<To>::Action(const Action<From>& from)<br>
-    :<br>
-#if GTEST_LANG_CXX11<br>
-      fun_(from.fun_),<br>
-#endif<br>
-      impl_(from.impl_ == NULL ? NULL<br>
-                               : new internal::ActionAdaptor<To, From>(from)) {<br>
+// Creates an action that does actions a1, a2, ..., sequentially in<br>
+// each invocation.<br>
+template <typename... Action><br>
+internal::DoAllAction<typename std::decay<Action>::type...> DoAll(<br>
+    Action&&... action) {<br>
+  return {std::forward_as_tuple(std::forward<Action>(action)...)};<br>
+}<br>
+<br>
+// WithArg<k>(an_action) creates an action that passes the k-th<br>
+// (0-based) argument of the mock function to an_action and performs<br>
+// it.  It adapts an action accepting one argument to one that accepts<br>
+// multiple arguments.  For convenience, we also provide<br>
+// WithArgs<k>(an_action) (defined below) as a synonym.<br>
+template <size_t k, typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type, k><br>
+WithArg(InnerAction&& action) {<br>
+  return {std::forward<InnerAction>(action)};<br>
+}<br>
+<br>
+// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes<br>
+// the selected arguments of the mock function to an_action and<br>
+// performs it.  It serves as an adaptor between actions with<br>
+// <br>
diff erent argument lists.<br>
+template <size_t k, size_t... ks, typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...><br>
+WithArgs(InnerAction&& action) {<br>
+  return {std::forward<InnerAction>(action)};<br>
+}<br>
+<br>
+// WithoutArgs(inner_action) can be used in a mock function with a<br>
+// non-empty argument list to perform inner_action, which takes no<br>
+// argument.  In other words, it adapts an action accepting no<br>
+// argument to one that accepts (and ignores) arguments.<br>
+template <typename InnerAction><br>
+internal::WithArgsAction<typename std::decay<InnerAction>::type><br>
+WithoutArgs(InnerAction&& action) {<br>
+  return {std::forward<InnerAction>(action)};<br>
 }<br>
<br>
 // Creates an action that returns 'value'.  'value' is passed by value<br>
@@ -1119,7 +1005,7 @@ Action<To>::Action(const Action<From>& from)<br>
 // will trigger a compiler error about using array as initializer.<br>
 template <typename R><br>
 internal::ReturnAction<R> Return(R value) {<br>
-  return internal::ReturnAction<R>(internal::move(value));<br>
+  return internal::ReturnAction<R>(std::move(value));<br>
 }<br>
<br>
 // Creates an action that returns NULL.<br>
@@ -1152,7 +1038,7 @@ inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) {<br>
 // invariant.<br>
 template <typename R><br>
 internal::ByMoveWrapper<R> ByMove(R x) {<br>
-  return internal::ByMoveWrapper<R>(internal::move(x));<br>
+  return internal::ByMoveWrapper<R>(std::move(x));<br>
 }<br>
<br>
 // Creates an action that does the default action for the give mock function.<br>
@@ -1163,43 +1049,14 @@ inline internal::DoDefaultAction DoDefault() {<br>
 // Creates an action that sets the variable pointed by the N-th<br>
 // (0-based) function argument to 'value'.<br>
 template <size_t N, typename T><br>
-PolymorphicAction<<br>
-  internal::SetArgumentPointeeAction<<br>
-    N, T, internal::IsAProtocolMessage<T>::value> ><br>
-SetArgPointee(const T& x) {<br>
-  return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
-      N, T, internal::IsAProtocolMessage<T>::value>(x));<br>
-}<br>
-<br>
-#if !((GTEST_GCC_VER_ && GTEST_GCC_VER_ < 40000) || GTEST_OS_SYMBIAN)<br>
-// This overload allows SetArgPointee() to accept a string literal.<br>
-// GCC prior to the version 4.0 and Symbian C++ compiler cannot distinguish<br>
-// this overload from the templated version and emit a compile error.<br>
-template <size_t N><br>
-PolymorphicAction<<br>
-  internal::SetArgumentPointeeAction<N, const char*, false> ><br>
-SetArgPointee(const char* p) {<br>
-  return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
-      N, const char*, false>(p));<br>
+internal::SetArgumentPointeeAction<N, T> SetArgPointee(T x) {<br>
+  return {std::move(x)};<br>
 }<br>
<br>
-template <size_t N><br>
-PolymorphicAction<<br>
-  internal::SetArgumentPointeeAction<N, const wchar_t*, false> ><br>
-SetArgPointee(const wchar_t* p) {<br>
-  return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
-      N, const wchar_t*, false>(p));<br>
-}<br>
-#endif<br>
-<br>
 // The following version is DEPRECATED.<br>
 template <size_t N, typename T><br>
-PolymorphicAction<<br>
-  internal::SetArgumentPointeeAction<<br>
-    N, T, internal::IsAProtocolMessage<T>::value> ><br>
-SetArgumentPointee(const T& x) {<br>
-  return MakePolymorphicAction(internal::SetArgumentPointeeAction<<br>
-      N, T, internal::IsAProtocolMessage<T>::value>(x));<br>
+internal::SetArgumentPointeeAction<N, T> SetArgumentPointee(T x) {<br>
+  return {std::move(x)};<br>
 }<br>
<br>
 // Creates an action that sets a pointer referent to a given value.<br>
@@ -1220,24 +1077,38 @@ SetErrnoAndReturn(int errval, T result) {<br>
<br>
 #endif  // !GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Various overloads for InvokeWithoutArgs().<br>
+// Various overloads for Invoke().<br>
+<br>
+// Legacy function.<br>
+// Actions can now be implicitly constructed from callables. No need to create<br>
+// wrapper objects.<br>
+// This function exists for backwards compatibility.<br>
+template <typename FunctionImpl><br>
+typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) {<br>
+  return std::forward<FunctionImpl>(function_impl);<br>
+}<br>
+<br>
+// Creates an action that invokes the given method on the given object<br>
+// with the mock function's arguments.<br>
+template <class Class, typename MethodPtr><br>
+internal::InvokeMethodAction<Class, MethodPtr> Invoke(Class* obj_ptr,<br>
+                                                      MethodPtr method_ptr) {<br>
+  return {obj_ptr, method_ptr};<br>
+}<br>
<br>
 // Creates an action that invokes 'function_impl' with no argument.<br>
 template <typename FunctionImpl><br>
-PolymorphicAction<internal::InvokeWithoutArgsAction<FunctionImpl> ><br>
+internal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type><br>
 InvokeWithoutArgs(FunctionImpl function_impl) {<br>
-  return MakePolymorphicAction(<br>
-      internal::InvokeWithoutArgsAction<FunctionImpl>(function_impl));<br>
+  return {std::move(function_impl)};<br>
 }<br>
<br>
 // Creates an action that invokes the given method on the given object<br>
 // with no argument.<br>
 template <class Class, typename MethodPtr><br>
-PolymorphicAction<internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> ><br>
-InvokeWithoutArgs(Class* obj_ptr, MethodPtr method_ptr) {<br>
-  return MakePolymorphicAction(<br>
-      internal::InvokeMethodWithoutArgsAction<Class, MethodPtr>(<br>
-          obj_ptr, method_ptr));<br>
+internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> InvokeWithoutArgs(<br>
+    Class* obj_ptr, MethodPtr method_ptr) {<br>
+  return {obj_ptr, method_ptr};<br>
 }<br>
<br>
 // Creates an action that performs an_action and throws away its<br>
@@ -1255,11 +1126,19 @@ inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) {<br>
 // where Base is a base class of Derived, just write:<br>
 //<br>
 //   ByRef<const Base>(derived)<br>
+//<br>
+// N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper.<br>
+// However, it may still be used for consistency with ByMove().<br>
 template <typename T><br>
-inline internal::ReferenceWrapper<T> ByRef(T& l_value) {  // NOLINT<br>
-  return internal::ReferenceWrapper<T>(l_value);<br>
+inline ::std::reference_wrapper<T> ByRef(T& l_value) {  // NOLINT<br>
+  return ::std::reference_wrapper<T>(l_value);<br>
 }<br>
<br>
 }  // namespace testing<br>
<br>
+#ifdef _MSC_VER<br>
+# pragma warning(pop)<br>
+#endif<br>
+<br>
+<br>
 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
index dafbcbce669d5..05b66d4fffdc8 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-cardinalities.h<br>
@@ -42,6 +42,7 @@<br>
 #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_<br>
<br>
 #include <limits.h><br>
+#include <memory><br>
 #include <ostream>  // NOLINT<br>
 #include "gmock/internal/gmock-port.h"<br>
 #include "gtest/gtest.h"<br>
@@ -71,10 +72,12 @@ class CardinalityInterface {<br>
   virtual int ConservativeLowerBound() const { return 0; }<br>
   virtual int ConservativeUpperBound() const { return INT_MAX; }<br>
<br>
-  // Returns true iff call_count calls will satisfy this cardinality.<br>
+  // Returns true if and only if call_count calls will satisfy this<br>
+  // cardinality.<br>
   virtual bool IsSatisfiedByCallCount(int call_count) const = 0;<br>
<br>
-  // Returns true iff call_count calls will saturate this cardinality.<br>
+  // Returns true if and only if call_count calls will saturate this<br>
+  // cardinality.<br>
   virtual bool IsSaturatedByCallCount(int call_count) const = 0;<br>
<br>
   // Describes self to an ostream.<br>
@@ -83,9 +86,8 @@ class CardinalityInterface {<br>
<br>
 // A Cardinality is a copyable and IMMUTABLE (except by assignment)<br>
 // object that specifies how many times a mock function is expected to<br>
-// be called.  The implementation of Cardinality is just a linked_ptr<br>
-// to const CardinalityInterface, so copying is fairly cheap.<br>
-// Don't inherit from Cardinality!<br>
+// be called.  The implementation of Cardinality is just a std::shared_ptr<br>
+// to const CardinalityInterface. Don't inherit from Cardinality!<br>
 class GTEST_API_ Cardinality {<br>
  public:<br>
   // Constructs a null cardinality.  Needed for storing Cardinality<br>
@@ -100,17 +102,19 @@ class GTEST_API_ Cardinality {<br>
   int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); }<br>
   int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); }<br>
<br>
-  // Returns true iff call_count calls will satisfy this cardinality.<br>
+  // Returns true if and only if call_count calls will satisfy this<br>
+  // cardinality.<br>
   bool IsSatisfiedByCallCount(int call_count) const {<br>
     return impl_->IsSatisfiedByCallCount(call_count);<br>
   }<br>
<br>
-  // Returns true iff call_count calls will saturate this cardinality.<br>
+  // Returns true if and only if call_count calls will saturate this<br>
+  // cardinality.<br>
   bool IsSaturatedByCallCount(int call_count) const {<br>
     return impl_->IsSaturatedByCallCount(call_count);<br>
   }<br>
<br>
-  // Returns true iff call_count calls will over-saturate this<br>
+  // Returns true if and only if call_count calls will over-saturate this<br>
   // cardinality, i.e. exceed the maximum number of allowed calls.<br>
   bool IsOverSaturatedByCallCount(int call_count) const {<br>
     return impl_->IsSaturatedByCallCount(call_count) &&<br>
@@ -125,7 +129,7 @@ class GTEST_API_ Cardinality {<br>
                                         ::std::ostream* os);<br>
<br>
  private:<br>
-  internal::linked_ptr<const CardinalityInterface> impl_;<br>
+  std::shared_ptr<const CardinalityInterface> impl_;<br>
 };<br>
<br>
 // Creates a cardinality that allows at least n calls.<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
new file mode 100644<br>
index 0000000000000..cc1535c806bf4<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-function-mocker.h<br>
@@ -0,0 +1,253 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+//     * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+//     * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+//     * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// Google Mock - a framework for writing C++ mock classes.<br>
+//<br>
+// This file implements MOCK_METHOD.<br>
+<br>
+// GOOGLETEST_CM0002 DO NOT DELETE<br>
+<br>
+#ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_  // NOLINT<br>
+#define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_  // NOLINT<br>
+<br>
+#include "gmock/gmock-generated-function-mockers.h"  // NOLINT<br>
+#include "gmock/internal/gmock-pp.h"<br>
+<br>
+#define MOCK_METHOD(...) \<br>
+  GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \<br>
+  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \<br>
+  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \<br>
+  GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec)     \<br>
+  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args);                                   \<br>
+  GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec);                                   \<br>
+  GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(                                      \<br>
+      GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args));           \<br>
+  GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec)                                     \<br>
+  GMOCK_INTERNAL_MOCK_METHOD_IMPL(                                            \<br>
+      GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec),     \<br>
+      GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec),    \<br>
+      GMOCK_INTERNAL_HAS_NOEXCEPT(_Spec), GMOCK_INTERNAL_GET_CALLTYPE(_Spec), \<br>
+      (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \<br>
+  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \<br>
+  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \<br>
+  GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_WRONG_ARITY(...)                                      \<br>
+  static_assert(                                                             \<br>
+      false,                                                                 \<br>
+      "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, "             \<br>
+      "_MethodName, _Args and optionally _Spec. _Args and _Spec must be "    \<br>
+      "enclosed in parentheses. If _Ret is a type with unprotected commas, " \<br>
+      "it must also be enclosed in parentheses.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \<br>
+  static_assert(                                  \<br>
+      GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple),        \<br>
+      GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...)                 \<br>
+  static_assert(                                                       \<br>
+      std::is_function<__VA_ARGS__>::value,                            \<br>
+      "Signature must be a function type, maybe return type contains " \<br>
+      "unprotected comma.");                                           \<br>
+  static_assert(                                                       \<br>
+      ::testing::tuple_size<typename ::testing::internal::Function<    \<br>
+              __VA_ARGS__>::ArgumentTuple>::value == _N,               \<br>
+      "This method does not take " GMOCK_PP_STRINGIZE(                 \<br>
+          _N) " arguments. Parenthesize all types with unproctected commas.")<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \<br>
+  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec)<br>
+<br>
+#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness,           \<br>
+                                        _Override, _Final, _Noexcept,          \<br>
+                                        _CallType, _Signature)                 \<br>
+  typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS(               \<br>
+      _Signature)>::Result                                                     \<br>
+  GMOCK_INTERNAL_EXPAND(_CallType)                                             \<br>
+      _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N))   \<br>
+          GMOCK_PP_IF(_Constness, const, ) GMOCK_PP_IF(_Noexcept, noexcept, )  \<br>
+              GMOCK_PP_IF(_Override, override, )                               \<br>
+                  GMOCK_PP_IF(_Final, final, ) {                               \<br>
+    GMOCK_MOCKER_(_N, _Constness, _MethodName)                                 \<br>
+        .SetOwnerAndName(this, #_MethodName);                                  \<br>
+    return GMOCK_MOCKER_(_N, _Constness, _MethodName)                          \<br>
+        .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N));  \<br>
+  }                                                                            \<br>
+  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \<br>
+      GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N))       \<br>
+      GMOCK_PP_IF(_Constness, const, ) {                                       \<br>
+    GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this);            \<br>
+    return GMOCK_MOCKER_(_N, _Constness, _MethodName)                          \<br>
+        .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N));         \<br>
+  }                                                                            \<br>
+  ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \<br>
+      const ::testing::internal::WithoutMatchers&,                             \<br>
+      GMOCK_PP_IF(_Constness, const, )::testing::internal::Function<           \<br>
+          GMOCK_PP_REMOVE_PARENS(_Signature)>*)                                \<br>
+      const GMOCK_PP_IF(_Noexcept, noexcept, ) {                               \<br>
+    return GMOCK_PP_CAT(::testing::internal::AdjustConstness_,                 \<br>
+                        GMOCK_PP_IF(_Constness, const, ))(this)                \<br>
+        ->gmock_##_MethodName(GMOCK_PP_REPEAT(                                 \<br>
+            GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N));               \<br>
+  }                                                                            \<br>
+  mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)>        \<br>
+      GMOCK_MOCKER_(_N, _Constness, _MethodName)<br>
+<br>
+#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__<br>
+<br>
+// Five Valid modifiers.<br>
+#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \<br>
+  GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \<br>
+  GMOCK_PP_HAS_COMMA(                       \<br>
+      GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \<br>
+  GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_HAS_NOEXCEPT(_Tuple) \<br>
+  GMOCK_PP_HAS_COMMA(                       \<br>
+      GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_NOEXCEPT, ~, _Tuple))<br>
+<br>
+#define GMOCK_INTERNAL_GET_CALLTYPE(_Tuple) \<br>
+  GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_CALLTYPE_IMPL, ~, _Tuple)<br>
+<br>
+#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem)            \<br>
+  static_assert(                                                          \<br>
+      (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) +    \<br>
+       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \<br>
+       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) +    \<br>
+       GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \<br>
+       GMOCK_INTERNAL_IS_CALLTYPE(_elem)) == 1,                           \<br>
+      GMOCK_PP_STRINGIZE(                                                 \<br>
+          _elem) " cannot be recognized as a valid specification modifier.");<br>
+<br>
+// Modifiers implementation.<br>
+#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \<br>
+  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_CONST_I_const ,<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \<br>
+  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override ,<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \<br>
+  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_FINAL_I_final ,<br>
+<br>
+// TODO(iserna): Maybe noexcept should accept an argument here as well.<br>
+#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \<br>
+  GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem)<br>
+<br>
+#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept ,<br>
+<br>
+#define GMOCK_INTERNAL_GET_CALLTYPE_IMPL(_i, _, _elem)           \<br>
+  GMOCK_PP_IF(GMOCK_INTERNAL_IS_CALLTYPE(_elem),                 \<br>
+              GMOCK_INTERNAL_GET_VALUE_CALLTYPE, GMOCK_PP_EMPTY) \<br>
+  (_elem)<br>
+<br>
+// TODO(iserna): GMOCK_INTERNAL_IS_CALLTYPE and<br>
+// GMOCK_INTERNAL_GET_VALUE_CALLTYPE needed more expansions to work on windows<br>
+// maybe they can be simplified somehow.<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE(_arg) \<br>
+  GMOCK_INTERNAL_IS_CALLTYPE_I(          \<br>
+      GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE_I(_arg) GMOCK_PP_IS_ENCLOSED_PARENS(_arg)<br>
+<br>
+#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE(_arg) \<br>
+  GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(          \<br>
+      GMOCK_PP_CAT(GMOCK_INTERNAL_IS_CALLTYPE_HELPER_, _arg))<br>
+#define GMOCK_INTERNAL_GET_VALUE_CALLTYPE_I(_arg) \<br>
+  GMOCK_PP_CAT(GMOCK_PP_IDENTITY, _arg)<br>
+<br>
+#define GMOCK_INTERNAL_IS_CALLTYPE_HELPER_Calltype<br>
+<br>
+#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)                         \<br>
+  GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), GMOCK_PP_REMOVE_PARENS, \<br>
+              GMOCK_PP_IDENTITY)                                      \<br>
+  (_Ret)(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args))<br>
+<br>
+#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem)                          \<br>
+  GMOCK_PP_COMMA_IF(_i)                                                \<br>
+  GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \<br>
+              GMOCK_PP_IDENTITY)                                       \<br>
+  (_elem)<br>
+<br>
+#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _)        \<br>
+  GMOCK_PP_COMMA_IF(_i)                                    \<br>
+  GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i),         \<br>
+                       GMOCK_PP_REMOVE_PARENS(_Signature)) \<br>
+  gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _)                       \<br>
+  GMOCK_PP_COMMA_IF(_i)                                                     \<br>
+  ::std::forward<GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i),           \<br>
+                                      GMOCK_PP_REMOVE_PARENS(_Signature))>( \<br>
+      gmock_a##_i)<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _)    \<br>
+  GMOCK_PP_COMMA_IF(_i)                                        \<br>
+  GMOCK_INTERNAL_MATCHER_O(typename, GMOCK_PP_INC(_i),         \<br>
+                           GMOCK_PP_REMOVE_PARENS(_Signature)) \<br>
+  gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \<br>
+  GMOCK_PP_COMMA_IF(_i)                             \<br>
+  gmock_a##_i<br>
+<br>
+#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _)    \<br>
+  GMOCK_PP_COMMA_IF(_i)                                         \<br>
+  ::testing::A<GMOCK_INTERNAL_ARG_O(typename, GMOCK_PP_INC(_i), \<br>
+                                    GMOCK_PP_REMOVE_PARENS(_Signature))>()<br>
+<br>
+#define GMOCK_INTERNAL_ARG_O(_tn, _i, ...) GMOCK_ARG_(_tn, _i, __VA_ARGS__)<br>
+<br>
+#define GMOCK_INTERNAL_MATCHER_O(_tn, _i, ...) \<br>
+  GMOCK_MATCHER_(_tn, _i, __VA_ARGS__)<br>
+<br>
+#endif  // THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
index 8b47568b24529..9b5b78b165b61 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-actions.h<br>
@@ -38,537 +38,20 @@<br>
<br>
 // GOOGLETEST_CM0002 DO NOT DELETE<br>
<br>
-// IWYU pragma: private, include "gmock/gmock.h<br>
+// IWYU pragma: private, include "gmock/gmock.h"<br>
<br>
 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_<br>
 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_ACTIONS_H_<br>
<br>
+#include <memory><br>
+#include <utility><br>
+<br>
 #include "gmock/gmock-actions.h"<br>
 #include "gmock/internal/gmock-port.h"<br>
<br>
 namespace testing {<br>
 namespace internal {<br>
<br>
-// InvokeHelper<F> knows how to unpack an N-tuple and invoke an N-ary<br>
-// function, method, or callback with the unpacked values, where F is<br>
-// a function type that takes N arguments.<br>
-template <typename Result, typename ArgumentTuple><br>
-class InvokeHelper;<br>
-<br>
-template <typename R><br>
-class InvokeHelper<R, ::testing::tuple<> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<>&) {<br>
-           return function();<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<>&) {<br>
-           return (obj_ptr->*method_ptr)();<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<>&) {<br>
-           return callback->Run();<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-class InvokeHelper<R, ::testing::tuple<A1> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1>& args) {<br>
-           return function(get<0>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args));<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<A1>& args) {<br>
-           return callback->Run(get<0>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2>& args) {<br>
-           return function(get<0>(args), get<1>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args));<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<A1, A2>& args) {<br>
-           return callback->Run(get<0>(args), get<1>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args));<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<A1, A2, A3>& args) {<br>
-           return callback->Run(get<0>(args), get<1>(args), get<2>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3,<br>
-      A4>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args));<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<A1, A2, A3, A4>& args) {<br>
-           return callback->Run(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4,<br>
-      A5>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args));<br>
-  }<br>
-<br>
-  template <typename CallbackType><br>
-  static R InvokeCallback(CallbackType* callback,<br>
-                          const ::testing::tuple<A1, A2, A3, A4, A5>& args) {<br>
-           return callback->Run(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
-      A6>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args), get<5>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5, A6>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args), get<5>(args));<br>
-  }<br>
-<br>
-  // There is no InvokeCallback() for 6-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
-      A6, A7>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args), get<5>(args), get<6>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5, A6,<br>
-                            A7>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
-               get<6>(args));<br>
-  }<br>
-<br>
-  // There is no InvokeCallback() for 7-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
-      A6, A7, A8>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
-               get<7>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7,<br>
-                            A8>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
-               get<6>(args), get<7>(args));<br>
-  }<br>
-<br>
-  // There is no InvokeCallback() for 8-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
-      A6, A7, A8, A9>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
-               get<7>(args), get<8>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,<br>
-                            A9>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
-               get<6>(args), get<7>(args), get<8>(args));<br>
-  }<br>
-<br>
-  // There is no InvokeCallback() for 9-tuples<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9,<br>
-    typename A10><br>
-class InvokeHelper<R, ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
-    A10> > {<br>
- public:<br>
-  template <typename Function><br>
-  static R Invoke(Function function, const ::testing::tuple<A1, A2, A3, A4, A5,<br>
-      A6, A7, A8, A9, A10>& args) {<br>
-           return function(get<0>(args), get<1>(args), get<2>(args),<br>
-               get<3>(args), get<4>(args), get<5>(args), get<6>(args),<br>
-               get<7>(args), get<8>(args), get<9>(args));<br>
-  }<br>
-<br>
-  template <class Class, typename MethodPtr><br>
-  static R InvokeMethod(Class* obj_ptr,<br>
-                        MethodPtr method_ptr,<br>
-                        const ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8,<br>
-                            A9, A10>& args) {<br>
-           return (obj_ptr->*method_ptr)(get<0>(args), get<1>(args),<br>
-               get<2>(args), get<3>(args), get<4>(args), get<5>(args),<br>
-               get<6>(args), get<7>(args), get<8>(args), get<9>(args));<br>
-  }<br>
-<br>
-  // There is no InvokeCallback() for 10-tuples<br>
-};<br>
-<br>
-// Implements the Invoke(callback) action.<br>
-template <typename CallbackType><br>
-class InvokeCallbackAction {<br>
- public:<br>
-  // The c'tor takes ownership of the callback.<br>
-  explicit InvokeCallbackAction(CallbackType* callback)<br>
-      : callback_(callback) {<br>
-    callback->CheckIsRepeatable();  // Makes sure the callback is permanent.<br>
-  }<br>
-<br>
-  // This type conversion operator template allows Invoke(callback) to<br>
-  // be used wherever the callback's type is compatible with that of<br>
-  // the mock function, i.e. if the mock function's arguments can be<br>
-  // implicitly converted to the callback's arguments and the<br>
-  // callback's result can be implicitly converted to the mock<br>
-  // function's result.<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple& args) const {<br>
-    return InvokeHelper<Result, ArgumentTuple>::InvokeCallback(<br>
-        callback_.get(), args);<br>
-  }<br>
- private:<br>
-  const linked_ptr<CallbackType> callback_;<br>
-};<br>
-<br>
-// An INTERNAL macro for extracting the type of a tuple field.  It's<br>
-// subject to change without notice - DO NOT USE IN USER CODE!<br>
-#define GMOCK_FIELD_(Tuple, N) \<br>
-    typename ::testing::tuple_element<N, Tuple>::type<br>
-<br>
-// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::type is the<br>
-// type of an n-ary function whose i-th (1-based) argument type is the<br>
-// k{i}-th (0-based) field of ArgumentTuple, which must be a tuple<br>
-// type, and whose return type is Result.  For example,<br>
-//   SelectArgs<int, ::testing::tuple<bool, char, double, long>, 0, 3>::type<br>
-// is int(bool, long).<br>
-//<br>
-// SelectArgs<Result, ArgumentTuple, k1, k2, ..., k_n>::Select(args)<br>
-// returns the selected fields (k1, k2, ..., k_n) of args as a tuple.<br>
-// For example,<br>
-//   SelectArgs<int, tuple<bool, char, double>, 2, 0>::Select(<br>
-//       ::testing::make_tuple(true, 'a', 2.5))<br>
-// returns tuple (2.5, true).<br>
-//<br>
-// The numbers in list k1, k2, ..., k_n must be >= 0, where n can be<br>
-// in the range [0, 10].  Duplicates are allowed and they don't have<br>
-// to be in an ascending or descending order.<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5, int k6, int k7, int k8, int k9, int k10><br>
-class SelectArgs {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
-      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
-      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9),<br>
-      GMOCK_FIELD_(ArgumentTuple, k10));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
-        get<k8>(args), get<k9>(args), get<k10>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type();<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& /* args */) {<br>
-    return SelectedArgs();<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, k5, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5, int k6><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, k5, k6, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
-      GMOCK_FIELD_(ArgumentTuple, k6));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args), get<k6>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5, int k6, int k7><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, k5, k6, k7, -1, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
-      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5, int k6, int k7, int k8><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, k5, k6, k7, k8, -1, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
-      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
-      GMOCK_FIELD_(ArgumentTuple, k8));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
-        get<k8>(args));<br>
-  }<br>
-};<br>
-<br>
-template <typename Result, typename ArgumentTuple, int k1, int k2, int k3,<br>
-    int k4, int k5, int k6, int k7, int k8, int k9><br>
-class SelectArgs<Result, ArgumentTuple,<br>
-                 k1, k2, k3, k4, k5, k6, k7, k8, k9, -1> {<br>
- public:<br>
-  typedef Result type(GMOCK_FIELD_(ArgumentTuple, k1),<br>
-      GMOCK_FIELD_(ArgumentTuple, k2), GMOCK_FIELD_(ArgumentTuple, k3),<br>
-      GMOCK_FIELD_(ArgumentTuple, k4), GMOCK_FIELD_(ArgumentTuple, k5),<br>
-      GMOCK_FIELD_(ArgumentTuple, k6), GMOCK_FIELD_(ArgumentTuple, k7),<br>
-      GMOCK_FIELD_(ArgumentTuple, k8), GMOCK_FIELD_(ArgumentTuple, k9));<br>
-  typedef typename Function<type>::ArgumentTuple SelectedArgs;<br>
-  static SelectedArgs Select(const ArgumentTuple& args) {<br>
-    return SelectedArgs(get<k1>(args), get<k2>(args), get<k3>(args),<br>
-        get<k4>(args), get<k5>(args), get<k6>(args), get<k7>(args),<br>
-        get<k8>(args), get<k9>(args));<br>
-  }<br>
-};<br>
-<br>
-#undef GMOCK_FIELD_<br>
-<br>
-// Implements the WithArgs action.<br>
-template <typename InnerAction, int k1 = -1, int k2 = -1, int k3 = -1,<br>
-    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
-    int k9 = -1, int k10 = -1><br>
-class WithArgsAction {<br>
- public:<br>
-  explicit WithArgsAction(const InnerAction& action) : action_(action) {}<br>
-<br>
-  template <typename F><br>
-  operator Action<F>() const { return MakeAction(new Impl<F>(action_)); }<br>
-<br>
- private:<br>
-  template <typename F><br>
-  class Impl : public ActionInterface<F> {<br>
-   public:<br>
-    typedef typename Function<F>::Result Result;<br>
-    typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-    explicit Impl(const InnerAction& action) : action_(action) {}<br>
-<br>
-    virtual Result Perform(const ArgumentTuple& args) {<br>
-      return action_.Perform(SelectArgs<Result, ArgumentTuple, k1, k2, k3, k4,<br>
-          k5, k6, k7, k8, k9, k10>::Select(args));<br>
-    }<br>
-<br>
-   private:<br>
-    typedef typename SelectArgs<Result, ArgumentTuple,<br>
-        k1, k2, k3, k4, k5, k6, k7, k8, k9, k10>::type InnerFunctionType;<br>
-<br>
-    Action<InnerFunctionType> action_;<br>
-  };<br>
-<br>
-  const InnerAction action_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(WithArgsAction);<br>
-};<br>
-<br>
 // A macro from the ACTION* family (defined later in this file)<br>
 // defines an action that can be used in a mock function.  Typically,<br>
 // these actions only care about a subset of the arguments of the mock<br>
@@ -589,7 +72,7 @@ struct ExcessiveArg {};<br>
 template <typename Result, class Impl><br>
 class ActionHelper {<br>
  public:<br>
-  static Result Perform(Impl* impl, const ::testing::tuple<>& args) {<br>
+  static Result Perform(Impl* impl, const ::std::tuple<>& args) {<br>
     return impl->template gmock_PerformImpl<>(args, ExcessiveArg(),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
@@ -597,266 +80,100 @@ class ActionHelper {<br>
   }<br>
<br>
   template <typename A0><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0>& args) {<br>
-    return impl->template gmock_PerformImpl<A0>(args, get<0>(args),<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0>& args) {<br>
+    return impl->template gmock_PerformImpl<A0>(args, std::get<0>(args),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
         ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1>& args) {<br>
-    return impl->template gmock_PerformImpl<A0, A1>(args, get<0>(args),<br>
-        get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1>& args) {<br>
+    return impl->template gmock_PerformImpl<A0, A1>(args, std::get<0>(args),<br>
+        std::get<1>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
         ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2>& args) {<br>
-    return impl->template gmock_PerformImpl<A0, A1, A2>(args, get<0>(args),<br>
-        get<1>(args), get<2>(args), ExcessiveArg(), ExcessiveArg(),<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2>& args) {<br>
+    return impl->template gmock_PerformImpl<A0, A1, A2>(args,<br>
+        std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
         ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+        ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2,<br>
-      A3>& args) {<br>
-    return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args, get<0>(args),<br>
-        get<1>(args), get<2>(args), get<3>(args), ExcessiveArg(),<br>
-        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3>& args) {<br>
+    return impl->template gmock_PerformImpl<A0, A1, A2, A3>(args,<br>
+        std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
+        ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3,<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3,<br>
       A4>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4>(args,<br>
-        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
-        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+        std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), ExcessiveArg(), ExcessiveArg(),<br>
+        ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
       typename A5><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4,<br>
       A5>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5>(args,<br>
-        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
-        get<5>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+        std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+        ExcessiveArg(), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
       typename A5, typename A6><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
-      A5, A6>& args) {<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+      A6>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6>(args,<br>
-        get<0>(args), get<1>(args), get<2>(args), get<3>(args), get<4>(args),<br>
-        get<5>(args), get<6>(args), ExcessiveArg(), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+        std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+        std::get<6>(args), ExcessiveArg(), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
       typename A5, typename A6, typename A7><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
-      A5, A6, A7>& args) {<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+      A6, A7>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6,<br>
-        A7>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
-        get<4>(args), get<5>(args), get<6>(args), get<7>(args), ExcessiveArg(),<br>
-        ExcessiveArg());<br>
+        A7>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+        std::get<6>(args), std::get<7>(args), ExcessiveArg(), ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
       typename A5, typename A6, typename A7, typename A8><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
-      A5, A6, A7, A8>& args) {<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+      A6, A7, A8>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7,<br>
-        A8>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
-        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),<br>
+        A8>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+        std::get<6>(args), std::get<7>(args), std::get<8>(args),<br>
         ExcessiveArg());<br>
   }<br>
<br>
   template <typename A0, typename A1, typename A2, typename A3, typename A4,<br>
       typename A5, typename A6, typename A7, typename A8, typename A9><br>
-  static Result Perform(Impl* impl, const ::testing::tuple<A0, A1, A2, A3, A4,<br>
-      A5, A6, A7, A8, A9>& args) {<br>
+  static Result Perform(Impl* impl, const ::std::tuple<A0, A1, A2, A3, A4, A5,<br>
+      A6, A7, A8, A9>& args) {<br>
     return impl->template gmock_PerformImpl<A0, A1, A2, A3, A4, A5, A6, A7, A8,<br>
-        A9>(args, get<0>(args), get<1>(args), get<2>(args), get<3>(args),<br>
-        get<4>(args), get<5>(args), get<6>(args), get<7>(args), get<8>(args),<br>
-        get<9>(args));<br>
+        A9>(args, std::get<0>(args), std::get<1>(args), std::get<2>(args),<br>
+        std::get<3>(args), std::get<4>(args), std::get<5>(args),<br>
+        std::get<6>(args), std::get<7>(args), std::get<8>(args),<br>
+        std::get<9>(args));<br>
   }<br>
 };<br>
<br>
 }  // namespace internal<br>
-<br>
-// Various overloads for Invoke().<br>
-<br>
-// WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes<br>
-// the selected arguments of the mock function to an_action and<br>
-// performs it.  It serves as an adaptor between actions with<br>
-// <br>
diff erent argument lists.  C++ doesn't support default arguments for<br>
-// function templates, so we have to overload it.<br>
-template <int k1, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,<br>
-    typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6,<br>
-      k7>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7,<br>
-      k8>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    int k9, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8, k9><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-      k9>(action);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    int k9, int k10, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-    k9, k10><br>
-WithArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-      k9, k10>(action);<br>
-}<br>
-<br>
-// Creates an action that does actions a1, a2, ..., sequentially in<br>
-// each invocation.<br>
-template <typename Action1, typename Action2><br>
-inline internal::DoBothAction<Action1, Action2><br>
-DoAll(Action1 a1, Action2 a2) {<br>
-  return internal::DoBothAction<Action1, Action2>(a1, a2);<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    Action3> ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3) {<br>
-  return DoAll(a1, DoAll(a2, a3));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, Action4> > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    Action5> > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5, typename Action6><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    internal::DoBothAction<Action5, Action6> > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5, a6));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5, typename Action6, typename Action7><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
-    Action7> > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
-    Action7 a7) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5, typename Action6, typename Action7,<br>
-    typename Action8><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
-    internal::DoBothAction<Action7, Action8> > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
-    Action7 a7, Action8 a8) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5, typename Action6, typename Action7,<br>
-    typename Action8, typename Action9><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
-    internal::DoBothAction<Action7, internal::DoBothAction<Action8,<br>
-    Action9> > > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
-    Action7 a7, Action8 a8, Action9 a9) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9));<br>
-}<br>
-<br>
-template <typename Action1, typename Action2, typename Action3,<br>
-    typename Action4, typename Action5, typename Action6, typename Action7,<br>
-    typename Action8, typename Action9, typename Action10><br>
-inline internal::DoBothAction<Action1, internal::DoBothAction<Action2,<br>
-    internal::DoBothAction<Action3, internal::DoBothAction<Action4,<br>
-    internal::DoBothAction<Action5, internal::DoBothAction<Action6,<br>
-    internal::DoBothAction<Action7, internal::DoBothAction<Action8,<br>
-    internal::DoBothAction<Action9, Action10> > > > > > > > ><br>
-DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
-    Action7 a7, Action8 a8, Action9 a9, Action10 a10) {<br>
-  return DoAll(a1, DoAll(a2, a3, a4, a5, a6, a7, a8, a9, a10));<br>
-}<br>
-<br>
 }  // namespace testing<br>
<br>
 // The ACTION* family of macros can be used in a namespace scope to<br>
@@ -944,30 +261,29 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
 //<br>
 // CAVEAT:<br>
 //<br>
-// ACTION*() can only be used in a namespace scope.  The reason is<br>
-// that C++ doesn't yet allow function-local types to be used to<br>
-// instantiate templates.  The up-coming C++0x standard will fix this.<br>
-// Once that's done, we'll consider supporting using ACTION*() inside<br>
-// a function.<br>
+// ACTION*() can only be used in a namespace scope as templates cannot be<br>
+// declared inside of a local class.<br>
+// Users can, however, define any local functors (e.g. a lambda) that<br>
+// can be used as actions.<br>
 //<br>
 // MORE INFORMATION:<br>
 //<br>
-// To learn more about using these macros, please search for 'ACTION'<br>
-// on <a href="https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md</a><br>
+// To learn more about using these macros, please search for 'ACTION' on<br>
+// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md</a><br>
<br>
 // An internal macro needed for implementing ACTION*().<br>
 #define GMOCK_ACTION_ARG_TYPES_AND_NAMES_UNUSED_\<br>
     const args_type& args GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg0_type arg0 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg1_type arg1 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg2_type arg2 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg3_type arg3 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg4_type arg4 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg5_type arg5 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg6_type arg6 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg7_type arg7 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg8_type arg8 GTEST_ATTRIBUTE_UNUSED_, \<br>
-    arg9_type arg9 GTEST_ATTRIBUTE_UNUSED_<br>
+    const arg0_type& arg0 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg1_type& arg1 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg2_type& arg2 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg3_type& arg3 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg4_type& arg4 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg5_type& arg5 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg6_type& arg6 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg7_type& arg7 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg8_type& arg8 GTEST_ATTRIBUTE_UNUSED_, \<br>
+    const arg9_type& arg9 GTEST_ATTRIBUTE_UNUSED_<br>
<br>
 // Sometimes you want to give an action explicit template parameters<br>
 // that cannot be inferred from its value parameters.  ACTION() and<br>
@@ -993,7 +309,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
 //   ACTION_TEMPLATE(DuplicateArg,<br>
 //                   HAS_2_TEMPLATE_PARAMS(int, k, typename, T),<br>
 //                   AND_1_VALUE_PARAMS(output)) {<br>
-//     *output = T(::testing::get<k>(args));<br>
+//     *output = T(::std::get<k>(args));<br>
 //   }<br>
 //   ...<br>
 //     int n;<br>
@@ -1151,90 +467,67 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
 #define GMOCK_INTERNAL_INIT_AND_0_VALUE_PARAMS()\<br>
     ()<br>
 #define GMOCK_INTERNAL_INIT_AND_1_VALUE_PARAMS(p0)\<br>
-    (p0##_type gmock_p0) : p0(::testing::internal::move(gmock_p0))<br>
+    (p0##_type gmock_p0) : p0(::std::move(gmock_p0))<br>
 #define GMOCK_INTERNAL_INIT_AND_2_VALUE_PARAMS(p0, p1)\<br>
-    (p0##_type gmock_p0, \<br>
-        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1))<br>
+    (p0##_type gmock_p0, p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1))<br>
 #define GMOCK_INTERNAL_INIT_AND_3_VALUE_PARAMS(p0, p1, p2)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, \<br>
-        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2))<br>
+        p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2))<br>
 #define GMOCK_INTERNAL_INIT_AND_4_VALUE_PARAMS(p0, p1, p2, p3)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
-        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3))<br>
+        p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3))<br>
 #define GMOCK_INTERNAL_INIT_AND_5_VALUE_PARAMS(p0, p1, p2, p3, p4)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
-        p3##_type gmock_p3, \<br>
-        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4))<br>
+        p3##_type gmock_p3, p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4))<br>
 #define GMOCK_INTERNAL_INIT_AND_6_VALUE_PARAMS(p0, p1, p2, p3, p4, p5)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
         p3##_type gmock_p3, p4##_type gmock_p4, \<br>
-        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5))<br>
+        p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5))<br>
 #define GMOCK_INTERNAL_INIT_AND_7_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
-        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6))<br>
+        p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6))<br>
 #define GMOCK_INTERNAL_INIT_AND_8_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, p7)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
-        p6##_type gmock_p6, \<br>
-        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7))<br>
+        p6##_type gmock_p6, p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7))<br>
 #define GMOCK_INTERNAL_INIT_AND_9_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \<br>
     p7, p8)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
         p6##_type gmock_p6, p7##_type gmock_p7, \<br>
-        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7)), \<br>
-        p8(::testing::internal::move(gmock_p8))<br>
+        p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8))<br>
 #define GMOCK_INTERNAL_INIT_AND_10_VALUE_PARAMS(p0, p1, p2, p3, p4, p5, p6, \<br>
     p7, p8, p9)\<br>
     (p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
         p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
         p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
-        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7)), \<br>
-        p8(::testing::internal::move(gmock_p8)), \<br>
-        p9(::testing::internal::move(gmock_p9))<br>
+        p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \<br>
+        p9(::std::move(gmock_p9))<br>
<br>
 // Declares the fields for storing the value parameters.<br>
 #define GMOCK_INTERNAL_DEFN_AND_0_VALUE_PARAMS()<br>
@@ -1380,10 +673,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       GMOCK_INTERNAL_DEFN_##value_params\<br>
      private:\<br>
       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
@@ -1441,10 +736,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
      private:\<br>
       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
     };\<br>
@@ -1471,7 +768,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
   class name##ActionP {\<br>
    public:\<br>
     explicit name##ActionP(p0##_type gmock_p0) : \<br>
-        p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\<br>
+        p0(::std::forward<p0##_type>(gmock_p0)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1480,7 +777,7 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
           args_type;\<br>
       explicit gmock_Impl(p0##_type gmock_p0) : \<br>
-          p0(::testing::internal::forward<p0##_type>(gmock_p0)) {}\<br>
+          p0(::std::forward<p0##_type>(gmock_p0)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1489,10 +786,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
      private:\<br>
       GTEST_DISALLOW_ASSIGN_(gmock_Impl);\<br>
@@ -1523,8 +822,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
   class name##ActionP2 {\<br>
    public:\<br>
     name##ActionP2(p0##_type gmock_p0, \<br>
-        p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\<br>
+        p1##_type gmock_p1) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1533,8 +832,8 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, \<br>
-          p1##_type gmock_p1) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)) {}\<br>
+          p1##_type gmock_p1) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1543,10 +842,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
      private:\<br>
@@ -1580,9 +881,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
   class name##ActionP3 {\<br>
    public:\<br>
     name##ActionP3(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
-        p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\<br>
+        p2##_type gmock_p2) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1591,9 +892,9 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
-          p2##_type gmock_p2) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)) {}\<br>
+          p2##_type gmock_p2) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1602,10 +903,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -1644,10 +947,10 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
    public:\<br>
     name##ActionP4(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, \<br>
-        p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\<br>
+        p3##_type gmock_p3) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1656,10 +959,10 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       typedef typename ::testing::internal::Function<F>::ArgumentTuple\<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
-          p3##_type gmock_p3) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)) {}\<br>
+          p3##_type gmock_p3) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1668,10 +971,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -1716,11 +1021,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
    public:\<br>
     name##ActionP5(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, \<br>
-        p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\<br>
+        p4##_type gmock_p4) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1730,11 +1035,11 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, \<br>
-          p4##_type gmock_p4) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)) {}\<br>
+          p4##_type gmock_p4) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1743,10 +1048,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -1793,12 +1100,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
    public:\<br>
     name##ActionP6(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
-        p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-        p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\<br>
+        p5##_type gmock_p5) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+        p5(::std::forward<p5##_type>(gmock_p5)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1808,12 +1115,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, \<br>
-          p5##_type gmock_p5) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-          p5(::testing::internal::forward<p5##_type>(gmock_p5)) {}\<br>
+          p5##_type gmock_p5) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+          p5(::std::forward<p5##_type>(gmock_p5)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1822,10 +1129,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -1876,13 +1185,13 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
     name##ActionP7(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, \<br>
-        p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-        p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\<br>
+        p6##_type gmock_p6) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+        p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+        p6(::std::forward<p6##_type>(gmock_p6)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1892,13 +1201,13 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           args_type;\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
-          p6##_type gmock_p6) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-          p6(::testing::internal::forward<p6##_type>(gmock_p6)) {}\<br>
+          p6##_type gmock_p6) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+          p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+          p6(::std::forward<p6##_type>(gmock_p6)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -1907,10 +1216,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -1967,14 +1278,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
     name##ActionP8(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, \<br>
-        p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-        p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\<br>
+        p7##_type gmock_p7) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+        p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+        p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+        p7(::std::forward<p7##_type>(gmock_p7)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -1985,14 +1296,14 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, \<br>
-          p7##_type gmock_p7) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-          p7(::testing::internal::forward<p7##_type>(gmock_p7)) {}\<br>
+          p7##_type gmock_p7) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+          p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+          p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+          p7(::std::forward<p7##_type>(gmock_p7)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -2001,10 +1312,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -2065,15 +1378,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
     name##ActionP9(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
-        p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
-        p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\<br>
+        p8##_type gmock_p8) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+        p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+        p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+        p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+        p8(::std::forward<p8##_type>(gmock_p8)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -2084,15 +1397,15 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, p7##_type gmock_p7, \<br>
-          p8##_type gmock_p8) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
-          p8(::testing::internal::forward<p8##_type>(gmock_p8)) {}\<br>
+          p8##_type gmock_p8) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+          p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+          p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+          p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+          p8(::std::forward<p8##_type>(gmock_p8)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -2101,10 +1414,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -2170,16 +1485,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
         p8##_type gmock_p8, \<br>
-        p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-        p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-        p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-        p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-        p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-        p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-        p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-        p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
-        p8(::testing::internal::forward<p8##_type>(gmock_p8)), \<br>
-        p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\<br>
+        p9##_type gmock_p9) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+        p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+        p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+        p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+        p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+        p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+        p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+        p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+        p8(::std::forward<p8##_type>(gmock_p8)), \<br>
+        p9(::std::forward<p9##_type>(gmock_p9)) {}\<br>
     template <typename F>\<br>
     class gmock_Impl : public ::testing::ActionInterface<F> {\<br>
      public:\<br>
@@ -2190,16 +1505,16 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
-          p9##_type gmock_p9) : p0(::testing::internal::forward<p0##_type>(gmock_p0)), \<br>
-          p1(::testing::internal::forward<p1##_type>(gmock_p1)), \<br>
-          p2(::testing::internal::forward<p2##_type>(gmock_p2)), \<br>
-          p3(::testing::internal::forward<p3##_type>(gmock_p3)), \<br>
-          p4(::testing::internal::forward<p4##_type>(gmock_p4)), \<br>
-          p5(::testing::internal::forward<p5##_type>(gmock_p5)), \<br>
-          p6(::testing::internal::forward<p6##_type>(gmock_p6)), \<br>
-          p7(::testing::internal::forward<p7##_type>(gmock_p7)), \<br>
-          p8(::testing::internal::forward<p8##_type>(gmock_p8)), \<br>
-          p9(::testing::internal::forward<p9##_type>(gmock_p9)) {}\<br>
+          p9##_type gmock_p9) : p0(::std::forward<p0##_type>(gmock_p0)), \<br>
+          p1(::std::forward<p1##_type>(gmock_p1)), \<br>
+          p2(::std::forward<p2##_type>(gmock_p2)), \<br>
+          p3(::std::forward<p3##_type>(gmock_p3)), \<br>
+          p4(::std::forward<p4##_type>(gmock_p4)), \<br>
+          p5(::std::forward<p5##_type>(gmock_p5)), \<br>
+          p6(::std::forward<p6##_type>(gmock_p6)), \<br>
+          p7(::std::forward<p7##_type>(gmock_p7)), \<br>
+          p8(::std::forward<p8##_type>(gmock_p8)), \<br>
+          p9(::std::forward<p9##_type>(gmock_p9)) {}\<br>
       virtual return_type Perform(const args_type& args) {\<br>
         return ::testing::internal::ActionHelper<return_type, gmock_Impl>::\<br>
             Perform(this, args);\<br>
@@ -2208,10 +1523,12 @@ DoAll(Action1 a1, Action2 a2, Action3 a3, Action4 a4, Action5 a5, Action6 a6,<br>
           typename arg3_type, typename arg4_type, typename arg5_type, \<br>
           typename arg6_type, typename arg7_type, typename arg8_type, \<br>
           typename arg9_type>\<br>
-      return_type gmock_PerformImpl(const args_type& args, arg0_type arg0, \<br>
-          arg1_type arg1, arg2_type arg2, arg3_type arg3, arg4_type arg4, \<br>
-          arg5_type arg5, arg6_type arg6, arg7_type arg7, arg8_type arg8, \<br>
-          arg9_type arg9) const;\<br>
+      return_type gmock_PerformImpl(const args_type& args, \<br>
+          const arg0_type& arg0, const arg1_type& arg1, \<br>
+          const arg2_type& arg2, const arg3_type& arg3, \<br>
+          const arg4_type& arg4, const arg5_type& arg5, \<br>
+          const arg6_type& arg6, const arg7_type& arg7, \<br>
+          const arg8_type& arg8, const arg9_type& arg9) const;\<br>
       p0##_type p0;\<br>
       p1##_type p1;\<br>
       p2##_type p2;\<br>
@@ -2391,7 +1708,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args));<br>
+      ::std::get<k>(args));<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2400,7 +1717,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0);<br>
+      ::std::get<k>(args), p0);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2409,7 +1726,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1);<br>
+      ::std::get<k>(args), p0, p1);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2418,7 +1735,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2);<br>
+      ::std::get<k>(args), p0, p1, p2);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2427,7 +1744,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3);<br>
+      ::std::get<k>(args), p0, p1, p2, p3);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2436,7 +1753,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2445,7 +1762,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4, p5);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2454,7 +1771,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2463,7 +1780,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2472,7 +1789,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8);<br>
 }<br>
<br>
 ACTION_TEMPLATE(InvokeArgument,<br>
@@ -2481,7 +1798,7 @@ ACTION_TEMPLATE(InvokeArgument,<br>
   using internal::invoke_argument::InvokeArgumentAdl;<br>
   return InvokeArgumentAdl<return_type>(<br>
       internal::invoke_argument::AdlTag(),<br>
-      ::testing::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);<br>
+      ::std::get<k>(args), p0, p1, p2, p3, p4, p5, p6, p7, p8, p9);<br>
 }<br>
<br>
 // Various overloads for ReturnNew<T>().<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
index 53a71611f9261..d131bea8158b6 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-function-mockers.h<br>
@@ -43,298 +43,14 @@<br>
 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
 #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
<br>
+#include <functional><br>
+#include <utility><br>
+<br>
 #include "gmock/gmock-spec-builders.h"<br>
 #include "gmock/internal/gmock-internal-utils.h"<br>
<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-# include <functional><br>
-#endif<br>
-<br>
 namespace testing {<br>
 namespace internal {<br>
-<br>
-template <typename F><br>
-class FunctionMockerBase;<br>
-<br>
-// Note: class FunctionMocker really belongs to the ::testing<br>
-// namespace.  However if we define it in ::testing, MSVC will<br>
-// complain when classes in ::testing::internal declare it as a<br>
-// friend class template.  To workaround this compiler bug, we define<br>
-// FunctionMocker in ::testing::internal and import it into ::testing.<br>
-template <typename F><br>
-class FunctionMocker;<br>
-<br>
-template <typename R><br>
-class FunctionMocker<R()> : public<br>
-    internal::FunctionMockerBase<R()> {<br>
- public:<br>
-  typedef R F();<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With() {<br>
-    return MockSpec<F>(this, ::testing::make_tuple());<br>
-  }<br>
-<br>
-  R Invoke() {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple());<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-class FunctionMocker<R(A1)> : public<br>
-    internal::FunctionMockerBase<R(A1)> {<br>
- public:<br>
-  typedef R F(A1);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-class FunctionMocker<R(A1, A2)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2)> {<br>
- public:<br>
-  typedef R F(A1, A2);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-class FunctionMocker<R(A1, A2, A3)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-class FunctionMocker<R(A1, A2, A3, A4)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5, A6);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
-      const Matcher<A6>& m6) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
-        internal::forward<A6>(a6)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5, A6, A7);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
-      const Matcher<A6>& m6, const Matcher<A7>& m7) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
-        internal::forward<A6>(a6), internal::forward<A7>(a7)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
-      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
-        m8));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
-        internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
-        internal::forward<A8>(a8)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
-      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,<br>
-      const Matcher<A9>& m9) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
-        m8, m9));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
-        internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
-        internal::forward<A8>(a8), internal::forward<A9>(a9)));<br>
-  }<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9,<br>
-    typename A10><br>
-class FunctionMocker<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> : public<br>
-    internal::FunctionMockerBase<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> {<br>
- public:<br>
-  typedef R F(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);<br>
-  typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple;<br>
-<br>
-  MockSpec<F> With(const Matcher<A1>& m1, const Matcher<A2>& m2,<br>
-      const Matcher<A3>& m3, const Matcher<A4>& m4, const Matcher<A5>& m5,<br>
-      const Matcher<A6>& m6, const Matcher<A7>& m7, const Matcher<A8>& m8,<br>
-      const Matcher<A9>& m9, const Matcher<A10>& m10) {<br>
-    return MockSpec<F>(this, ::testing::make_tuple(m1, m2, m3, m4, m5, m6, m7,<br>
-        m8, m9, m10));<br>
-  }<br>
-<br>
-  R Invoke(A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7, A8 a8, A9 a9,<br>
-      A10 a10) {<br>
-    // Even though gcc and MSVC don't enforce it, 'this->' is required<br>
-    // by the C++ standard [14.6.4] here, as the base class type is<br>
-    // dependent on the template argument (and thus shouldn't be<br>
-    // looked into when resolving InvokeWith).<br>
-    return this->InvokeWith(ArgumentTuple(internal::forward<A1>(a1),<br>
-        internal::forward<A2>(a2), internal::forward<A3>(a3),<br>
-        internal::forward<A4>(a4), internal::forward<A5>(a5),<br>
-        internal::forward<A6>(a6), internal::forward<A7>(a7),<br>
-        internal::forward<A8>(a8), internal::forward<A9>(a9),<br>
-        internal::forward<A10>(a10)));<br>
-  }<br>
-};<br>
-<br>
 // Removes the given pointer; this is a helper for the expectation setter method<br>
 // for parameterless matchers.<br>
 //<br>
@@ -407,7 +123,7 @@ using internal::FunctionMocker;<br>
 // The type of argument N of the given function type.<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
 #define GMOCK_ARG_(tn, N, ...) \<br>
-    tn ::testing::internal::Function<__VA_ARGS__>::Argument##N<br>
+    tn ::testing::internal::Function<__VA_ARGS__>::template Arg<N-1>::type<br>
<br>
 // The matcher type for argument N of the given function type.<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
@@ -420,534 +136,467 @@ using internal::FunctionMocker;<br>
     GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD0_(tn, constness, ct, Method, ...)                       \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method() constness {                     \<br>
-    GTEST_COMPILE_ASSERT_(                                                   \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<             \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 0),                      \<br>
-        this_method_does_not_take_0_arguments);                              \<br>
-    GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method);      \<br>
-    return GMOCK_MOCKER_(0, constness, Method).Invoke();                     \<br>
-  }                                                                          \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method() constness {              \<br>
-    GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this);                 \<br>
-    return GMOCK_MOCKER_(0, constness, Method).With();                       \<br>
-  }                                                                          \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                           \<br>
-      const ::testing::internal::WithoutMatchers&,                           \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {         \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)            \<br>
-        ->gmock_##Method();                                                  \<br>
-  }                                                                          \<br>
+#define GMOCK_METHOD0_(tn, constness, ct, Method, ...) \<br>
+  static_assert(0 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      ) constness { \<br>
+    GMOCK_MOCKER_(0, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(0, constness, Method).Invoke(); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method() constness { \<br>
+    GMOCK_MOCKER_(0, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(0, constness, Method).With(); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(); \<br>
+      } \<br>
   mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(0, constness, \<br>
-                                                               Method)<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD1_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 1),                       \<br>
-        this_method_does_not_take_1_argument);                                \<br>
-    GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(1, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-            gmock_a1));                                                       \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness {                \<br>
-    GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1);                \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD1_(tn, constness, ct, Method, ...) \<br>
+  static_assert(1 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
+    GMOCK_MOCKER_(1, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(1, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1) constness { \<br>
+    GMOCK_MOCKER_(1, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(1, constness, Method).With(gmock_a1); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(1, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD2_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 2),                       \<br>
-        this_method_does_not_take_2_arguments);                               \<br>
-    GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(2, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness {                \<br>
-    GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2);      \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD2_(tn, constness, ct, Method, ...) \<br>
+  static_assert(2 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2) constness { \<br>
+    GMOCK_MOCKER_(2, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(2, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2) constness { \<br>
+    GMOCK_MOCKER_(2, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(2, constness, Method).With(gmock_a1, gmock_a2); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(2, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD3_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 3),                       \<br>
-        this_method_does_not_take_3_arguments);                               \<br>
-    GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(3, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness {                \<br>
-    GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(3, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3);                                  \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD3_(tn, constness, ct, Method, ...) \<br>
+  static_assert(3 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, \<br>
+          __VA_ARGS__) gmock_a3) constness { \<br>
+    GMOCK_MOCKER_(3, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(3, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3) constness { \<br>
+    GMOCK_MOCKER_(3, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(3, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(3, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD4_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 4),                       \<br>
-        this_method_does_not_take_4_arguments);                               \<br>
-    GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(4, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness {                \<br>
-    GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(4, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4);                        \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD4_(tn, constness, ct, Method, ...) \<br>
+  static_assert(4 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
+    GMOCK_MOCKER_(4, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(4, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4) constness { \<br>
+    GMOCK_MOCKER_(4, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(4, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(4, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD5_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 5),                       \<br>
-        this_method_does_not_take_5_arguments);                               \<br>
-    GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(5, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
-                    gmock_a5));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness {                \<br>
-    GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(5, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5);              \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD5_(tn, constness, ct, Method, ...) \<br>
+  static_assert(5 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5) constness { \<br>
+    GMOCK_MOCKER_(5, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(5, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5) constness { \<br>
+    GMOCK_MOCKER_(5, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(5, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(5, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD6_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \<br>
-            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 6),                       \<br>
-        this_method_does_not_take_6_arguments);                               \<br>
-    GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(6, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
-                    gmock_a5),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
-                    gmock_a6));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \<br>
-      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness {                \<br>
-    GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(6, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6);    \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD6_(tn, constness, ct, Method, ...) \<br>
+  static_assert(6 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, \<br>
+          __VA_ARGS__) gmock_a6) constness { \<br>
+    GMOCK_MOCKER_(6, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(6, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6) constness { \<br>
+    GMOCK_MOCKER_(6, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(6, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5, gmock_a6); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(6, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD7_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \<br>
-            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \<br>
-            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 7),                       \<br>
-        this_method_does_not_take_7_arguments);                               \<br>
-    GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(7, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
-                    gmock_a5),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
-                    gmock_a6),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
-                    gmock_a7));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \<br>
-      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \<br>
-      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness {                \<br>
-    GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(7, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \<br>
-              gmock_a7);                                                      \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD7_(tn, constness, ct, Method, ...) \<br>
+  static_assert(7 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
+    GMOCK_MOCKER_(7, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(7, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7) constness { \<br>
+    GMOCK_MOCKER_(7, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(7, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(7, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD8_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \<br>
-            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \<br>
-            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \<br>
-            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 8),                       \<br>
-        this_method_does_not_take_8_arguments);                               \<br>
-    GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(8, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
-                    gmock_a5),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
-                    gmock_a6),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
-                    gmock_a7),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \<br>
-                    gmock_a8));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \<br>
-      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \<br>
-      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \<br>
-      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness {                \<br>
-    GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(8, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \<br>
-              gmock_a7, gmock_a8);                                            \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD8_(tn, constness, ct, Method, ...) \<br>
+  static_assert(8 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+          __VA_ARGS__) gmock_a8) constness { \<br>
+    GMOCK_MOCKER_(8, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(8, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8) constness { \<br>
+    GMOCK_MOCKER_(8, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(8, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(8, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD9_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                              \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                          \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                          \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                          \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                          \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                          \<br>
-            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                          \<br>
-            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                          \<br>
-            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                          \<br>
-            GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9) constness {              \<br>
-    GTEST_COMPILE_ASSERT_(                                                    \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<              \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 9),                       \<br>
-        this_method_does_not_take_9_arguments);                               \<br>
-    GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(9, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>( \<br>
-                    gmock_a1),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>( \<br>
-                    gmock_a2),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>( \<br>
-                    gmock_a3),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>( \<br>
-                    gmock_a4),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>( \<br>
-                    gmock_a5),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>( \<br>
-                    gmock_a6),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>( \<br>
-                    gmock_a7),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>( \<br>
-                    gmock_a8),                                                \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>( \<br>
-                    gmock_a9));                                               \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                            \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                            \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                            \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                            \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                            \<br>
-      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                            \<br>
-      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                            \<br>
-      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                            \<br>
-      GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness {                \<br>
-    GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(9, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,     \<br>
-              gmock_a7, gmock_a8, gmock_a9);                                  \<br>
-  }                                                                           \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                            \<br>
-      const ::testing::internal::WithoutMatchers&,                            \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {          \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)             \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),      \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>());     \<br>
-  }                                                                           \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD9_(tn, constness, ct, Method, ...) \<br>
+  static_assert(9 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+          __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, \<br>
+          __VA_ARGS__) gmock_a9) constness { \<br>
+    GMOCK_MOCKER_(9, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(9, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
+                     GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9) constness { \<br>
+    GMOCK_MOCKER_(9, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(9, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, \<br>
+        gmock_a9); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(9, constness, \<br>
+      Method)<br>
<br>
 // INTERNAL IMPLEMENTATION - DON'T USE IN USER CODE!!!<br>
-#define GMOCK_METHOD10_(tn, constness, ct, Method, ...)                        \<br>
-  GMOCK_RESULT_(tn, __VA_ARGS__)                                               \<br>
-  ct Method(GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1,                           \<br>
-            GMOCK_ARG_(tn, 2, __VA_ARGS__) gmock_a2,                           \<br>
-            GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3,                           \<br>
-            GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4,                           \<br>
-            GMOCK_ARG_(tn, 5, __VA_ARGS__) gmock_a5,                           \<br>
-            GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6,                           \<br>
-            GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7,                           \<br>
-            GMOCK_ARG_(tn, 8, __VA_ARGS__) gmock_a8,                           \<br>
-            GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9,                           \<br>
-            GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness {             \<br>
-    GTEST_COMPILE_ASSERT_(                                                     \<br>
-        (::testing::tuple_size<tn ::testing::internal::Function<               \<br>
-             __VA_ARGS__>::ArgumentTuple>::value == 10),                       \<br>
-        this_method_does_not_take_10_arguments);                               \<br>
-    GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method);       \<br>
-    return GMOCK_MOCKER_(10, constness, Method)                                \<br>
-        .Invoke(::testing::internal::forward<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(  \<br>
-                    gmock_a1),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(  \<br>
-                    gmock_a2),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(  \<br>
-                    gmock_a3),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(  \<br>
-                    gmock_a4),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(  \<br>
-                    gmock_a5),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(  \<br>
-                    gmock_a6),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(  \<br>
-                    gmock_a7),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(  \<br>
-                    gmock_a8),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(  \<br>
-                    gmock_a9),                                                 \<br>
-                ::testing::internal::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>( \<br>
-                    gmock_a10));                                               \<br>
-  }                                                                            \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \<br>
-      GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1,                             \<br>
-      GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2,                             \<br>
-      GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3,                             \<br>
-      GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4,                             \<br>
-      GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5,                             \<br>
-      GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6,                             \<br>
-      GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7,                             \<br>
-      GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8,                             \<br>
-      GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9,                             \<br>
-      GMOCK_MATCHER_(tn, 10, __VA_ARGS__) gmock_a10) constness {               \<br>
-    GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this);                  \<br>
-    return GMOCK_MOCKER_(10, constness, Method)                                \<br>
-        .With(gmock_a1, gmock_a2, gmock_a3, gmock_a4, gmock_a5, gmock_a6,      \<br>
-              gmock_a7, gmock_a8, gmock_a9, gmock_a10);                        \<br>
-  }                                                                            \<br>
-  ::testing::MockSpec<__VA_ARGS__> gmock_##Method(                             \<br>
-      const ::testing::internal::WithoutMatchers&,                             \<br>
-      constness ::testing::internal::Function<__VA_ARGS__>*) const {           \<br>
-    return ::testing::internal::AdjustConstness_##constness(this)              \<br>
-        ->gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(),       \<br>
-                         ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>());     \<br>
-  }                                                                            \<br>
-  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness,  \<br>
-                                                               Method)<br>
+#define GMOCK_METHOD10_(tn, constness, ct, Method, ...) \<br>
+  static_assert(10 == \<br>
+      ::testing::internal::Function<__VA_ARGS__>::ArgumentCount, \<br>
+      "MOCK_METHOD<N> must match argument count.");\<br>
+  GMOCK_RESULT_(tn, __VA_ARGS__) ct Method( \<br>
+      GMOCK_ARG_(tn, 1, __VA_ARGS__) gmock_a1, GMOCK_ARG_(tn, 2, \<br>
+          __VA_ARGS__) gmock_a2, GMOCK_ARG_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+          GMOCK_ARG_(tn, 4, __VA_ARGS__) gmock_a4, GMOCK_ARG_(tn, 5, \<br>
+          __VA_ARGS__) gmock_a5, GMOCK_ARG_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+          GMOCK_ARG_(tn, 7, __VA_ARGS__) gmock_a7, GMOCK_ARG_(tn, 8, \<br>
+          __VA_ARGS__) gmock_a8, GMOCK_ARG_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
+          GMOCK_ARG_(tn, 10, __VA_ARGS__) gmock_a10) constness { \<br>
+    GMOCK_MOCKER_(10, constness, Method).SetOwnerAndName(this, #Method); \<br>
+    return GMOCK_MOCKER_(10, constness, \<br>
+        Method).Invoke(::std::forward<GMOCK_ARG_(tn, 1, \<br>
+        __VA_ARGS__)>(gmock_a1), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(gmock_a2), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(gmock_a3), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(gmock_a4), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(gmock_a5), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(gmock_a6), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(gmock_a7), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(gmock_a8), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(gmock_a9), \<br>
+  ::std::forward<GMOCK_ARG_(tn, 10, __VA_ARGS__)>(gmock_a10)); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> \<br>
+      gmock_##Method(GMOCK_MATCHER_(tn, 1, __VA_ARGS__) gmock_a1, \<br>
+                     GMOCK_MATCHER_(tn, 2, __VA_ARGS__) gmock_a2, \<br>
+                     GMOCK_MATCHER_(tn, 3, __VA_ARGS__) gmock_a3, \<br>
+                     GMOCK_MATCHER_(tn, 4, __VA_ARGS__) gmock_a4, \<br>
+                     GMOCK_MATCHER_(tn, 5, __VA_ARGS__) gmock_a5, \<br>
+                     GMOCK_MATCHER_(tn, 6, __VA_ARGS__) gmock_a6, \<br>
+                     GMOCK_MATCHER_(tn, 7, __VA_ARGS__) gmock_a7, \<br>
+                     GMOCK_MATCHER_(tn, 8, __VA_ARGS__) gmock_a8, \<br>
+                     GMOCK_MATCHER_(tn, 9, __VA_ARGS__) gmock_a9, \<br>
+                     GMOCK_MATCHER_(tn, 10, \<br>
+                         __VA_ARGS__) gmock_a10) constness { \<br>
+    GMOCK_MOCKER_(10, constness, Method).RegisterOwner(this); \<br>
+    return GMOCK_MOCKER_(10, constness, Method).With(gmock_a1, gmock_a2, \<br>
+        gmock_a3, gmock_a4, gmock_a5, gmock_a6, gmock_a7, gmock_a8, gmock_a9, \<br>
+        gmock_a10); \<br>
+  } \<br>
+  ::testing::MockSpec<__VA_ARGS__> gmock_##Method( \<br>
+      const ::testing::internal::WithoutMatchers&, \<br>
+      constness ::testing::internal::Function<__VA_ARGS__>* ) const { \<br>
+        return ::testing::internal::AdjustConstness_##constness(this)-> \<br>
+            gmock_##Method(::testing::A<GMOCK_ARG_(tn, 1, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 2, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 3, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 4, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 5, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 6, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 7, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 8, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 9, __VA_ARGS__)>(), \<br>
+                     ::testing::A<GMOCK_ARG_(tn, 10, __VA_ARGS__)>()); \<br>
+      } \<br>
+  mutable ::testing::FunctionMocker<__VA_ARGS__> GMOCK_MOCKER_(10, constness, \<br>
+      Method)<br>
<br>
 #define MOCK_METHOD0(m, ...) GMOCK_METHOD0_(, , , m, __VA_ARGS__)<br>
 #define MOCK_METHOD1(m, ...) GMOCK_METHOD1_(, , , m, __VA_ARGS__)<br>
@@ -1100,283 +749,6 @@ using internal::FunctionMocker;<br>
 #define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \<br>
     GMOCK_METHOD10_(typename, const, ct, m, __VA_ARGS__)<br>
<br>
-// A MockFunction<F> class has one mock method whose type is F.  It is<br>
-// useful when you just want your test code to emit some messages and<br>
-// have Google Mock verify the right messages are sent (and perhaps at<br>
-// the right times).  For example, if you are exercising code:<br>
-//<br>
-//   Foo(1);<br>
-//   Foo(2);<br>
-//   Foo(3);<br>
-//<br>
-// and want to verify that Foo(1) and Foo(3) both invoke<br>
-// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:<br>
-//<br>
-// TEST(FooTest, InvokesBarCorrectly) {<br>
-//   MyMock mock;<br>
-//   MockFunction<void(string check_point_name)> check;<br>
-//   {<br>
-//     InSequence s;<br>
-//<br>
-//     EXPECT_CALL(mock, Bar("a"));<br>
-//     EXPECT_CALL(check, Call("1"));<br>
-//     EXPECT_CALL(check, Call("2"));<br>
-//     EXPECT_CALL(mock, Bar("a"));<br>
-//   }<br>
-//   Foo(1);<br>
-//   check.Call("1");<br>
-//   Foo(2);<br>
-//   check.Call("2");<br>
-//   Foo(3);<br>
-// }<br>
-//<br>
-// The expectation spec says that the first Bar("a") must happen<br>
-// before check point "1", the second Bar("a") must happen after check<br>
-// point "2", and nothing should happen between the two check<br>
-// points. The explicit check points make it easy to tell which<br>
-// Bar("a") is called by which call to Foo().<br>
-//<br>
-// MockFunction<F> can also be used to exercise code that accepts<br>
-// std::function<F> callbacks. To do so, use AsStdFunction() method<br>
-// to create std::function proxy forwarding to original object's Call.<br>
-// Example:<br>
-//<br>
-// TEST(FooTest, RunsCallbackWithBarArgument) {<br>
-//   MockFunction<int(string)> callback;<br>
-//   EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));<br>
-//   Foo(callback.AsStdFunction());<br>
-// }<br>
-template <typename F><br>
-class MockFunction;<br>
-<br>
-template <typename R><br>
-class MockFunction<R()> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD0_T(Call, R());<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R()> AsStdFunction() {<br>
-    return [this]() -> R {<br>
-      return this->Call();<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0><br>
-class MockFunction<R(A0)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD1_T(Call, R(A0));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0)> AsStdFunction() {<br>
-    return [this](A0 a0) -> R {<br>
-      return this->Call(::std::move(a0));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1><br>
-class MockFunction<R(A0, A1)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD2_T(Call, R(A0, A1));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2><br>
-class MockFunction<R(A0, A1, A2)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD3_T(Call, R(A0, A1, A2));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3><br>
-class MockFunction<R(A0, A1, A2, A3)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD4_T(Call, R(A0, A1, A2, A3));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4><br>
-class MockFunction<R(A0, A1, A2, A3, A4)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD5_T(Call, R(A0, A1, A2, A3, A4));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4, typename A5><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD6_T(Call, R(A0, A1, A2, A3, A4, A5));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4, A5)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4), ::std::move(a5));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4, typename A5, typename A6><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD7_T(Call, R(A0, A1, A2, A3, A4, A5, A6));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4, A5, A6)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4, typename A5, typename A6, typename A7><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD8_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
-          ::std::move(a7));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4, typename A5, typename A6, typename A7, typename A8><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD9_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,<br>
-        A8 a8) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
-          ::std::move(a7), ::std::move(a8));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
-template <typename R, typename A0, typename A1, typename A2, typename A3,<br>
-    typename A4, typename A5, typename A6, typename A7, typename A8,<br>
-    typename A9><br>
-class MockFunction<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
- public:<br>
-  MockFunction() {}<br>
-<br>
-  MOCK_METHOD10_T(Call, R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9));<br>
-<br>
-#if GTEST_HAS_STD_FUNCTION_<br>
-  ::std::function<R(A0, A1, A2, A3, A4, A5, A6, A7, A8, A9)> AsStdFunction() {<br>
-    return [this](A0 a0, A1 a1, A2 a2, A3 a3, A4 a4, A5 a5, A6 a6, A7 a7,<br>
-        A8 a8, A9 a9) -> R {<br>
-      return this->Call(::std::move(a0), ::std::move(a1), ::std::move(a2),<br>
-          ::std::move(a3), ::std::move(a4), ::std::move(a5), ::std::move(a6),<br>
-          ::std::move(a7), ::std::move(a8), ::std::move(a9));<br>
-    };<br>
-  }<br>
-#endif  // GTEST_HAS_STD_FUNCTION_<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFunction);<br>
-};<br>
-<br>
 }  // namespace testing<br>
<br>
 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
index 94460cbe77819..48ea9358d7c67 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-matchers.h<br>
@@ -45,1131 +45,10 @@<br>
 #include <iterator><br>
 #include <sstream><br>
 #include <string><br>
+#include <utility><br>
 #include <vector><br>
 #include "gmock/gmock-matchers.h"<br>
<br>
-namespace testing {<br>
-namespace internal {<br>
-<br>
-// The type of the i-th (0-based) field of Tuple.<br>
-#define GMOCK_FIELD_TYPE_(Tuple, i) \<br>
-    typename ::testing::tuple_element<i, Tuple>::type<br>
-<br>
-// TupleFields<Tuple, k0, ..., kn> is for selecting fields from a<br>
-// tuple of type Tuple.  It has two members:<br>
-//<br>
-//   type: a tuple type whose i-th field is the ki-th field of Tuple.<br>
-//   GetSelectedFields(t): returns fields k0, ..., and kn of t as a tuple.<br>
-//<br>
-// For example, in class TupleFields<tuple<bool, char, int>, 2, 0>, we have:<br>
-//<br>
-//   type is tuple<int, bool>, and<br>
-//   GetSelectedFields(make_tuple(true, 'a', 42)) is (42, true).<br>
-<br>
-template <class Tuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,<br>
-    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
-    int k9 = -1><br>
-class TupleFields;<br>
-<br>
-// This generic version is used when there are 10 selectors.<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
-    int k7, int k8, int k9><br>
-class TupleFields {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k9)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
-        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t), get<k9>(t));<br>
-  }<br>
-};<br>
-<br>
-// The following specialization is used for 0 ~ 9 selectors.<br>
-<br>
-template <class Tuple><br>
-class TupleFields<Tuple, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<> type;<br>
-  static type GetSelectedFields(const Tuple& /* t */) {<br>
-    return type();<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0><br>
-class TupleFields<Tuple, k0, -1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1><br>
-class TupleFields<Tuple, k0, k1, -1, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2><br>
-class TupleFields<Tuple, k0, k1, k2, -1, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3><br>
-class TupleFields<Tuple, k0, k1, k2, k3, -1, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, -1, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, -1, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k5)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
-        get<k5>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, -1, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
-        get<k5>(t), get<k6>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
-    int k7><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, -1, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k7)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
-        get<k5>(t), get<k6>(t), get<k7>(t));<br>
-  }<br>
-};<br>
-<br>
-template <class Tuple, int k0, int k1, int k2, int k3, int k4, int k5, int k6,<br>
-    int k7, int k8><br>
-class TupleFields<Tuple, k0, k1, k2, k3, k4, k5, k6, k7, k8, -1> {<br>
- public:<br>
-  typedef ::testing::tuple<GMOCK_FIELD_TYPE_(Tuple, k0),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k1), GMOCK_FIELD_TYPE_(Tuple, k2),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k3), GMOCK_FIELD_TYPE_(Tuple, k4),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k5), GMOCK_FIELD_TYPE_(Tuple, k6),<br>
-      GMOCK_FIELD_TYPE_(Tuple, k7), GMOCK_FIELD_TYPE_(Tuple, k8)> type;<br>
-  static type GetSelectedFields(const Tuple& t) {<br>
-    return type(get<k0>(t), get<k1>(t), get<k2>(t), get<k3>(t), get<k4>(t),<br>
-        get<k5>(t), get<k6>(t), get<k7>(t), get<k8>(t));<br>
-  }<br>
-};<br>
-<br>
-#undef GMOCK_FIELD_TYPE_<br>
-<br>
-// Implements the Args() matcher.<br>
-template <class ArgsTuple, int k0 = -1, int k1 = -1, int k2 = -1, int k3 = -1,<br>
-    int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1, int k8 = -1,<br>
-    int k9 = -1><br>
-class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {<br>
- public:<br>
-  // ArgsTuple may have top-level const or reference modifiers.<br>
-  typedef GTEST_REMOVE_REFERENCE_AND_CONST_(ArgsTuple) RawArgsTuple;<br>
-  typedef typename internal::TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5,<br>
-      k6, k7, k8, k9>::type SelectedArgs;<br>
-  typedef Matcher<const SelectedArgs&> MonomorphicInnerMatcher;<br>
-<br>
-  template <typename InnerMatcher><br>
-  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)<br>
-      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}<br>
-<br>
-  virtual bool MatchAndExplain(ArgsTuple args,<br>
-                               MatchResultListener* listener) const {<br>
-    const SelectedArgs& selected_args = GetSelectedArgs(args);<br>
-    if (!listener->IsInterested())<br>
-      return inner_matcher_.Matches(selected_args);<br>
-<br>
-    PrintIndices(listener->stream());<br>
-    *listener << "are " << PrintToString(selected_args);<br>
-<br>
-    StringMatchResultListener inner_listener;<br>
-    const bool match = inner_matcher_.MatchAndExplain(selected_args,<br>
-                                                      &inner_listener);<br>
-    PrintIfNotEmpty(inner_listener.str(), listener->stream());<br>
-    return match;<br>
-  }<br>
-<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
-    *os << "are a tuple ";<br>
-    PrintIndices(os);<br>
-    inner_matcher_.DescribeTo(os);<br>
-  }<br>
-<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
-    *os << "are a tuple ";<br>
-    PrintIndices(os);<br>
-    inner_matcher_.DescribeNegationTo(os);<br>
-  }<br>
-<br>
- private:<br>
-  static SelectedArgs GetSelectedArgs(ArgsTuple args) {<br>
-    return TupleFields<RawArgsTuple, k0, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-        k9>::GetSelectedFields(args);<br>
-  }<br>
-<br>
-  // Prints the indices of the selected fields.<br>
-  static void PrintIndices(::std::ostream* os) {<br>
-    *os << "whose fields (";<br>
-    const int indices[10] = { k0, k1, k2, k3, k4, k5, k6, k7, k8, k9 };<br>
-    for (int i = 0; i < 10; i++) {<br>
-      if (indices[i] < 0)<br>
-        break;<br>
-<br>
-      if (i >= 1)<br>
-        *os << ", ";<br>
-<br>
-      *os << "#" << indices[i];<br>
-    }<br>
-    *os << ") ";<br>
-  }<br>
-<br>
-  const MonomorphicInnerMatcher inner_matcher_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(ArgsMatcherImpl);<br>
-};<br>
-<br>
-template <class InnerMatcher, int k0 = -1, int k1 = -1, int k2 = -1,<br>
-    int k3 = -1, int k4 = -1, int k5 = -1, int k6 = -1, int k7 = -1,<br>
-    int k8 = -1, int k9 = -1><br>
-class ArgsMatcher {<br>
- public:<br>
-  explicit ArgsMatcher(const InnerMatcher& inner_matcher)<br>
-      : inner_matcher_(inner_matcher) {}<br>
-<br>
-  template <typename ArgsTuple><br>
-  operator Matcher<ArgsTuple>() const {<br>
-    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k0, k1, k2, k3, k4, k5,<br>
-        k6, k7, k8, k9>(inner_matcher_));<br>
-  }<br>
-<br>
- private:<br>
-  const InnerMatcher inner_matcher_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(ArgsMatcher);<br>
-};<br>
-<br>
-// A set of metafunctions for computing the result type of AllOf.<br>
-// AllOf(m1, ..., mN) returns<br>
-// AllOfResultN<decltype(m1), ..., decltype(mN)>::type.<br>
-<br>
-// Although AllOf isn't defined for one argument, AllOfResult1 is defined<br>
-// to simplify the implementation.<br>
-template <typename M1><br>
-struct AllOfResult1 {<br>
-  typedef M1 type;<br>
-};<br>
-<br>
-template <typename M1, typename M2><br>
-struct AllOfResult2 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult1<M1>::type,<br>
-      typename AllOfResult1<M2>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-struct AllOfResult3 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult1<M1>::type,<br>
-      typename AllOfResult2<M2, M3>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-struct AllOfResult4 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult2<M1, M2>::type,<br>
-      typename AllOfResult2<M3, M4>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-struct AllOfResult5 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult2<M1, M2>::type,<br>
-      typename AllOfResult3<M3, M4, M5>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6><br>
-struct AllOfResult6 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult3<M1, M2, M3>::type,<br>
-      typename AllOfResult3<M4, M5, M6>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7><br>
-struct AllOfResult7 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult3<M1, M2, M3>::type,<br>
-      typename AllOfResult4<M4, M5, M6, M7>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8><br>
-struct AllOfResult8 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult4<M1, M2, M3, M4>::type,<br>
-      typename AllOfResult4<M5, M6, M7, M8>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9><br>
-struct AllOfResult9 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult4<M1, M2, M3, M4>::type,<br>
-      typename AllOfResult5<M5, M6, M7, M8, M9>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9, typename M10><br>
-struct AllOfResult10 {<br>
-  typedef BothOfMatcher<<br>
-      typename AllOfResult5<M1, M2, M3, M4, M5>::type,<br>
-      typename AllOfResult5<M6, M7, M8, M9, M10>::type<br>
-  > type;<br>
-};<br>
-<br>
-// A set of metafunctions for computing the result type of AnyOf.<br>
-// AnyOf(m1, ..., mN) returns<br>
-// AnyOfResultN<decltype(m1), ..., decltype(mN)>::type.<br>
-<br>
-// Although AnyOf isn't defined for one argument, AnyOfResult1 is defined<br>
-// to simplify the implementation.<br>
-template <typename M1><br>
-struct AnyOfResult1 {<br>
-  typedef M1 type;<br>
-};<br>
-<br>
-template <typename M1, typename M2><br>
-struct AnyOfResult2 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult1<M1>::type,<br>
-      typename AnyOfResult1<M2>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-struct AnyOfResult3 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult1<M1>::type,<br>
-      typename AnyOfResult2<M2, M3>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-struct AnyOfResult4 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult2<M1, M2>::type,<br>
-      typename AnyOfResult2<M3, M4>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-struct AnyOfResult5 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult2<M1, M2>::type,<br>
-      typename AnyOfResult3<M3, M4, M5>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6><br>
-struct AnyOfResult6 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult3<M1, M2, M3>::type,<br>
-      typename AnyOfResult3<M4, M5, M6>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7><br>
-struct AnyOfResult7 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult3<M1, M2, M3>::type,<br>
-      typename AnyOfResult4<M4, M5, M6, M7>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8><br>
-struct AnyOfResult8 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult4<M1, M2, M3, M4>::type,<br>
-      typename AnyOfResult4<M5, M6, M7, M8>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9><br>
-struct AnyOfResult9 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult4<M1, M2, M3, M4>::type,<br>
-      typename AnyOfResult5<M5, M6, M7, M8, M9>::type<br>
-  > type;<br>
-};<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9, typename M10><br>
-struct AnyOfResult10 {<br>
-  typedef EitherOfMatcher<<br>
-      typename AnyOfResult5<M1, M2, M3, M4, M5>::type,<br>
-      typename AnyOfResult5<M6, M7, M8, M9, M10>::type<br>
-  > type;<br>
-};<br>
-<br>
-}  // namespace internal<br>
-<br>
-// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected<br>
-// fields of it matches a_matcher.  C++ doesn't support default<br>
-// arguments for function templates, so we have to overload it.<br>
-template <typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher>(matcher);<br>
-}<br>
-<br>
-template <int k1, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7,<br>
-    typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6,<br>
-      k7>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7,<br>
-      k8>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    int k9, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-      k9>(matcher);<br>
-}<br>
-<br>
-template <int k1, int k2, int k3, int k4, int k5, int k6, int k7, int k8,<br>
-    int k9, int k10, typename InnerMatcher><br>
-inline internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8, k9,<br>
-    k10><br>
-Args(const InnerMatcher& matcher) {<br>
-  return internal::ArgsMatcher<InnerMatcher, k1, k2, k3, k4, k5, k6, k7, k8,<br>
-      k9, k10>(matcher);<br>
-}<br>
-<br>
-// ElementsAre(e_1, e_2, ... e_n) matches an STL-style container with<br>
-// n elements, where the i-th element in the container must<br>
-// match the i-th argument in the list.  Each argument of<br>
-// ElementsAre() can be either a value or a matcher.  We support up to<br>
-// 10 arguments.<br>
-//<br>
-// The use of DecayArray in the implementation allows ElementsAre()<br>
-// to accept string literals, whose type is const char[N], but we<br>
-// want to treat them as const char*.<br>
-//<br>
-// NOTE: Since ElementsAre() cares about the order of the elements, it<br>
-// must not be used with containers whose elements's order is<br>
-// undefined (e.g. hash_map).<br>
-<br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<> ><br>
-ElementsAre() {<br>
-  typedef ::testing::tuple<> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args());<br>
-}<br>
-<br>
-template <typename T1><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type> ><br>
-ElementsAre(const T1& e1) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1));<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
-      e8));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type,<br>
-        typename internal::DecayArray<T9>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type,<br>
-      typename internal::DecayArray<T9>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
-      e8, e9));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10><br>
-inline internal::ElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type,<br>
-        typename internal::DecayArray<T9>::type,<br>
-        typename internal::DecayArray<T10>::type> ><br>
-ElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,<br>
-    const T10& e10) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type,<br>
-      typename internal::DecayArray<T9>::type,<br>
-      typename internal::DecayArray<T10>::type> Args;<br>
-  return internal::ElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5, e6, e7,<br>
-      e8, e9, e10));<br>
-}<br>
-<br>
-// UnorderedElementsAre(e_1, e_2, ..., e_n) is an ElementsAre extension<br>
-// that matches n elements in any order.  We support up to n=10 arguments.<br>
-//<br>
-// If you have >10 elements, consider UnorderedElementsAreArray() or<br>
-// UnorderedPointwise() instead.<br>
-<br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<> ><br>
-UnorderedElementsAre() {<br>
-  typedef ::testing::tuple<> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args());<br>
-}<br>
-<br>
-template <typename T1><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type> ><br>
-UnorderedElementsAre(const T1& e1) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1));<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
-      e6));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
-      e6, e7));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
-      e6, e7, e8));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type,<br>
-        typename internal::DecayArray<T9>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type,<br>
-      typename internal::DecayArray<T9>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
-      e6, e7, e8, e9));<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10><br>
-inline internal::UnorderedElementsAreMatcher<<br>
-    ::testing::tuple<<br>
-        typename internal::DecayArray<T1>::type,<br>
-        typename internal::DecayArray<T2>::type,<br>
-        typename internal::DecayArray<T3>::type,<br>
-        typename internal::DecayArray<T4>::type,<br>
-        typename internal::DecayArray<T5>::type,<br>
-        typename internal::DecayArray<T6>::type,<br>
-        typename internal::DecayArray<T7>::type,<br>
-        typename internal::DecayArray<T8>::type,<br>
-        typename internal::DecayArray<T9>::type,<br>
-        typename internal::DecayArray<T10>::type> ><br>
-UnorderedElementsAre(const T1& e1, const T2& e2, const T3& e3, const T4& e4,<br>
-    const T5& e5, const T6& e6, const T7& e7, const T8& e8, const T9& e9,<br>
-    const T10& e10) {<br>
-  typedef ::testing::tuple<<br>
-      typename internal::DecayArray<T1>::type,<br>
-      typename internal::DecayArray<T2>::type,<br>
-      typename internal::DecayArray<T3>::type,<br>
-      typename internal::DecayArray<T4>::type,<br>
-      typename internal::DecayArray<T5>::type,<br>
-      typename internal::DecayArray<T6>::type,<br>
-      typename internal::DecayArray<T7>::type,<br>
-      typename internal::DecayArray<T8>::type,<br>
-      typename internal::DecayArray<T9>::type,<br>
-      typename internal::DecayArray<T10>::type> Args;<br>
-  return internal::UnorderedElementsAreMatcher<Args>(Args(e1, e2, e3, e4, e5,<br>
-      e6, e7, e8, e9, e10));<br>
-}<br>
-<br>
-// AllOf(m1, m2, ..., mk) matches any value that matches all of the given<br>
-// sub-matchers.  AllOf is called fully qualified to prevent ADL from firing.<br>
-<br>
-template <typename M1, typename M2><br>
-inline typename internal::AllOfResult2<M1, M2>::type<br>
-AllOf(M1 m1, M2 m2) {<br>
-  return typename internal::AllOfResult2<M1, M2>::type(<br>
-      m1,<br>
-      m2);<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-inline typename internal::AllOfResult3<M1, M2, M3>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3) {<br>
-  return typename internal::AllOfResult3<M1, M2, M3>::type(<br>
-      m1,<br>
-      ::testing::AllOf(m2, m3));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-inline typename internal::AllOfResult4<M1, M2, M3, M4>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4) {<br>
-  return typename internal::AllOfResult4<M1, M2, M3, M4>::type(<br>
-      ::testing::AllOf(m1, m2),<br>
-      ::testing::AllOf(m3, m4));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-inline typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {<br>
-  return typename internal::AllOfResult5<M1, M2, M3, M4, M5>::type(<br>
-      ::testing::AllOf(m1, m2),<br>
-      ::testing::AllOf(m3, m4, m5));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6><br>
-inline typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {<br>
-  return typename internal::AllOfResult6<M1, M2, M3, M4, M5, M6>::type(<br>
-      ::testing::AllOf(m1, m2, m3),<br>
-      ::testing::AllOf(m4, m5, m6));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7><br>
-inline typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {<br>
-  return typename internal::AllOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(<br>
-      ::testing::AllOf(m1, m2, m3),<br>
-      ::testing::AllOf(m4, m5, m6, m7));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8><br>
-inline typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {<br>
-  return typename internal::AllOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(<br>
-      ::testing::AllOf(m1, m2, m3, m4),<br>
-      ::testing::AllOf(m5, m6, m7, m8));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9><br>
-inline typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {<br>
-  return typename internal::AllOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,<br>
-      M9>::type(<br>
-      ::testing::AllOf(m1, m2, m3, m4),<br>
-      ::testing::AllOf(m5, m6, m7, m8, m9));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9, typename M10><br>
-inline typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
-    M10>::type<br>
-AllOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
-  return typename internal::AllOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
-      M10>::type(<br>
-      ::testing::AllOf(m1, m2, m3, m4, m5),<br>
-      ::testing::AllOf(m6, m7, m8, m9, m10));<br>
-}<br>
-<br>
-// AnyOf(m1, m2, ..., mk) matches any value that matches any of the given<br>
-// sub-matchers.  AnyOf is called fully qualified to prevent ADL from firing.<br>
-<br>
-template <typename M1, typename M2><br>
-inline typename internal::AnyOfResult2<M1, M2>::type<br>
-AnyOf(M1 m1, M2 m2) {<br>
-  return typename internal::AnyOfResult2<M1, M2>::type(<br>
-      m1,<br>
-      m2);<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3><br>
-inline typename internal::AnyOfResult3<M1, M2, M3>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3) {<br>
-  return typename internal::AnyOfResult3<M1, M2, M3>::type(<br>
-      m1,<br>
-      ::testing::AnyOf(m2, m3));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4><br>
-inline typename internal::AnyOfResult4<M1, M2, M3, M4>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4) {<br>
-  return typename internal::AnyOfResult4<M1, M2, M3, M4>::type(<br>
-      ::testing::AnyOf(m1, m2),<br>
-      ::testing::AnyOf(m3, m4));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5><br>
-inline typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5) {<br>
-  return typename internal::AnyOfResult5<M1, M2, M3, M4, M5>::type(<br>
-      ::testing::AnyOf(m1, m2),<br>
-      ::testing::AnyOf(m3, m4, m5));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6><br>
-inline typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6) {<br>
-  return typename internal::AnyOfResult6<M1, M2, M3, M4, M5, M6>::type(<br>
-      ::testing::AnyOf(m1, m2, m3),<br>
-      ::testing::AnyOf(m4, m5, m6));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7><br>
-inline typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7) {<br>
-  return typename internal::AnyOfResult7<M1, M2, M3, M4, M5, M6, M7>::type(<br>
-      ::testing::AnyOf(m1, m2, m3),<br>
-      ::testing::AnyOf(m4, m5, m6, m7));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8><br>
-inline typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8) {<br>
-  return typename internal::AnyOfResult8<M1, M2, M3, M4, M5, M6, M7, M8>::type(<br>
-      ::testing::AnyOf(m1, m2, m3, m4),<br>
-      ::testing::AnyOf(m5, m6, m7, m8));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9><br>
-inline typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8, M9>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9) {<br>
-  return typename internal::AnyOfResult9<M1, M2, M3, M4, M5, M6, M7, M8,<br>
-      M9>::type(<br>
-      ::testing::AnyOf(m1, m2, m3, m4),<br>
-      ::testing::AnyOf(m5, m6, m7, m8, m9));<br>
-}<br>
-<br>
-template <typename M1, typename M2, typename M3, typename M4, typename M5,<br>
-    typename M6, typename M7, typename M8, typename M9, typename M10><br>
-inline typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
-    M10>::type<br>
-AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
-  return typename internal::AnyOfResult10<M1, M2, M3, M4, M5, M6, M7, M8, M9,<br>
-      M10>::type(<br>
-      ::testing::AnyOf(m1, m2, m3, m4, m5),<br>
-      ::testing::AnyOf(m6, m7, m8, m9, m10));<br>
-}<br>
-<br>
-}  // namespace testing<br>
-<br>
-<br>
 // The MATCHER* family of macros can be used in a namespace scope to<br>
 // define custom matchers easily.<br>
 //<br>
@@ -1373,18 +252,15 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
 // overloading matchers based on parameter types (as opposed to just<br>
 // based on the number of parameters).<br>
 //<br>
-// MATCHER*() can only be used in a namespace scope.  The reason is<br>
-// that C++ doesn't yet allow function-local types to be used to<br>
-// instantiate templates.  The up-coming C++0x standard will fix this.<br>
-// Once that's done, we'll consider supporting using MATCHER*() inside<br>
-// a function.<br>
+// MATCHER*() can only be used in a namespace scope as templates cannot be<br>
+// declared inside of a local class.<br>
 //<br>
 // More Information<br>
 // ================<br>
 //<br>
 // To learn more about using these macros, please search for 'MATCHER'<br>
 // on<br>
-// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md</a><br>
+// <a href="https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md</a><br>
<br>
 #define MATCHER(name, description)\<br>
   class name##Matcher {\<br>
@@ -1407,12 +283,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<>()));\<br>
+                ::std::tuple<>()));\<br>
       }\<br>
     };\<br>
     template <typename arg_type>\<br>
@@ -1442,7 +319,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
      public:\<br>
       explicit gmock_Impl(p0##_type gmock_p0)\<br>
-           : p0(::testing::internal::move(gmock_p0)) {}\<br>
+           : p0(::std::move(gmock_p0)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1456,12 +333,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type>(p0)));\<br>
+                ::std::tuple<p0##_type>(p0)));\<br>
       }\<br>
     };\<br>
     template <typename arg_type>\<br>
@@ -1469,8 +347,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
       return ::testing::Matcher<arg_type>(\<br>
           new gmock_Impl<arg_type>(p0));\<br>
     }\<br>
-    explicit name##MatcherP(p0##_type gmock_p0) : \<br>
-        p0(::testing::internal::move(gmock_p0)) {\<br>
+    explicit name##MatcherP(p0##_type gmock_p0) : p0(::std::move(gmock_p0)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
    private:\<br>
@@ -1495,8 +372,7 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
      public:\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1511,12 +387,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type>(p0, p1)));\<br>
+                ::std::tuple<p0##_type, p1##_type>(p0, p1)));\<br>
       }\<br>
     };\<br>
     template <typename arg_type>\<br>
@@ -1525,8 +402,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
           new gmock_Impl<arg_type>(p0, p1));\<br>
     }\<br>
     name##MatcherP2(p0##_type gmock_p0, \<br>
-        p1##_type gmock_p1) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)) {\<br>
+        p1##_type gmock_p1) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1554,9 +431,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
         GTEST_REFERENCE_TO_CONST_(arg_type)> {\<br>
      public:\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1572,13 +448,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, \<br>
-                    p2)));\<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type>(p0, p1, p2)));\<br>
       }\<br>
     };\<br>
     template <typename arg_type>\<br>
@@ -1587,9 +463,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
           new gmock_Impl<arg_type>(p0, p1, p2));\<br>
     }\<br>
     name##MatcherP3(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
-        p2##_type gmock_p2) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)) {\<br>
+        p2##_type gmock_p2) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1620,10 +495,8 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      public:\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1640,13 +513,14 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, \<br>
-                    p3##_type>(p0, p1, p2, p3)));\<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type>(p0, \<br>
+                    p1, p2, p3)));\<br>
       }\<br>
     };\<br>
     template <typename arg_type>\<br>
@@ -1655,11 +529,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
           new gmock_Impl<arg_type>(p0, p1, p2, p3));\<br>
     }\<br>
     name##MatcherP4(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
-        p2##_type gmock_p2, \<br>
-        p3##_type gmock_p3) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)) {\<br>
+        p2##_type gmock_p2, p3##_type gmock_p3) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1695,11 +567,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      public:\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1717,12 +587,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type>(p0, p1, p2, p3, p4)));\<br>
       }\<br>
     };\<br>
@@ -1733,11 +604,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     }\<br>
     name##MatcherP5(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, \<br>
-        p4##_type gmock_p4) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)) {\<br>
+        p4##_type gmock_p4) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1774,12 +643,9 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      public:\<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)), \<br>
-               p5(::testing::internal::move(gmock_p5)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1798,12 +664,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type, p5##_type>(p0, p1, p2, p3, p4, p5)));\<br>
       }\<br>
     };\<br>
@@ -1814,12 +681,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     }\<br>
     name##MatcherP6(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
-        p5##_type gmock_p5) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)) {\<br>
+        p5##_type gmock_p5) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1859,13 +724,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)), \<br>
-               p5(::testing::internal::move(gmock_p5)), \<br>
-               p6(::testing::internal::move(gmock_p6)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+               p6(::std::move(gmock_p6)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1885,12 +747,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type, p5##_type, p6##_type>(p0, p1, p2, p3, p4, p5, \<br>
                     p6)));\<br>
       }\<br>
@@ -1902,14 +765,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     }\<br>
     name##MatcherP7(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
-        p5##_type gmock_p5, \<br>
-        p6##_type gmock_p6) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)) {\<br>
+        p5##_type gmock_p5, p6##_type gmock_p6) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -1953,14 +812,10 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, p7##_type gmock_p7)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)), \<br>
-               p5(::testing::internal::move(gmock_p5)), \<br>
-               p6(::testing::internal::move(gmock_p6)), \<br>
-               p7(::testing::internal::move(gmock_p7)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+               p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -1981,12 +836,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type, p5##_type, p6##_type, p7##_type>(p0, p1, p2, \<br>
                     p3, p4, p5, p6, p7)));\<br>
       }\<br>
@@ -1999,14 +855,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     name##MatcherP8(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, \<br>
-        p7##_type gmock_p7) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7)) {\<br>
+        p7##_type gmock_p7) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -2053,15 +906,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
       gmock_Impl(p0##_type gmock_p0, p1##_type gmock_p1, p2##_type gmock_p2, \<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)), \<br>
-               p5(::testing::internal::move(gmock_p5)), \<br>
-               p6(::testing::internal::move(gmock_p6)), \<br>
-               p7(::testing::internal::move(gmock_p7)), \<br>
-               p8(::testing::internal::move(gmock_p8)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+               p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \<br>
+               p8(::std::move(gmock_p8)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -2083,12 +932,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type, p5##_type, p6##_type, p7##_type, \<br>
                     p8##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8)));\<br>
       }\<br>
@@ -2101,15 +951,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     name##MatcherP9(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
-        p8##_type gmock_p8) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7)), \<br>
-        p8(::testing::internal::move(gmock_p8)) {\<br>
+        p8##_type gmock_p8) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
@@ -2160,16 +1006,11 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
           p3##_type gmock_p3, p4##_type gmock_p4, p5##_type gmock_p5, \<br>
           p6##_type gmock_p6, p7##_type gmock_p7, p8##_type gmock_p8, \<br>
           p9##_type gmock_p9)\<br>
-           : p0(::testing::internal::move(gmock_p0)), \<br>
-               p1(::testing::internal::move(gmock_p1)), \<br>
-               p2(::testing::internal::move(gmock_p2)), \<br>
-               p3(::testing::internal::move(gmock_p3)), \<br>
-               p4(::testing::internal::move(gmock_p4)), \<br>
-               p5(::testing::internal::move(gmock_p5)), \<br>
-               p6(::testing::internal::move(gmock_p6)), \<br>
-               p7(::testing::internal::move(gmock_p7)), \<br>
-               p8(::testing::internal::move(gmock_p8)), \<br>
-               p9(::testing::internal::move(gmock_p9)) {}\<br>
+           : p0(::std::move(gmock_p0)), p1(::std::move(gmock_p1)), \<br>
+               p2(::std::move(gmock_p2)), p3(::std::move(gmock_p3)), \<br>
+               p4(::std::move(gmock_p4)), p5(::std::move(gmock_p5)), \<br>
+               p6(::std::move(gmock_p6)), p7(::std::move(gmock_p7)), \<br>
+               p8(::std::move(gmock_p8)), p9(::std::move(gmock_p9)) {}\<br>
       virtual bool MatchAndExplain(\<br>
           GTEST_REFERENCE_TO_CONST_(arg_type) arg,\<br>
           ::testing::MatchResultListener* result_listener) const;\<br>
@@ -2192,12 +1033,13 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
      private:\<br>
       ::std::string FormatDescription(bool negation) const {\<br>
         ::std::string gmock_description = (description);\<br>
-        if (!gmock_description.empty())\<br>
+        if (!gmock_description.empty()) {\<br>
           return gmock_description;\<br>
+        }\<br>
         return ::testing::internal::FormatMatcherDescription(\<br>
             negation, #name, \<br>
             ::testing::internal::UniversalTersePrintTupleFieldsToStrings(\<br>
-                ::testing::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
+                ::std::tuple<p0##_type, p1##_type, p2##_type, p3##_type, \<br>
                     p4##_type, p5##_type, p6##_type, p7##_type, p8##_type, \<br>
                     p9##_type>(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9)));\<br>
       }\<br>
@@ -2210,17 +1052,12 @@ AnyOf(M1 m1, M2 m2, M3 m3, M4 m4, M5 m5, M6 m6, M7 m7, M8 m8, M9 m9, M10 m10) {<br>
     name##MatcherP10(p0##_type gmock_p0, p1##_type gmock_p1, \<br>
         p2##_type gmock_p2, p3##_type gmock_p3, p4##_type gmock_p4, \<br>
         p5##_type gmock_p5, p6##_type gmock_p6, p7##_type gmock_p7, \<br>
-        p8##_type gmock_p8, \<br>
-        p9##_type gmock_p9) : p0(::testing::internal::move(gmock_p0)), \<br>
-        p1(::testing::internal::move(gmock_p1)), \<br>
-        p2(::testing::internal::move(gmock_p2)), \<br>
-        p3(::testing::internal::move(gmock_p3)), \<br>
-        p4(::testing::internal::move(gmock_p4)), \<br>
-        p5(::testing::internal::move(gmock_p5)), \<br>
-        p6(::testing::internal::move(gmock_p6)), \<br>
-        p7(::testing::internal::move(gmock_p7)), \<br>
-        p8(::testing::internal::move(gmock_p8)), \<br>
-        p9(::testing::internal::move(gmock_p9)) {\<br>
+        p8##_type gmock_p8, p9##_type gmock_p9) : p0(::std::move(gmock_p0)), \<br>
+        p1(::std::move(gmock_p1)), p2(::std::move(gmock_p2)), \<br>
+        p3(::std::move(gmock_p3)), p4(::std::move(gmock_p4)), \<br>
+        p5(::std::move(gmock_p5)), p6(::std::move(gmock_p6)), \<br>
+        p7(::std::move(gmock_p7)), p8(::std::move(gmock_p8)), \<br>
+        p9(::std::move(gmock_p9)) {\<br>
     }\<br>
     p0##_type const p0;\<br>
     p1##_type const p1;\<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
deleted file mode 100644<br>
index fe3ee69cef925..0000000000000<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-generated-nice-strict.h<br>
+++ /dev/null<br>
@@ -1,461 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-//     pump.py gmock-generated-nice-strict.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2008, Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-//     * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-//     * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-//     * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Implements class templates NiceMock, NaggyMock, and StrictMock.<br>
-//<br>
-// Given a mock class MockFoo that is created using Google Mock,<br>
-// NiceMock<MockFoo> is a subclass of MockFoo that allows<br>
-// uninteresting calls (i.e. calls to mock methods that have no<br>
-// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo<br>
-// that prints a warning when an uninteresting call occurs, and<br>
-// StrictMock<MockFoo> is a subclass of MockFoo that treats all<br>
-// uninteresting calls as errors.<br>
-//<br>
-// Currently a mock is naggy by default, so MockFoo and<br>
-// NaggyMock<MockFoo> behave like the same.  However, we will soon<br>
-// switch the default behavior of mocks to be nice, as that in general<br>
-// leads to more maintainable tests.  When that happens, MockFoo will<br>
-// stop behaving like NaggyMock<MockFoo> and start behaving like<br>
-// NiceMock<MockFoo>.<br>
-//<br>
-// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of<br>
-// their respective base class.  Therefore you can write<br>
-// NiceMock<MockFoo>(5, "a") to construct a nice mock where MockFoo<br>
-// has a constructor that accepts (int, const char*), for example.<br>
-//<br>
-// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,<br>
-// and StrictMock<MockFoo> only works for mock methods defined using<br>
-// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.<br>
-// If a mock method is defined in a base class of MockFoo, the "nice"<br>
-// or "strict" modifier may not affect it, depending on the compiler.<br>
-// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT<br>
-// supported.<br>
-<br>
-// GOOGLETEST_CM0002 DO NOT DELETE<br>
-<br>
-// IWYU pragma: private, include "gmock/gmock.h"<br>
-<br>
-#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
-#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
-<br>
-#include "gmock/gmock-spec-builders.h"<br>
-#include "gmock/internal/gmock-port.h"<br>
-<br>
-namespace testing {<br>
-<br>
-template <class MockClass><br>
-class NiceMock : public MockClass {<br>
- public:<br>
-  NiceMock() : MockClass() {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
-  // Ideally, we would inherit base class's constructors through a using<br>
-  // declaration, which would preserve their visibility. However, many existing<br>
-  // tests rely on the fact that current implementation reexports protected<br>
-  // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
-  // Single argument constructor is special-cased so that it can be<br>
-  // made explicit.<br>
-  template <typename A><br>
-  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename... An><br>
-  NiceMock(A1&& arg1, A2&& arg2, An&&... args)<br>
-      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
-                  std::forward<An>(args)...) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-#else<br>
-  // C++98 doesn't have variadic templates, so we have to define one<br>
-  // for each arity.<br>
-  template <typename A1><br>
-  explicit NiceMock(const A1& a1) : MockClass(a1) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-  template <typename A1, typename A2><br>
-  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3,<br>
-      const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
-      a6, a7) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
-      a2, a3, a4, a5, a6, a7, a8) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
-      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9, typename A10><br>
-  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
-      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
-    ::testing::Mock::AllowUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
-  ~NiceMock() {<br>
-    ::testing::Mock::UnregisterCallReaction(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);<br>
-};<br>
-<br>
-template <class MockClass><br>
-class NaggyMock : public MockClass {<br>
- public:<br>
-  NaggyMock() : MockClass() {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
-  // Ideally, we would inherit base class's constructors through a using<br>
-  // declaration, which would preserve their visibility. However, many existing<br>
-  // tests rely on the fact that current implementation reexports protected<br>
-  // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
-  // Single argument constructor is special-cased so that it can be<br>
-  // made explicit.<br>
-  template <typename A><br>
-  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename... An><br>
-  NaggyMock(A1&& arg1, A2&& arg2, An&&... args)<br>
-      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
-                  std::forward<An>(args)...) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-#else<br>
-  // C++98 doesn't have variadic templates, so we have to define one<br>
-  // for each arity.<br>
-  template <typename A1><br>
-  explicit NaggyMock(const A1& a1) : MockClass(a1) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-  template <typename A1, typename A2><br>
-  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3,<br>
-      const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
-      a6, a7) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
-      a2, a3, a4, a5, a6, a7, a8) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
-      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9, typename A10><br>
-  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
-      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
-    ::testing::Mock::WarnUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
-  ~NaggyMock() {<br>
-    ::testing::Mock::UnregisterCallReaction(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);<br>
-};<br>
-<br>
-template <class MockClass><br>
-class StrictMock : public MockClass {<br>
- public:<br>
-  StrictMock() : MockClass() {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#if GTEST_LANG_CXX11<br>
-  // Ideally, we would inherit base class's constructors through a using<br>
-  // declaration, which would preserve their visibility. However, many existing<br>
-  // tests rely on the fact that current implementation reexports protected<br>
-  // constructors as public. These tests would need to be cleaned up first.<br>
-<br>
-  // Single argument constructor is special-cased so that it can be<br>
-  // made explicit.<br>
-  template <typename A><br>
-  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename... An><br>
-  StrictMock(A1&& arg1, A2&& arg2, An&&... args)<br>
-      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
-                  std::forward<An>(args)...) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-#else<br>
-  // C++98 doesn't have variadic templates, so we have to define one<br>
-  // for each arity.<br>
-  template <typename A1><br>
-  explicit StrictMock(const A1& a1) : MockClass(a1) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-  template <typename A1, typename A2><br>
-  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3,<br>
-      const A4& a4) : MockClass(a1, a2, a3, a4) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,<br>
-      a6, a7) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,<br>
-      a2, a3, a4, a5, a6, a7, a8) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8,<br>
-      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-  template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-      typename A6, typename A7, typename A8, typename A9, typename A10><br>
-  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,<br>
-      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,<br>
-      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {<br>
-    ::testing::Mock::FailUninterestingCalls(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
-  ~StrictMock() {<br>
-    ::testing::Mock::UnregisterCallReaction(<br>
-        internal::ImplicitCast_<MockClass*>(this));<br>
-  }<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);<br>
-};<br>
-<br>
-// The following specializations catch some (relatively more common)<br>
-// user errors of nesting nice and strict mocks.  They do NOT catch<br>
-// all possible errors.<br>
-<br>
-// These specializations are declared but not defined, as NiceMock,<br>
-// NaggyMock, and StrictMock cannot be nested.<br>
-<br>
-template <typename MockClass><br>
-class NiceMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NiceMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NiceMock<StrictMock<MockClass> >;<br>
-<br>
-template <typename MockClass><br>
-class NaggyMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NaggyMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class NaggyMock<StrictMock<MockClass> >;<br>
-<br>
-template <typename MockClass><br>
-class StrictMock<NiceMock<MockClass> >;<br>
-template <typename MockClass><br>
-class StrictMock<NaggyMock<MockClass> >;<br>
-template <typename MockClass><br>
-class StrictMock<StrictMock<MockClass> >;<br>
-<br>
-}  // namespace testing<br>
-<br>
-#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
index 92a77fc2c11ed..8c604cf14f150 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-matchers.h<br>
@@ -33,6 +33,9 @@<br>
 // This file implements some commonly used argument matchers.  More<br>
 // matchers can be defined by the user implementing the<br>
 // MatcherInterface<T> interface if necessary.<br>
+//<br>
+// See googletest/include/gtest/gtest-matchers.h for the definition of class<br>
+// Matcher, class MatcherInterface, and others.<br>
<br>
 // GOOGLETEST_CM0002 DO NOT DELETE<br>
<br>
@@ -43,21 +46,32 @@<br>
<br>
 #include <math.h><br>
 #include <algorithm><br>
+#include <initializer_list><br>
 #include <iterator><br>
 #include <limits><br>
+#include <memory><br>
 #include <ostream>  // NOLINT<br>
 #include <sstream><br>
 #include <string><br>
+#include <type_traits><br>
 #include <utility><br>
 #include <vector><br>
-#include "gtest/gtest.h"<br>
 #include "gmock/internal/gmock-internal-utils.h"<br>
 #include "gmock/internal/gmock-port.h"<br>
+#include "gtest/gtest.h"<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
-# include <initializer_list>  // NOLINT -- must be after gtest.h<br>
+// MSVC warning C5046 is new as of VS2017 version 15.8.<br>
+#if defined(_MSC_VER) && _MSC_VER >= 1915<br>
+#define GMOCK_MAYBE_5046_ 5046<br>
+#else<br>
+#define GMOCK_MAYBE_5046_<br>
 #endif<br>
<br>
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
+    4251 GMOCK_MAYBE_5046_ /* class A needs to have dll-interface to be used by<br>
+                              clients of class B */<br>
+    /* Symbol involving type with internal linkage not defined */)<br>
+<br>
 #ifdef __clang__<br>
 #if __has_warning("-Wdeprecated-copy")<br>
 #pragma clang diagnostic push<br>
@@ -65,11 +79,6 @@<br>
 #endif<br>
 #endif<br>
<br>
-GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
-    4251 5046 /* class A needs to have dll-interface to be used by clients of<br>
-                 class B */<br>
-    /* Symbol involving type with internal linkage not defined */)<br>
-<br>
 namespace testing {<br>
<br>
 // To implement a matcher Foo for type T, define:<br>
@@ -84,145 +93,6 @@ namespace testing {<br>
 // ownership management as Matcher objects can now be copied like<br>
 // plain values.<br>
<br>
-// MatchResultListener is an abstract class.  Its << operator can be<br>
-// used by a matcher to explain why a value matches or doesn't match.<br>
-//<br>
-// FIXME: add method<br>
-//   bool InterestedInWhy(bool result) const;<br>
-// to indicate whether the listener is interested in why the match<br>
-// result is 'result'.<br>
-class MatchResultListener {<br>
- public:<br>
-  // Creates a listener object with the given underlying ostream.  The<br>
-  // listener does not own the ostream, and does not dereference it<br>
-  // in the constructor or destructor.<br>
-  explicit MatchResultListener(::std::ostream* os) : stream_(os) {}<br>
-  virtual ~MatchResultListener() = 0;  // Makes this class abstract.<br>
-<br>
-  // Streams x to the underlying ostream; does nothing if the ostream<br>
-  // is NULL.<br>
-  template <typename T><br>
-  MatchResultListener& operator<<(const T& x) {<br>
-    if (stream_ != NULL)<br>
-      *stream_ << x;<br>
-    return *this;<br>
-  }<br>
-<br>
-  // Returns the underlying ostream.<br>
-  ::std::ostream* stream() { return stream_; }<br>
-<br>
-  // Returns true iff the listener is interested in an explanation of<br>
-  // the match result.  A matcher's MatchAndExplain() method can use<br>
-  // this information to avoid generating the explanation when no one<br>
-  // intends to hear it.<br>
-  bool IsInterested() const { return stream_ != NULL; }<br>
-<br>
- private:<br>
-  ::std::ostream* const stream_;<br>
-<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);<br>
-};<br>
-<br>
-inline MatchResultListener::~MatchResultListener() {<br>
-}<br>
-<br>
-// An instance of a subclass of this knows how to describe itself as a<br>
-// matcher.<br>
-class MatcherDescriberInterface {<br>
- public:<br>
-  virtual ~MatcherDescriberInterface() {}<br>
-<br>
-  // Describes this matcher to an ostream.  The function should print<br>
-  // a verb phrase that describes the property a value matching this<br>
-  // matcher should have.  The subject of the verb phrase is the value<br>
-  // being matched.  For example, the DescribeTo() method of the Gt(7)<br>
-  // matcher prints "is greater than 7".<br>
-  virtual void DescribeTo(::std::ostream* os) const = 0;<br>
-<br>
-  // Describes the negation of this matcher to an ostream.  For<br>
-  // example, if the description of this matcher is "is greater than<br>
-  // 7", the negated description could be "is not greater than 7".<br>
-  // You are not required to override this when implementing<br>
-  // MatcherInterface, but it is highly advised so that your matcher<br>
-  // can produce good error messages.<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
-    *os << "not (";<br>
-    DescribeTo(os);<br>
-    *os << ")";<br>
-  }<br>
-};<br>
-<br>
-// The implementation of a matcher.<br>
-template <typename T><br>
-class MatcherInterface : public MatcherDescriberInterface {<br>
- public:<br>
-  // Returns true iff the matcher matches x; also explains the match<br>
-  // result to 'listener' if necessary (see the next paragraph), in<br>
-  // the form of a non-restrictive relative clause ("which ...",<br>
-  // "whose ...", etc) that describes x.  For example, the<br>
-  // MatchAndExplain() method of the Pointee(...) matcher should<br>
-  // generate an explanation like "which points to ...".<br>
-  //<br>
-  // Implementations of MatchAndExplain() should add an explanation of<br>
-  // the match result *if and only if* they can provide additional<br>
-  // information that's not already present (or not obvious) in the<br>
-  // print-out of x and the matcher's description.  Whether the match<br>
-  // succeeds is not a factor in deciding whether an explanation is<br>
-  // needed, as sometimes the caller needs to print a failure message<br>
-  // when the match succeeds (e.g. when the matcher is used inside<br>
-  // Not()).<br>
-  //<br>
-  // For example, a "has at least 10 elements" matcher should explain<br>
-  // what the actual element count is, regardless of the match result,<br>
-  // as it is useful information to the reader; on the other hand, an<br>
-  // "is empty" matcher probably only needs to explain what the actual<br>
-  // size is when the match fails, as it's redundant to say that the<br>
-  // size is 0 when the value is already known to be empty.<br>
-  //<br>
-  // You should override this method when defining a new matcher.<br>
-  //<br>
-  // It's the responsibility of the caller (Google Mock) to guarantee<br>
-  // that 'listener' is not NULL.  This helps to simplify a matcher's<br>
-  // implementation when it doesn't care about the performance, as it<br>
-  // can talk to 'listener' without checking its validity first.<br>
-  // However, in order to implement dummy listeners efficiently,<br>
-  // listener->stream() may be NULL.<br>
-  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;<br>
-<br>
-  // Inherits these methods from MatcherDescriberInterface:<br>
-  //   virtual void DescribeTo(::std::ostream* os) const = 0;<br>
-  //   virtual void DescribeNegationTo(::std::ostream* os) const;<br>
-};<br>
-<br>
-namespace internal {<br>
-<br>
-// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.<br>
-template <typename T><br>
-class MatcherInterfaceAdapter : public MatcherInterface<const T&> {<br>
- public:<br>
-  explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl)<br>
-      : impl_(impl) {}<br>
-  virtual ~MatcherInterfaceAdapter() { delete impl_; }<br>
-<br>
-  virtual void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
-<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
-    impl_->DescribeNegationTo(os);<br>
-  }<br>
-<br>
-  virtual bool MatchAndExplain(const T& x,<br>
-                               MatchResultListener* listener) const {<br>
-    return impl_->MatchAndExplain(x, listener);<br>
-  }<br>
-<br>
- private:<br>
-  const MatcherInterface<T>* const impl_;<br>
-<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter);<br>
-};<br>
-<br>
-}  // namespace internal<br>
-<br>
 // A match result listener that stores the explanation in a string.<br>
 class StringMatchResultListener : public MatchResultListener {<br>
  public:<br>
@@ -240,409 +110,6 @@ class StringMatchResultListener : public MatchResultListener {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener);<br>
 };<br>
<br>
-namespace internal {<br>
-<br>
-struct AnyEq {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a == b; }<br>
-};<br>
-struct AnyNe {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a != b; }<br>
-};<br>
-struct AnyLt {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a < b; }<br>
-};<br>
-struct AnyGt {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a > b; }<br>
-};<br>
-struct AnyLe {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a <= b; }<br>
-};<br>
-struct AnyGe {<br>
-  template <typename A, typename B><br>
-  bool operator()(const A& a, const B& b) const { return a >= b; }<br>
-};<br>
-<br>
-// A match result listener that ignores the explanation.<br>
-class DummyMatchResultListener : public MatchResultListener {<br>
- public:<br>
-  DummyMatchResultListener() : MatchResultListener(NULL) {}<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);<br>
-};<br>
-<br>
-// A match result listener that forwards the explanation to a given<br>
-// ostream.  The <br>
diff erence between this and MatchResultListener is<br>
-// that the former is concrete.<br>
-class StreamMatchResultListener : public MatchResultListener {<br>
- public:<br>
-  explicit StreamMatchResultListener(::std::ostream* os)<br>
-      : MatchResultListener(os) {}<br>
-<br>
- private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);<br>
-};<br>
-<br>
-// An internal class for implementing Matcher<T>, which will derive<br>
-// from it.  We put functionalities common to all Matcher<T><br>
-// specializations here to avoid code duplication.<br>
-template <typename T><br>
-class MatcherBase {<br>
- public:<br>
-  // Returns true iff the matcher matches x; also explains the match<br>
-  // result to 'listener'.<br>
-  bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
-                       MatchResultListener* listener) const {<br>
-    return impl_->MatchAndExplain(x, listener);<br>
-  }<br>
-<br>
-  // Returns true iff this matcher matches x.<br>
-  bool Matches(GTEST_REFERENCE_TO_CONST_(T) x) const {<br>
-    DummyMatchResultListener dummy;<br>
-    return MatchAndExplain(x, &dummy);<br>
-  }<br>
-<br>
-  // Describes this matcher to an ostream.<br>
-  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
-<br>
-  // Describes the negation of this matcher to an ostream.<br>
-  void DescribeNegationTo(::std::ostream* os) const {<br>
-    impl_->DescribeNegationTo(os);<br>
-  }<br>
-<br>
-  // Explains why x matches, or doesn't match, the matcher.<br>
-  void ExplainMatchResultTo(GTEST_REFERENCE_TO_CONST_(T) x,<br>
-                            ::std::ostream* os) const {<br>
-    StreamMatchResultListener listener(os);<br>
-    MatchAndExplain(x, &listener);<br>
-  }<br>
-<br>
-  // Returns the describer for this matcher object; retains ownership<br>
-  // of the describer, which is only guaranteed to be alive when<br>
-  // this matcher object is alive.<br>
-  const MatcherDescriberInterface* GetDescriber() const {<br>
-    return impl_.get();<br>
-  }<br>
-<br>
- protected:<br>
-  MatcherBase() {}<br>
-<br>
-  // Constructs a matcher from its implementation.<br>
-  explicit MatcherBase(<br>
-      const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)<br>
-      : impl_(impl) {}<br>
-<br>
-  template <typename U><br>
-  explicit MatcherBase(<br>
-      const MatcherInterface<U>* impl,<br>
-      typename internal::EnableIf<<br>
-          !internal::IsSame<U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* =<br>
-          NULL)<br>
-      : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {}<br>
-<br>
-  virtual ~MatcherBase() {}<br>
-<br>
- private:<br>
-  // shared_ptr (util/gtl/shared_ptr.h) and linked_ptr have similar<br>
-  // interfaces.  The former dynamically allocates a chunk of memory<br>
-  // to hold the reference count, while the latter tracks all<br>
-  // references using a circular linked list without allocating<br>
-  // memory.  It has been observed that linked_ptr performs better in<br>
-  // typical scenarios.  However, shared_ptr can out-perform<br>
-  // linked_ptr when there are many more uses of the copy constructor<br>
-  // than the default constructor.<br>
-  //<br>
-  // If performance becomes a problem, we should see if using<br>
-  // shared_ptr helps.<br>
-  ::testing::internal::linked_ptr<<br>
-      const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> ><br>
-      impl_;<br>
-};<br>
-<br>
-}  // namespace internal<br>
-<br>
-// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)<br>
-// object that can check whether a value of type T matches.  The<br>
-// implementation of Matcher<T> is just a linked_ptr to const<br>
-// MatcherInterface<T>, so copying is fairly cheap.  Don't inherit<br>
-// from Matcher!<br>
-template <typename T><br>
-class Matcher : public internal::MatcherBase<T> {<br>
- public:<br>
-  // Constructs a null matcher.  Needed for storing Matcher objects in STL<br>
-  // containers.  A default-constructed matcher is not yet initialized.  You<br>
-  // cannot use it until a valid value has been assigned to it.<br>
-  explicit Matcher() {}  // NOLINT<br>
-<br>
-  // Constructs a matcher from its implementation.<br>
-  explicit Matcher(const MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)>* impl)<br>
-      : internal::MatcherBase<T>(impl) {}<br>
-<br>
-  template <typename U><br>
-  explicit Matcher(const MatcherInterface<U>* impl,<br>
-                   typename internal::EnableIf<!internal::IsSame<<br>
-                       U, GTEST_REFERENCE_TO_CONST_(U)>::value>::type* = NULL)<br>
-      : internal::MatcherBase<T>(impl) {}<br>
-<br>
-  // Implicit constructor here allows people to write<br>
-  // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes<br>
-  Matcher(T value);  // NOLINT<br>
-};<br>
-<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const std::string&><br>
-    : public internal::MatcherBase<const std::string&> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
-      : internal::MatcherBase<const std::string&>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a std::string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-#endif                         // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher<std::string><br>
-    : public internal::MatcherBase<std::string> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
-      : internal::MatcherBase<std::string>(impl) {}<br>
-  explicit Matcher(const MatcherInterface<std::string>* impl)<br>
-      : internal::MatcherBase<std::string>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-#endif                         // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-};<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a ::string<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const ::string&><br>
-    : public internal::MatcherBase<const ::string&> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const ::string&>* impl)<br>
-      : internal::MatcherBase<const ::string&>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a std::string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher< ::string><br>
-    : public internal::MatcherBase< ::string> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const ::string&>* impl)<br>
-      : internal::MatcherBase< ::string>(impl) {}<br>
-  explicit Matcher(const MatcherInterface< ::string>* impl)<br>
-      : internal::MatcherBase< ::string>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a std::string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-};<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_ABSL<br>
-// The following two specializations allow the user to write str<br>
-// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view<br>
-// matcher is expected.<br>
-template <><br>
-class GTEST_API_ Matcher<const absl::string_view&><br>
-    : public internal::MatcherBase<const absl::string_view&> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
-      : internal::MatcherBase<const absl::string_view&>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a std::string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-#endif                         // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-<br>
-  // Allows the user to pass absl::string_views directly.<br>
-  Matcher(absl::string_view s);  // NOLINT<br>
-};<br>
-<br>
-template <><br>
-class GTEST_API_ Matcher<absl::string_view><br>
-    : public internal::MatcherBase<absl::string_view> {<br>
- public:<br>
-  Matcher() {}<br>
-<br>
-  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
-      : internal::MatcherBase<absl::string_view>(impl) {}<br>
-  explicit Matcher(const MatcherInterface<absl::string_view>* impl)<br>
-      : internal::MatcherBase<absl::string_view>(impl) {}<br>
-<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a std::string object.<br>
-  Matcher(const std::string& s);  // NOLINT<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-  // Allows the user to write str instead of Eq(str) sometimes, where<br>
-  // str is a ::string object.<br>
-  Matcher(const ::string& s);  // NOLINT<br>
-#endif                         // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
-  Matcher(const char* s);  // NOLINT<br>
-<br>
-  // Allows the user to pass absl::string_views directly.<br>
-  Matcher(absl::string_view s);  // NOLINT<br>
-};<br>
-#endif  // GTEST_HAS_ABSL<br>
-<br>
-// Prints a matcher in a human-readable format.<br>
-template <typename T><br>
-std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {<br>
-  matcher.DescribeTo(&os);<br>
-  return os;<br>
-}<br>
-<br>
-// The PolymorphicMatcher class template makes it easy to implement a<br>
-// polymorphic matcher (i.e. a matcher that can match values of more<br>
-// than one type, e.g. Eq(n) and NotNull()).<br>
-//<br>
-// To define a polymorphic matcher, a user should provide an Impl<br>
-// class that has a DescribeTo() method and a DescribeNegationTo()<br>
-// method, and define a member function (or member function template)<br>
-//<br>
-//   bool MatchAndExplain(const Value& value,<br>
-//                        MatchResultListener* listener) const;<br>
-//<br>
-// See the definition of NotNull() for a complete example.<br>
-template <class Impl><br>
-class PolymorphicMatcher {<br>
- public:<br>
-  explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}<br>
-<br>
-  // Returns a mutable reference to the underlying matcher<br>
-  // implementation object.<br>
-  Impl& mutable_impl() { return impl_; }<br>
-<br>
-  // Returns an immutable reference to the underlying matcher<br>
-  // implementation object.<br>
-  const Impl& impl() const { return impl_; }<br>
-<br>
-  template <typename T><br>
-  operator Matcher<T>() const {<br>
-    return Matcher<T>(new MonomorphicImpl<GTEST_REFERENCE_TO_CONST_(T)>(impl_));<br>
-  }<br>
-<br>
- private:<br>
-  template <typename T><br>
-  class MonomorphicImpl : public MatcherInterface<T> {<br>
-   public:<br>
-    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
-<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
-      impl_.DescribeTo(os);<br>
-    }<br>
-<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
-      impl_.DescribeNegationTo(os);<br>
-    }<br>
-<br>
-    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
-      return impl_.MatchAndExplain(x, listener);<br>
-    }<br>
-<br>
-   private:<br>
-    const Impl impl_;<br>
-<br>
-    GTEST_DISALLOW_ASSIGN_(MonomorphicImpl);<br>
-  };<br>
-<br>
-  Impl impl_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(PolymorphicMatcher);<br>
-};<br>
-<br>
-// Creates a matcher from its implementation.  This is easier to use<br>
-// than the Matcher<T> constructor as it doesn't require you to<br>
-// explicitly write the template argument, e.g.<br>
-//<br>
-//   MakeMatcher(foo);<br>
-// vs<br>
-//   Matcher<const string&>(foo);<br>
-template <typename T><br>
-inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {<br>
-  return Matcher<T>(impl);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher from its implementation.  This is<br>
-// easier to use than the PolymorphicMatcher<Impl> constructor as it<br>
-// doesn't require you to explicitly write the template argument, e.g.<br>
-//<br>
-//   MakePolymorphicMatcher(foo);<br>
-// vs<br>
-//   PolymorphicMatcher<TypeOfFoo>(foo);<br>
-template <class Impl><br>
-inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {<br>
-  return PolymorphicMatcher<Impl>(impl);<br>
-}<br>
-<br>
 // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION<br>
 // and MUST NOT BE USED IN USER CODE!!!<br>
 namespace internal {<br>
@@ -674,19 +141,16 @@ class MatcherCastImpl {<br>
     // polymorphic_matcher_or_value to Matcher<T> because it won't trigger<br>
     // a user-defined conversion from M to T if one exists (assuming M is<br>
     // a value).<br>
-    return CastImpl(<br>
-        polymorphic_matcher_or_value,<br>
-        BooleanConstant<<br>
-            internal::ImplicitlyConvertible<M, Matcher<T> >::value>(),<br>
-        BooleanConstant<<br>
-            internal::ImplicitlyConvertible<M, T>::value>());<br>
+    return CastImpl(polymorphic_matcher_or_value,<br>
+                    std::is_convertible<M, Matcher<T>>{},<br>
+                    std::is_convertible<M, T>{});<br>
   }<br>
<br>
  private:<br>
   template <bool Ignore><br>
   static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value,<br>
-                             BooleanConstant<true> /* convertible_to_matcher */,<br>
-                             BooleanConstant<Ignore>) {<br>
+                             std::true_type /* convertible_to_matcher */,<br>
+                             bool_constant<Ignore>) {<br>
     // M is implicitly convertible to Matcher<T>, which means that either<br>
     // M is a polymorphic matcher or Matcher<T> has an implicit constructor<br>
     // from M.  In both cases using the implicit conversion will produce a<br>
@@ -701,9 +165,9 @@ class MatcherCastImpl {<br>
   // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic<br>
   // matcher. It's a value of a type implicitly convertible to T. Use direct<br>
   // initialization to create a matcher.<br>
-  static Matcher<T> CastImpl(<br>
-      const M& value, BooleanConstant<false> /* convertible_to_matcher */,<br>
-      BooleanConstant<true> /* convertible_to_T */) {<br>
+  static Matcher<T> CastImpl(const M& value,<br>
+                             std::false_type /* convertible_to_matcher */,<br>
+                             std::true_type /* convertible_to_T */) {<br>
     return Matcher<T>(ImplicitCast_<T>(value));<br>
   }<br>
<br>
@@ -717,9 +181,9 @@ class MatcherCastImpl {<br>
   // (e.g. std::pair<const int, int> vs. std::pair<int, int>).<br>
   //<br>
   // We don't define this method inline as we need the declaration of Eq().<br>
-  static Matcher<T> CastImpl(<br>
-      const M& value, BooleanConstant<false> /* convertible_to_matcher */,<br>
-      BooleanConstant<false> /* convertible_to_T */);<br>
+  static Matcher<T> CastImpl(const M& value,<br>
+                             std::false_type /* convertible_to_matcher */,<br>
+                             std::false_type /* convertible_to_T */);<br>
 };<br>
<br>
 // This more specialized version is used when MatcherCast()'s argument<br>
@@ -739,8 +203,7 @@ class MatcherCastImpl<T, Matcher<U> > {<br>
         : source_matcher_(source_matcher) {}<br>
<br>
     // We delegate the matching logic to the source matcher.<br>
-    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
-#if GTEST_LANG_CXX11<br>
+    bool MatchAndExplain(T x, MatchResultListener* listener) const override {<br>
       using FromType = typename std::remove_cv<typename std::remove_pointer<<br>
           typename std::remove_reference<T>::type>::type>::type;<br>
       using ToType = typename std::remove_cv<typename std::remove_pointer<<br>
@@ -754,16 +217,15 @@ class MatcherCastImpl<T, Matcher<U> > {<br>
               std::is_same<FromType, ToType>::value ||<br>
               !std::is_base_of<FromType, ToType>::value,<br>
           "Can't implicitly convert from <base> to <derived>");<br>
-#endif  // GTEST_LANG_CXX11<br>
<br>
       return source_matcher_.MatchAndExplain(static_cast<U>(x), listener);<br>
     }<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       source_matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       source_matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
@@ -795,11 +257,8 @@ inline Matcher<T> MatcherCast(const M& matcher) {<br>
<br>
 // Implements SafeMatcherCast().<br>
 //<br>
-// We use an intermediate class to do the actual safe casting as Nokia's<br>
-// Symbian compiler cannot decide between<br>
-// template <T, M> ... (M) and<br>
-// template <T, U> ... (const Matcher<U>&)<br>
-// for function templates but can for member function templates.<br>
+// FIXME: The intermediate SafeMatcherCastImpl class was introduced as a<br>
+// workaround for a compiler bug, and can now be removed.<br>
 template <typename T><br>
 class SafeMatcherCastImpl {<br>
  public:<br>
@@ -822,12 +281,12 @@ class SafeMatcherCastImpl {<br>
   template <typename U><br>
   static inline Matcher<T> Cast(const Matcher<U>& matcher) {<br>
     // Enforce that T can be implicitly converted to U.<br>
-    GTEST_COMPILE_ASSERT_((internal::ImplicitlyConvertible<T, U>::value),<br>
-                          T_must_be_implicitly_convertible_to_U);<br>
+    GTEST_COMPILE_ASSERT_((std::is_convertible<T, U>::value),<br>
+                          "T must be implicitly convertible to U");<br>
     // Enforce that we are not converting a non-reference type T to a reference<br>
     // type U.<br>
     GTEST_COMPILE_ASSERT_(<br>
-        internal::is_reference<T>::value || !internal::is_reference<U>::value,<br>
+        std::is_reference<T>::value || !std::is_reference<U>::value,<br>
         cannot_convert_non_reference_arg_to_reference);<br>
     // In case both T and U are arithmetic types, enforce that the<br>
     // conversion is not lossy.<br>
@@ -859,7 +318,7 @@ namespace internal {<br>
 // If the explanation is not empty, prints it to the ostream.<br>
 inline void PrintIfNotEmpty(const std::string& explanation,<br>
                             ::std::ostream* os) {<br>
-  if (explanation != "" && os != NULL) {<br>
+  if (explanation != "" && os != nullptr) {<br>
     *os << ", " << explanation;<br>
   }<br>
 }<br>
@@ -908,13 +367,13 @@ template <size_t N><br>
 class TuplePrefix {<br>
  public:<br>
   // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true<br>
-  // iff the first N fields of matcher_tuple matches the first N<br>
-  // fields of value_tuple, respectively.<br>
+  // if and only if the first N fields of matcher_tuple matches<br>
+  // the first N fields of value_tuple, respectively.<br>
   template <typename MatcherTuple, typename ValueTuple><br>
   static bool Matches(const MatcherTuple& matcher_tuple,<br>
                       const ValueTuple& value_tuple) {<br>
-    return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple)<br>
-        && get<N - 1>(matcher_tuple).Matches(get<N - 1>(value_tuple));<br>
+    return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) &&<br>
+           std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple));<br>
   }<br>
<br>
   // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os)<br>
@@ -930,16 +389,14 @@ class TuplePrefix {<br>
<br>
     // Then describes the failure (if any) in the (N - 1)-th (0-based)<br>
     // field.<br>
-    typename tuple_element<N - 1, MatcherTuple>::type matcher =<br>
-        get<N - 1>(matchers);<br>
-    typedef typename tuple_element<N - 1, ValueTuple>::type Value;<br>
-    GTEST_REFERENCE_TO_CONST_(Value) value = get<N - 1>(values);<br>
+    typename std::tuple_element<N - 1, MatcherTuple>::type matcher =<br>
+        std::get<N - 1>(matchers);<br>
+    typedef typename std::tuple_element<N - 1, ValueTuple>::type Value;<br>
+    const Value& value = std::get<N - 1>(values);<br>
     StringMatchResultListener listener;<br>
     if (!matcher.MatchAndExplain(value, &listener)) {<br>
-      // FIXME: include in the message the name of the parameter<br>
-      // as used in MOCK_METHOD*() when possible.<br>
       *os << "  Expected arg #" << N - 1 << ": ";<br>
-      get<N - 1>(matchers).DescribeTo(os);<br>
+      std::get<N - 1>(matchers).DescribeTo(os);<br>
       *os << "\n           Actual: ";<br>
       // We remove the reference in type Value to prevent the<br>
       // universal printer from printing the address of value, which<br>
@@ -969,8 +426,8 @@ class TuplePrefix<0> {<br>
                                      ::std::ostream* /* os */) {}<br>
 };<br>
<br>
-// TupleMatches(matcher_tuple, value_tuple) returns true iff all<br>
-// matchers in matcher_tuple match the corresponding fields in<br>
+// TupleMatches(matcher_tuple, value_tuple) returns true if and only if<br>
+// all matchers in matcher_tuple match the corresponding fields in<br>
 // value_tuple.  It is a compiler error if matcher_tuple and<br>
 // value_tuple have <br>
diff erent number of fields or incompatible field<br>
 // types.<br>
@@ -979,11 +436,11 @@ bool TupleMatches(const MatcherTuple& matcher_tuple,<br>
                   const ValueTuple& value_tuple) {<br>
   // Makes sure that matcher_tuple and value_tuple have the same<br>
   // number of fields.<br>
-  GTEST_COMPILE_ASSERT_(tuple_size<MatcherTuple>::value ==<br>
-                        tuple_size<ValueTuple>::value,<br>
+  GTEST_COMPILE_ASSERT_(std::tuple_size<MatcherTuple>::value ==<br>
+                            std::tuple_size<ValueTuple>::value,<br>
                         matcher_and_value_have_<br>
diff erent_numbers_of_fields);<br>
-  return TuplePrefix<tuple_size<ValueTuple>::value>::<br>
-      Matches(matcher_tuple, value_tuple);<br>
+  return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple,<br>
+                                                                  value_tuple);<br>
 }<br>
<br>
 // Describes failures in matching matchers against values.  If there<br>
@@ -992,7 +449,7 @@ template <typename MatcherTuple, typename ValueTuple><br>
 void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,<br>
                                 const ValueTuple& values,<br>
                                 ::std::ostream* os) {<br>
-  TuplePrefix<tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(<br>
+  TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo(<br>
       matchers, values, os);<br>
 }<br>
<br>
@@ -1003,7 +460,7 @@ void ExplainMatchFailureTupleTo(const MatcherTuple& matchers,<br>
 template <typename Tuple, typename Func, typename OutIter><br>
 class TransformTupleValuesHelper {<br>
  private:<br>
-  typedef ::testing::tuple_size<Tuple> TupleSize;<br>
+  typedef ::std::tuple_size<Tuple> TupleSize;<br>
<br>
  public:<br>
   // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'.<br>
@@ -1016,7 +473,7 @@ class TransformTupleValuesHelper {<br>
   template <typename Tup, size_t kRemainingSize><br>
   struct IterateOverTuple {<br>
     OutIter operator() (Func f, const Tup& t, OutIter out) const {<br>
-      *out++ = f(::testing::get<TupleSize::value - kRemainingSize>(t));<br>
+      *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t));<br>
       return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out);<br>
     }<br>
   };<br>
@@ -1038,14 +495,14 @@ OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) {<br>
<br>
 // Implements A<T>().<br>
 template <typename T><br>
-class AnyMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AnyMatcherImpl : public MatcherInterface<const T&> {<br>
  public:<br>
-  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) /* x */,<br>
-                               MatchResultListener* /* listener */) const {<br>
+  bool MatchAndExplain(const T& /* x */,<br>
+                       MatchResultListener* /* listener */) const override {<br>
     return true;<br>
   }<br>
-  virtual void DescribeTo(::std::ostream* os) const { *os << "is anything"; }<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override { *os << "is anything"; }<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     // This is mostly for completeness' safe, as it's not very useful<br>
     // to write Not(A<bool>()).  However we cannot completely rule out<br>
     // such a possibility, and it doesn't hurt to be prepared.<br>
@@ -1063,99 +520,6 @@ class AnythingMatcher {<br>
   operator Matcher<T>() const { return A<T>(); }<br>
 };<br>
<br>
-// Implements a matcher that compares a given value with a<br>
-// pre-supplied value using one of the ==, <=, <, etc, operators.  The<br>
-// two values being compared don't have to have the same type.<br>
-//<br>
-// The matcher defined here is polymorphic (for example, Eq(5) can be<br>
-// used to match an int, a short, a double, etc).  Therefore we use<br>
-// a template type conversion operator in the implementation.<br>
-//<br>
-// The following template definition assumes that the Rhs parameter is<br>
-// a "bare" type (i.e. neither 'const T' nor 'T&').<br>
-template <typename D, typename Rhs, typename Op><br>
-class ComparisonBase {<br>
- public:<br>
-  explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}<br>
-  template <typename Lhs><br>
-  operator Matcher<Lhs>() const {<br>
-    return MakeMatcher(new Impl<Lhs>(rhs_));<br>
-  }<br>
-<br>
- private:<br>
-  template <typename Lhs><br>
-  class Impl : public MatcherInterface<Lhs> {<br>
-   public:<br>
-    explicit Impl(const Rhs& rhs) : rhs_(rhs) {}<br>
-    virtual bool MatchAndExplain(<br>
-        Lhs lhs, MatchResultListener* /* listener */) const {<br>
-      return Op()(lhs, rhs_);<br>
-    }<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
-      *os << D::Desc() << " ";<br>
-      UniversalPrint(rhs_, os);<br>
-    }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
-      *os << D::NegatedDesc() <<  " ";<br>
-      UniversalPrint(rhs_, os);<br>
-    }<br>
-   private:<br>
-    Rhs rhs_;<br>
-    GTEST_DISALLOW_ASSIGN_(Impl);<br>
-  };<br>
-  Rhs rhs_;<br>
-  GTEST_DISALLOW_ASSIGN_(ComparisonBase);<br>
-};<br>
-<br>
-template <typename Rhs><br>
-class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {<br>
- public:<br>
-  explicit EqMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }<br>
-  static const char* Desc() { return "is equal to"; }<br>
-  static const char* NegatedDesc() { return "isn't equal to"; }<br>
-};<br>
-template <typename Rhs><br>
-class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {<br>
- public:<br>
-  explicit NeMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }<br>
-  static const char* Desc() { return "isn't equal to"; }<br>
-  static const char* NegatedDesc() { return "is equal to"; }<br>
-};<br>
-template <typename Rhs><br>
-class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {<br>
- public:<br>
-  explicit LtMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }<br>
-  static const char* Desc() { return "is <"; }<br>
-  static const char* NegatedDesc() { return "isn't <"; }<br>
-};<br>
-template <typename Rhs><br>
-class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {<br>
- public:<br>
-  explicit GtMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }<br>
-  static const char* Desc() { return "is >"; }<br>
-  static const char* NegatedDesc() { return "isn't >"; }<br>
-};<br>
-template <typename Rhs><br>
-class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {<br>
- public:<br>
-  explicit LeMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }<br>
-  static const char* Desc() { return "is <="; }<br>
-  static const char* NegatedDesc() { return "isn't <="; }<br>
-};<br>
-template <typename Rhs><br>
-class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {<br>
- public:<br>
-  explicit GeMatcher(const Rhs& rhs)<br>
-      : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }<br>
-  static const char* Desc() { return "is >="; }<br>
-  static const char* NegatedDesc() { return "isn't >="; }<br>
-};<br>
-<br>
 // Implements the polymorphic IsNull() matcher, which matches any raw or smart<br>
 // pointer that is NULL.<br>
 class IsNullMatcher {<br>
@@ -1163,11 +527,7 @@ class IsNullMatcher {<br>
   template <typename Pointer><br>
   bool MatchAndExplain(const Pointer& p,<br>
                        MatchResultListener* /* listener */) const {<br>
-#if GTEST_LANG_CXX11<br>
     return p == nullptr;<br>
-#else  // GTEST_LANG_CXX11<br>
-    return GetRawPointer(p) == NULL;<br>
-#endif  // GTEST_LANG_CXX11<br>
   }<br>
<br>
   void DescribeTo(::std::ostream* os) const { *os << "is NULL"; }<br>
@@ -1183,11 +543,7 @@ class NotNullMatcher {<br>
   template <typename Pointer><br>
   bool MatchAndExplain(const Pointer& p,<br>
                        MatchResultListener* /* listener */) const {<br>
-#if GTEST_LANG_CXX11<br>
     return p != nullptr;<br>
-#else  // GTEST_LANG_CXX11<br>
-    return GetRawPointer(p) != NULL;<br>
-#endif  // GTEST_LANG_CXX11<br>
   }<br>
<br>
   void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; }<br>
@@ -1243,18 +599,18 @@ class RefMatcher<T&> {<br>
<br>
     // MatchAndExplain() takes a Super& (as opposed to const Super&)<br>
     // in order to match the interface MatcherInterface<Super&>.<br>
-    virtual bool MatchAndExplain(<br>
-        Super& x, MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(Super& x,<br>
+                         MatchResultListener* listener) const override {<br>
       *listener << "which is located @" << static_cast<const void*>(&x);<br>
       return &x == &object_;<br>
     }<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "references the variable ";<br>
       UniversalPrinter<Super&>::Print(object_, os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "does not reference the variable ";<br>
       UniversalPrinter<Super&>::Print(object_, os);<br>
     }<br>
@@ -1316,12 +672,9 @@ class StrEqualityMatcher {<br>
 #if GTEST_HAS_ABSL<br>
   bool MatchAndExplain(const absl::string_view& s,<br>
                        MatchResultListener* listener) const {<br>
-    if (s.data() == NULL) {<br>
-      return !expect_eq_;<br>
-    }<br>
     // This should fail to compile if absl::string_view is used with wide<br>
     // strings.<br>
-    const StringType& str = string(s);<br>
+    const StringType& str = std::string(s);<br>
     return MatchAndExplain(str, listener);<br>
   }<br>
 #endif  // GTEST_HAS_ABSL<br>
@@ -1333,7 +686,7 @@ class StrEqualityMatcher {<br>
   //   wchar_t*<br>
   template <typename CharType><br>
   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
-    if (s == NULL) {<br>
+    if (s == nullptr) {<br>
       return !expect_eq_;<br>
     }<br>
     return MatchAndExplain(StringType(s), listener);<br>
@@ -1389,12 +742,9 @@ class HasSubstrMatcher {<br>
 #if GTEST_HAS_ABSL<br>
   bool MatchAndExplain(const absl::string_view& s,<br>
                        MatchResultListener* listener) const {<br>
-    if (s.data() == NULL) {<br>
-      return false;<br>
-    }<br>
     // This should fail to compile if absl::string_view is used with wide<br>
     // strings.<br>
-    const StringType& str = string(s);<br>
+    const StringType& str = std::string(s);<br>
     return MatchAndExplain(str, listener);<br>
   }<br>
 #endif  // GTEST_HAS_ABSL<br>
@@ -1406,7 +756,7 @@ class HasSubstrMatcher {<br>
   //   wchar_t*<br>
   template <typename CharType><br>
   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
-    return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+    return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
   }<br>
<br>
   // Matches anything that can convert to StringType.<br>
@@ -1449,12 +799,9 @@ class StartsWithMatcher {<br>
 #if GTEST_HAS_ABSL<br>
   bool MatchAndExplain(const absl::string_view& s,<br>
                        MatchResultListener* listener) const {<br>
-    if (s.data() == NULL) {<br>
-      return false;<br>
-    }<br>
     // This should fail to compile if absl::string_view is used with wide<br>
     // strings.<br>
-    const StringType& str = string(s);<br>
+    const StringType& str = std::string(s);<br>
     return MatchAndExplain(str, listener);<br>
   }<br>
 #endif  // GTEST_HAS_ABSL<br>
@@ -1466,7 +813,7 @@ class StartsWithMatcher {<br>
   //   wchar_t*<br>
   template <typename CharType><br>
   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
-    return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+    return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
   }<br>
<br>
   // Matches anything that can convert to StringType.<br>
@@ -1508,12 +855,9 @@ class EndsWithMatcher {<br>
 #if GTEST_HAS_ABSL<br>
   bool MatchAndExplain(const absl::string_view& s,<br>
                        MatchResultListener* listener) const {<br>
-    if (s.data() == NULL) {<br>
-      return false;<br>
-    }<br>
     // This should fail to compile if absl::string_view is used with wide<br>
     // strings.<br>
-    const StringType& str = string(s);<br>
+    const StringType& str = std::string(s);<br>
     return MatchAndExplain(str, listener);<br>
   }<br>
 #endif  // GTEST_HAS_ABSL<br>
@@ -1525,7 +869,7 @@ class EndsWithMatcher {<br>
   //   wchar_t*<br>
   template <typename CharType><br>
   bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
-    return s != NULL && MatchAndExplain(StringType(s), listener);<br>
+    return s != nullptr && MatchAndExplain(StringType(s), listener);<br>
   }<br>
<br>
   // Matches anything that can convert to StringType.<br>
@@ -1556,80 +900,24 @@ class EndsWithMatcher {<br>
   GTEST_DISALLOW_ASSIGN_(EndsWithMatcher);<br>
 };<br>
<br>
-// Implements polymorphic matchers MatchesRegex(regex) and<br>
-// ContainsRegex(regex), which can be used as a Matcher<T> as long as<br>
-// T can be converted to a string.<br>
-class MatchesRegexMatcher {<br>
- public:<br>
-  MatchesRegexMatcher(const RE* regex, bool full_match)<br>
-      : regex_(regex), full_match_(full_match) {}<br>
-<br>
-#if GTEST_HAS_ABSL<br>
-  bool MatchAndExplain(const absl::string_view& s,<br>
-                       MatchResultListener* listener) const {<br>
-    return s.data() && MatchAndExplain(string(s), listener);<br>
-  }<br>
-#endif  // GTEST_HAS_ABSL<br>
-<br>
-  // Accepts pointer types, particularly:<br>
-  //   const char*<br>
-  //   char*<br>
-  //   const wchar_t*<br>
-  //   wchar_t*<br>
-  template <typename CharType><br>
-  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
-    return s != NULL && MatchAndExplain(std::string(s), listener);<br>
-  }<br>
-<br>
-  // Matches anything that can convert to std::string.<br>
-  //<br>
-  // This is a template, not just a plain function with const std::string&,<br>
-  // because absl::string_view has some interfering non-explicit constructors.<br>
-  template <class MatcheeStringType><br>
-  bool MatchAndExplain(const MatcheeStringType& s,<br>
-                       MatchResultListener* /* listener */) const {<br>
-    const std::string& s2(s);<br>
-    return full_match_ ? RE::FullMatch(s2, *regex_) :<br>
-        RE::PartialMatch(s2, *regex_);<br>
-  }<br>
-<br>
-  void DescribeTo(::std::ostream* os) const {<br>
-    *os << (full_match_ ? "matches" : "contains")<br>
-        << " regular expression ";<br>
-    UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
-  }<br>
-<br>
-  void DescribeNegationTo(::std::ostream* os) const {<br>
-    *os << "doesn't " << (full_match_ ? "match" : "contain")<br>
-        << " regular expression ";<br>
-    UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
-  }<br>
-<br>
- private:<br>
-  const internal::linked_ptr<const RE> regex_;<br>
-  const bool full_match_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(MatchesRegexMatcher);<br>
-};<br>
-<br>
 // Implements a matcher that compares the two fields of a 2-tuple<br>
 // using one of the ==, <=, <, etc, operators.  The two fields being<br>
 // compared don't have to have the same type.<br>
 //<br>
 // The matcher defined here is polymorphic (for example, Eq() can be<br>
-// used to match a tuple<int, short>, a tuple<const long&, double>,<br>
+// used to match a std::tuple<int, short>, a std::tuple<const long&, double>,<br>
 // etc).  Therefore we use a template type conversion operator in the<br>
 // implementation.<br>
 template <typename D, typename Op><br>
 class PairMatchBase {<br>
  public:<br>
   template <typename T1, typename T2><br>
-  operator Matcher< ::testing::tuple<T1, T2> >() const {<br>
-    return MakeMatcher(new Impl< ::testing::tuple<T1, T2> >);<br>
+  operator Matcher<::std::tuple<T1, T2>>() const {<br>
+    return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>);<br>
   }<br>
   template <typename T1, typename T2><br>
-  operator Matcher<const ::testing::tuple<T1, T2>&>() const {<br>
-    return MakeMatcher(new Impl<const ::testing::tuple<T1, T2>&>);<br>
+  operator Matcher<const ::std::tuple<T1, T2>&>() const {<br>
+    return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>);<br>
   }<br>
<br>
  private:<br>
@@ -1640,15 +928,14 @@ class PairMatchBase {<br>
   template <typename Tuple><br>
   class Impl : public MatcherInterface<Tuple> {<br>
    public:<br>
-    virtual bool MatchAndExplain(<br>
-        Tuple args,<br>
-        MatchResultListener* /* listener */) const {<br>
-      return Op()(::testing::get<0>(args), ::testing::get<1>(args));<br>
+    bool MatchAndExplain(Tuple args,<br>
+                         MatchResultListener* /* listener */) const override {<br>
+      return Op()(::std::get<0>(args), ::std::get<1>(args));<br>
     }<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "are " << GetDesc;<br>
     }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "aren't " << GetDesc;<br>
     }<br>
   };<br>
@@ -1684,21 +971,21 @@ class Ge2Matcher : public PairMatchBase<Ge2Matcher, AnyGe> {<br>
 // will prevent <br>
diff erent instantiations of NotMatcher from sharing<br>
 // the same NotMatcherImpl<T> class.<br>
 template <typename T><br>
-class NotMatcherImpl : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class NotMatcherImpl : public MatcherInterface<const T&> {<br>
  public:<br>
   explicit NotMatcherImpl(const Matcher<T>& matcher)<br>
       : matcher_(matcher) {}<br>
<br>
-  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(const T& x,<br>
+                       MatchResultListener* listener) const override {<br>
     return !matcher_.MatchAndExplain(x, listener);<br>
   }<br>
<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     matcher_.DescribeNegationTo(os);<br>
   }<br>
<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     matcher_.DescribeTo(os);<br>
   }<br>
<br>
@@ -1733,13 +1020,12 @@ class NotMatcher {<br>
 // that will prevent <br>
diff erent instantiations of BothOfMatcher from<br>
 // sharing the same BothOfMatcherImpl<T> class.<br>
 template <typename T><br>
-class AllOfMatcherImpl<br>
-    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AllOfMatcherImpl : public MatcherInterface<const T&> {<br>
  public:<br>
   explicit AllOfMatcherImpl(std::vector<Matcher<T> > matchers)<br>
-      : matchers_(internal::move(matchers)) {}<br>
+      : matchers_(std::move(matchers)) {}<br>
<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "(";<br>
     for (size_t i = 0; i < matchers_.size(); ++i) {<br>
       if (i != 0) *os << ") and (";<br>
@@ -1748,7 +1034,7 @@ class AllOfMatcherImpl<br>
     *os << ")";<br>
   }<br>
<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "(";<br>
     for (size_t i = 0; i < matchers_.size(); ++i) {<br>
       if (i != 0) *os << ") or (";<br>
@@ -1757,8 +1043,8 @@ class AllOfMatcherImpl<br>
     *os << ")";<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(const T& x,<br>
+                       MatchResultListener* listener) const override {<br>
     // If either matcher1_ or matcher2_ doesn't match x, we only need<br>
     // to explain why one of them fails.<br>
     std::string all_match_result;<br>
@@ -1792,7 +1078,6 @@ class AllOfMatcherImpl<br>
   GTEST_DISALLOW_ASSIGN_(AllOfMatcherImpl);<br>
 };<br>
<br>
-#if GTEST_LANG_CXX11<br>
 // VariadicMatcher is used for the variadic implementation of<br>
 // AllOf(m_1, m_2, ...) and AnyOf(m_1, m_2, ...).<br>
 // CombiningMatcher<T> is used to recursively combine the provided matchers<br>
@@ -1812,7 +1097,7 @@ class VariadicMatcher {<br>
   operator Matcher<T>() const {<br>
     std::vector<Matcher<T> > values;<br>
     CreateVariadicMatcher<T>(&values, std::integral_constant<size_t, 0>());<br>
-    return Matcher<T>(new CombiningMatcher<T>(internal::move(values)));<br>
+    return Matcher<T>(new CombiningMatcher<T>(std::move(values)));<br>
   }<br>
<br>
  private:<br>
@@ -1828,7 +1113,7 @@ class VariadicMatcher {<br>
       std::vector<Matcher<T> >*,<br>
       std::integral_constant<size_t, sizeof...(Args)>) const {}<br>
<br>
-  tuple<Args...> matchers_;<br>
+  std::tuple<Args...> matchers_;<br>
<br>
   GTEST_DISALLOW_ASSIGN_(VariadicMatcher);<br>
 };<br>
@@ -1836,46 +1121,17 @@ class VariadicMatcher {<br>
 template <typename... Args><br>
 using AllOfMatcher = VariadicMatcher<AllOfMatcherImpl, Args...>;<br>
<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
-// Used for implementing the AllOf(m_1, ..., m_n) matcher, which<br>
-// matches a value that matches all of the matchers m_1, ..., and m_n.<br>
-template <typename Matcher1, typename Matcher2><br>
-class BothOfMatcher {<br>
- public:<br>
-  BothOfMatcher(Matcher1 matcher1, Matcher2 matcher2)<br>
-      : matcher1_(matcher1), matcher2_(matcher2) {}<br>
-<br>
-  // This template type conversion operator allows a<br>
-  // BothOfMatcher<Matcher1, Matcher2> object to match any type that<br>
-  // both Matcher1 and Matcher2 can match.<br>
-  template <typename T><br>
-  operator Matcher<T>() const {<br>
-    std::vector<Matcher<T> > values;<br>
-    values.push_back(SafeMatcherCast<T>(matcher1_));<br>
-    values.push_back(SafeMatcherCast<T>(matcher2_));<br>
-    return Matcher<T>(new AllOfMatcherImpl<T>(internal::move(values)));<br>
-  }<br>
-<br>
- private:<br>
-  Matcher1 matcher1_;<br>
-  Matcher2 matcher2_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(BothOfMatcher);<br>
-};<br>
-<br>
 // Implements the AnyOf(m1, m2) matcher for a particular argument type<br>
 // T.  We do not nest it inside the AnyOfMatcher class template, as<br>
 // that will prevent <br>
diff erent instantiations of AnyOfMatcher from<br>
 // sharing the same EitherOfMatcherImpl<T> class.<br>
 template <typename T><br>
-class AnyOfMatcherImpl<br>
-    : public MatcherInterface<GTEST_REFERENCE_TO_CONST_(T)> {<br>
+class AnyOfMatcherImpl : public MatcherInterface<const T&> {<br>
  public:<br>
   explicit AnyOfMatcherImpl(std::vector<Matcher<T> > matchers)<br>
-      : matchers_(internal::move(matchers)) {}<br>
+      : matchers_(std::move(matchers)) {}<br>
<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "(";<br>
     for (size_t i = 0; i < matchers_.size(); ++i) {<br>
       if (i != 0) *os << ") or (";<br>
@@ -1884,7 +1140,7 @@ class AnyOfMatcherImpl<br>
     *os << ")";<br>
   }<br>
<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "(";<br>
     for (size_t i = 0; i < matchers_.size(); ++i) {<br>
       if (i != 0) *os << ") and (";<br>
@@ -1893,8 +1149,8 @@ class AnyOfMatcherImpl<br>
     *os << ")";<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(GTEST_REFERENCE_TO_CONST_(T) x,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(const T& x,<br>
+                       MatchResultListener* listener) const override {<br>
     std::string no_match_result;<br>
<br>
     // If either matcher1_ or matcher2_ matches x, we just need to<br>
@@ -1928,40 +1184,41 @@ class AnyOfMatcherImpl<br>
   GTEST_DISALLOW_ASSIGN_(AnyOfMatcherImpl);<br>
 };<br>
<br>
-#if GTEST_LANG_CXX11<br>
 // AnyOfMatcher is used for the variadic implementation of AnyOf(m_1, m_2, ...).<br>
 template <typename... Args><br>
 using AnyOfMatcher = VariadicMatcher<AnyOfMatcherImpl, Args...>;<br>
<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
-// Used for implementing the AnyOf(m_1, ..., m_n) matcher, which<br>
-// matches a value that matches at least one of the matchers m_1, ...,<br>
-// and m_n.<br>
-template <typename Matcher1, typename Matcher2><br>
-class EitherOfMatcher {<br>
+// Wrapper for implementation of Any/AllOfArray().<br>
+template <template <class> class MatcherImpl, typename T><br>
+class SomeOfArrayMatcher {<br>
  public:<br>
-  EitherOfMatcher(Matcher1 matcher1, Matcher2 matcher2)<br>
-      : matcher1_(matcher1), matcher2_(matcher2) {}<br>
+  // Constructs the matcher from a sequence of element values or<br>
+  // element matchers.<br>
+  template <typename Iter><br>
+  SomeOfArrayMatcher(Iter first, Iter last) : matchers_(first, last) {}<br>
<br>
-  // This template type conversion operator allows a<br>
-  // EitherOfMatcher<Matcher1, Matcher2> object to match any type that<br>
-  // both Matcher1 and Matcher2 can match.<br>
-  template <typename T><br>
-  operator Matcher<T>() const {<br>
-    std::vector<Matcher<T> > values;<br>
-    values.push_back(SafeMatcherCast<T>(matcher1_));<br>
-    values.push_back(SafeMatcherCast<T>(matcher2_));<br>
-    return Matcher<T>(new AnyOfMatcherImpl<T>(internal::move(values)));<br>
+  template <typename U><br>
+  operator Matcher<U>() const {  // NOLINT<br>
+    using RawU = typename std::decay<U>::type;<br>
+    std::vector<Matcher<RawU>> matchers;<br>
+    for (const auto& matcher : matchers_) {<br>
+      matchers.push_back(MatcherCast<RawU>(matcher));<br>
+    }<br>
+    return Matcher<U>(new MatcherImpl<RawU>(std::move(matchers)));<br>
   }<br>
<br>
  private:<br>
-  Matcher1 matcher1_;<br>
-  Matcher2 matcher2_;<br>
+  const ::std::vector<T> matchers_;<br>
<br>
-  GTEST_DISALLOW_ASSIGN_(EitherOfMatcher);<br>
+  GTEST_DISALLOW_ASSIGN_(SomeOfArrayMatcher);<br>
 };<br>
<br>
+template <typename T><br>
+using AllOfArrayMatcher = SomeOfArrayMatcher<AllOfMatcherImpl, T>;<br>
+<br>
+template <typename T><br>
+using AnyOfArrayMatcher = SomeOfArrayMatcher<AnyOfMatcherImpl, T>;<br>
+<br>
 // Used for implementing Truly(pred), which turns a predicate into a<br>
 // matcher.<br>
 template <typename Predicate><br>
@@ -2044,7 +1301,7 @@ class MatcherAsPredicate {<br>
 template <typename M><br>
 class PredicateFormatterFromMatcher {<br>
  public:<br>
-  explicit PredicateFormatterFromMatcher(M m) : matcher_(internal::move(m)) {}<br>
+  explicit PredicateFormatterFromMatcher(M m) : matcher_(std::move(m)) {}<br>
<br>
   // This template () operator allows a PredicateFormatterFromMatcher<br>
   // object to act as a predicate-formatter suitable for using with<br>
@@ -2063,14 +1320,24 @@ class PredicateFormatterFromMatcher {<br>
     // We don't write MatcherCast<const T&> either, as that allows<br>
     // potentially unsafe downcasting of the matcher argument.<br>
     const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);<br>
-    StringMatchResultListener listener;<br>
-    if (MatchPrintAndExplain(x, matcher, &listener))<br>
+<br>
+    // The expected path here is that the matcher should match (i.e. that most<br>
+    // tests pass) so optimize for this case.<br>
+    if (matcher.Matches(x)) {<br>
       return AssertionSuccess();<br>
+    }<br>
<br>
     ::std::stringstream ss;<br>
     ss << "Value of: " << value_text << "\n"<br>
        << "Expected: ";<br>
     matcher.DescribeTo(&ss);<br>
+<br>
+    // Rerun the matcher to "PrintAndExain" the failure.<br>
+    StringMatchResultListener listener;<br>
+    if (MatchPrintAndExplain(x, matcher, &listener)) {<br>
+      ss << "\n  The matcher failed on the initial attempt; but passed when "<br>
+            "rerun to generate the explanation.";<br>
+    }<br>
     ss << "\n  Actual: " << listener.str();<br>
     return AssertionFailure() << ss.str();<br>
   }<br>
@@ -2088,7 +1355,7 @@ class PredicateFormatterFromMatcher {<br>
 template <typename M><br>
 inline PredicateFormatterFromMatcher<M><br>
 MakePredicateFormatterFromMatcher(M matcher) {<br>
-  return PredicateFormatterFromMatcher<M>(internal::move(matcher));<br>
+  return PredicateFormatterFromMatcher<M>(std::move(matcher));<br>
 }<br>
<br>
 // Implements the polymorphic floating point equality matcher, which matches<br>
@@ -2129,8 +1396,8 @@ class FloatingEqMatcher {<br>
           nan_eq_nan_(nan_eq_nan),<br>
           max_abs_error_(max_abs_error) {}<br>
<br>
-    virtual bool MatchAndExplain(T value,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(T value,<br>
+                         MatchResultListener* listener) const override {<br>
       const FloatingPoint<FloatType> actual(value), expected(expected_);<br>
<br>
       // Compares NaNs first, if nan_eq_nan_ is true.<br>
@@ -2164,7 +1431,7 @@ class FloatingEqMatcher {<br>
       }<br>
     }<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       // os->precision() returns the previously set precision, which we<br>
       // store to restore the ostream to its original configuration<br>
       // after outputting.<br>
@@ -2185,7 +1452,7 @@ class FloatingEqMatcher {<br>
       os->precision(old_precision);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       // As before, get original precision.<br>
       const ::std::streamsize old_precision = os->precision(<br>
           ::std::numeric_limits<FloatType>::digits10 + 2);<br>
@@ -2269,14 +1536,14 @@ class FloatingEq2Matcher {<br>
   }<br>
<br>
   template <typename T1, typename T2><br>
-  operator Matcher< ::testing::tuple<T1, T2> >() const {<br>
+  operator Matcher<::std::tuple<T1, T2>>() const {<br>
     return MakeMatcher(<br>
-        new Impl< ::testing::tuple<T1, T2> >(max_abs_error_, nan_eq_nan_));<br>
+        new Impl<::std::tuple<T1, T2>>(max_abs_error_, nan_eq_nan_));<br>
   }<br>
   template <typename T1, typename T2><br>
-  operator Matcher<const ::testing::tuple<T1, T2>&>() const {<br>
+  operator Matcher<const ::std::tuple<T1, T2>&>() const {<br>
     return MakeMatcher(<br>
-        new Impl<const ::testing::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));<br>
+        new Impl<const ::std::tuple<T1, T2>&>(max_abs_error_, nan_eq_nan_));<br>
   }<br>
<br>
  private:<br>
@@ -2291,23 +1558,23 @@ class FloatingEq2Matcher {<br>
         max_abs_error_(max_abs_error),<br>
         nan_eq_nan_(nan_eq_nan) {}<br>
<br>
-    virtual bool MatchAndExplain(Tuple args,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(Tuple args,<br>
+                         MatchResultListener* listener) const override {<br>
       if (max_abs_error_ == -1) {<br>
-        FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_);<br>
-        return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(<br>
-            ::testing::get<1>(args), listener);<br>
+        FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_);<br>
+        return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(<br>
+            ::std::get<1>(args), listener);<br>
       } else {<br>
-        FloatingEqMatcher<FloatType> fm(::testing::get<0>(args), nan_eq_nan_,<br>
+        FloatingEqMatcher<FloatType> fm(::std::get<0>(args), nan_eq_nan_,<br>
                                         max_abs_error_);<br>
-        return static_cast<Matcher<FloatType> >(fm).MatchAndExplain(<br>
-            ::testing::get<1>(args), listener);<br>
+        return static_cast<Matcher<FloatType>>(fm).MatchAndExplain(<br>
+            ::std::get<1>(args), listener);<br>
       }<br>
     }<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "are " << GetDesc;<br>
     }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "aren't " << GetDesc;<br>
     }<br>
<br>
@@ -2341,8 +1608,7 @@ class PointeeMatcher {<br>
   // enough for implementing the DescribeTo() method of Pointee().<br>
   template <typename Pointer><br>
   operator Matcher<Pointer>() const {<br>
-    return Matcher<Pointer>(<br>
-        new Impl<GTEST_REFERENCE_TO_CONST_(Pointer)>(matcher_));<br>
+    return Matcher<Pointer>(new Impl<const Pointer&>(matcher_));<br>
   }<br>
<br>
  private:<br>
@@ -2350,26 +1616,25 @@ class PointeeMatcher {<br>
   template <typename Pointer><br>
   class Impl : public MatcherInterface<Pointer> {<br>
    public:<br>
-    typedef typename PointeeOf<GTEST_REMOVE_CONST_(  // NOLINT<br>
-        GTEST_REMOVE_REFERENCE_(Pointer))>::type Pointee;<br>
+    typedef typename PointeeOf<typename std::remove_const<<br>
+        typename std::remove_reference<Pointer>::type>::type>::type Pointee;<br>
<br>
     explicit Impl(const InnerMatcher& matcher)<br>
         : matcher_(MatcherCast<const Pointee&>(matcher)) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "points to a value that ";<br>
       matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "does not point to a value that ";<br>
       matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(Pointer pointer,<br>
-                                 MatchResultListener* listener) const {<br>
-      if (GetRawPointer(pointer) == NULL)<br>
-        return false;<br>
+    bool MatchAndExplain(Pointer pointer,<br>
+                         MatchResultListener* listener) const override {<br>
+      if (GetRawPointer(pointer) == nullptr) return false;<br>
<br>
       *listener << "which points to ";<br>
       return MatchPrintAndExplain(*pointer, matcher_, listener);<br>
@@ -2434,7 +1699,6 @@ class WhenDynamicCastToMatcher : public WhenDynamicCastToMatcherBase<To> {<br>
<br>
   template <typename From><br>
   bool MatchAndExplain(From from, MatchResultListener* listener) const {<br>
-    // FIXME: Add more detail on failures. ie did the dyn_cast fail?<br>
     To to = dynamic_cast<To>(from);<br>
     return MatchPrintAndExplain(to, this->matcher_, listener);<br>
   }<br>
@@ -2452,7 +1716,7 @@ class WhenDynamicCastToMatcher<To&> : public WhenDynamicCastToMatcherBase<To&> {<br>
   bool MatchAndExplain(From& from, MatchResultListener* listener) const {<br>
     // We don't want an std::bad_cast here, so do the cast with pointers.<br>
     To* to = dynamic_cast<To*>(&from);<br>
-    if (to == NULL) {<br>
+    if (to == nullptr) {<br>
       *listener << "which cannot be dynamic_cast to " << this->GetToName();<br>
       return false;<br>
     }<br>
@@ -2488,32 +1752,30 @@ class FieldMatcher {<br>
<br>
   template <typename T><br>
   bool MatchAndExplain(const T& value, MatchResultListener* listener) const {<br>
+    // FIXME: The dispatch on std::is_pointer was introduced as a workaround for<br>
+    // a compiler bug, and can now be removed.<br>
     return MatchAndExplainImpl(<br>
-        typename ::testing::internal::<br>
-            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),<br>
+        typename std::is_pointer<typename std::remove_const<T>::type>::type(),<br>
         value, listener);<br>
   }<br>
<br>
  private:<br>
-  // The first argument of MatchAndExplainImpl() is needed to help<br>
-  // Symbian's C++ compiler choose which overload to use.  Its type is<br>
-  // true_type iff the Field() matcher is used to match a pointer.<br>
-  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,<br>
+  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,<br>
+                           const Class& obj,<br>
                            MatchResultListener* listener) const {<br>
     *listener << whose_field_ << "is ";<br>
     return MatchPrintAndExplain(obj.*field_, matcher_, listener);<br>
   }<br>
<br>
-  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,<br>
+  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,<br>
                            MatchResultListener* listener) const {<br>
-    if (p == NULL)<br>
-      return false;<br>
+    if (p == nullptr) return false;<br>
<br>
     *listener << "which points to an object ";<br>
     // Since *p has a field, it must be a class/struct/union type and<br>
     // thus cannot be a pointer.  Therefore we pass false_type() as<br>
     // the first argument.<br>
-    return MatchAndExplainImpl(false_type(), *p, listener);<br>
+    return MatchAndExplainImpl(std::false_type(), *p, listener);<br>
   }<br>
<br>
   const FieldType Class::*field_;<br>
@@ -2534,11 +1796,7 @@ class FieldMatcher {<br>
 template <typename Class, typename PropertyType, typename Property><br>
 class PropertyMatcher {<br>
  public:<br>
-  // The property may have a reference type, so 'const PropertyType&'<br>
-  // may cause double references and fail to compile.  That's why we<br>
-  // need GTEST_REFERENCE_TO_CONST, which works regardless of<br>
-  // PropertyType being a reference or not.<br>
-  typedef GTEST_REFERENCE_TO_CONST_(PropertyType) RefToConstProperty;<br>
+  typedef const PropertyType& RefToConstProperty;<br>
<br>
   PropertyMatcher(Property property, const Matcher<RefToConstProperty>& matcher)<br>
       : property_(property),<br>
@@ -2564,41 +1822,30 @@ class PropertyMatcher {<br>
   template <typename T><br>
   bool MatchAndExplain(const T&value, MatchResultListener* listener) const {<br>
     return MatchAndExplainImpl(<br>
-        typename ::testing::internal::<br>
-            is_pointer<GTEST_REMOVE_CONST_(T)>::type(),<br>
+        typename std::is_pointer<typename std::remove_const<T>::type>::type(),<br>
         value, listener);<br>
   }<br>
<br>
  private:<br>
-  // The first argument of MatchAndExplainImpl() is needed to help<br>
-  // Symbian's C++ compiler choose which overload to use.  Its type is<br>
-  // true_type iff the Property() matcher is used to match a pointer.<br>
-  bool MatchAndExplainImpl(false_type /* is_not_pointer */, const Class& obj,<br>
+  bool MatchAndExplainImpl(std::false_type /* is_not_pointer */,<br>
+                           const Class& obj,<br>
                            MatchResultListener* listener) const {<br>
     *listener << whose_property_ << "is ";<br>
     // Cannot pass the return value (for example, int) to MatchPrintAndExplain,<br>
     // which takes a non-const reference as argument.<br>
-#if defined(_PREFAST_ ) && _MSC_VER == 1800<br>
-    // Workaround bug in VC++ 2013's /analyze parser.<br>
-    // <a href="https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move" rel="noreferrer" target="_blank">https://connect.microsoft.com/VisualStudio/feedback/details/1106363/internal-compiler-error-with-analyze-due-to-failure-to-infer-move</a><br>
-    posix::Abort();  // To make sure it is never run.<br>
-    return false;<br>
-#else<br>
     RefToConstProperty result = (obj.*property_)();<br>
     return MatchPrintAndExplain(result, matcher_, listener);<br>
-#endif<br>
   }<br>
<br>
-  bool MatchAndExplainImpl(true_type /* is_pointer */, const Class* p,<br>
+  bool MatchAndExplainImpl(std::true_type /* is_pointer */, const Class* p,<br>
                            MatchResultListener* listener) const {<br>
-    if (p == NULL)<br>
-      return false;<br>
+    if (p == nullptr) return false;<br>
<br>
     *listener << "which points to an object ";<br>
     // Since *p has a property method, it must be a class/struct/union<br>
     // type and thus cannot be a pointer.  Therefore we pass<br>
     // false_type() as the first argument.<br>
-    return MatchAndExplainImpl(false_type(), *p, listener);<br>
+    return MatchAndExplainImpl(std::false_type(), *p, listener);<br>
   }<br>
<br>
   Property property_;<br>
@@ -2619,14 +1866,10 @@ struct CallableTraits {<br>
<br>
   static void CheckIsValid(Functor /* functor */) {}<br>
<br>
-#if GTEST_LANG_CXX11<br>
   template <typename T><br>
-  static auto Invoke(Functor f, T arg) -> decltype(f(arg)) { return f(arg); }<br>
-#else<br>
-  typedef typename Functor::result_type ResultType;<br>
-  template <typename T><br>
-  static ResultType Invoke(Functor f, T arg) { return f(arg); }<br>
-#endif<br>
+  static auto Invoke(Functor f, const T& arg) -> decltype(f(arg)) {<br>
+    return f(arg);<br>
+  }<br>
 };<br>
<br>
 // Specialization for function pointers.<br>
@@ -2636,7 +1879,7 @@ struct CallableTraits<ResType(*)(ArgType)> {<br>
   typedef ResType(*StorageType)(ArgType);<br>
<br>
   static void CheckIsValid(ResType(*f)(ArgType)) {<br>
-    GTEST_CHECK_(f != NULL)<br>
+    GTEST_CHECK_(f != nullptr)<br>
         << "NULL function pointer is passed into ResultOf().";<br>
   }<br>
   template <typename T><br>
@@ -2651,13 +1894,13 @@ template <typename Callable, typename InnerMatcher><br>
 class ResultOfMatcher {<br>
  public:<br>
   ResultOfMatcher(Callable callable, InnerMatcher matcher)<br>
-      : callable_(internal::move(callable)), matcher_(internal::move(matcher)) {<br>
+      : callable_(std::move(callable)), matcher_(std::move(matcher)) {<br>
     CallableTraits<Callable>::CheckIsValid(callable_);<br>
   }<br>
<br>
   template <typename T><br>
   operator Matcher<T>() const {<br>
-    return Matcher<T>(new Impl<T>(callable_, matcher_));<br>
+    return Matcher<T>(new Impl<const T&>(callable_, matcher_));<br>
   }<br>
<br>
  private:<br>
@@ -2665,29 +1908,25 @@ class ResultOfMatcher {<br>
<br>
   template <typename T><br>
   class Impl : public MatcherInterface<T> {<br>
-#if GTEST_LANG_CXX11<br>
     using ResultType = decltype(CallableTraits<Callable>::template Invoke<T>(<br>
         std::declval<CallableStorageType>(), std::declval<T>()));<br>
-#else<br>
-    typedef typename CallableTraits<Callable>::ResultType ResultType;<br>
-#endif<br>
<br>
    public:<br>
     template <typename M><br>
     Impl(const CallableStorageType& callable, const M& matcher)<br>
         : callable_(callable), matcher_(MatcherCast<ResultType>(matcher)) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "is mapped by the given callable to a value that ";<br>
       matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "is mapped by the given callable to a value that ";<br>
       matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(T obj, MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(T obj, MatchResultListener* listener) const override {<br>
       *listener << "which is mapped by the given callable to ";<br>
       // Cannot pass the return value directly to MatchPrintAndExplain, which<br>
       // takes a non-const reference as argument.<br>
@@ -2726,29 +1965,27 @@ class SizeIsMatcher {<br>
<br>
   template <typename Container><br>
   operator Matcher<Container>() const {<br>
-    return MakeMatcher(new Impl<Container>(size_matcher_));<br>
+    return Matcher<Container>(new Impl<const Container&>(size_matcher_));<br>
   }<br>
<br>
   template <typename Container><br>
   class Impl : public MatcherInterface<Container> {<br>
    public:<br>
-    typedef internal::StlContainerView<<br>
-         GTEST_REMOVE_REFERENCE_AND_CONST_(Container)> ContainerView;<br>
-    typedef typename ContainerView::type::size_type SizeType;<br>
+    using SizeType = decltype(std::declval<Container>().size());<br>
     explicit Impl(const SizeMatcher& size_matcher)<br>
         : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "size ";<br>
       size_matcher_.DescribeTo(os);<br>
     }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "size ";<br>
       size_matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(Container container,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(Container container,<br>
+                         MatchResultListener* listener) const override {<br>
       SizeType size = container.size();<br>
       StringMatchResultListener size_listener;<br>
       const bool result = size_matcher_.MatchAndExplain(size, &size_listener);<br>
@@ -2778,42 +2015,37 @@ class BeginEndDistanceIsMatcher {<br>
<br>
   template <typename Container><br>
   operator Matcher<Container>() const {<br>
-    return MakeMatcher(new Impl<Container>(distance_matcher_));<br>
+    return Matcher<Container>(new Impl<const Container&>(distance_matcher_));<br>
   }<br>
<br>
   template <typename Container><br>
   class Impl : public MatcherInterface<Container> {<br>
-   public:<br>
-     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
-     typedef internal::StlContainerView<RawContainer> View;<br>
-     typedef typename View::type StlContainer;<br>
-     typedef typename View::const_reference StlContainerReference;<br>
-     typedef decltype(std::begin(<br>
-         std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
-     typedef typename std::iterator_traits<<br>
-         StlContainerConstIterator>::<br>
diff erence_type DistanceType;<br>
-<br>
-     explicit Impl(const DistanceMatcher &distance_matcher)<br>
-         : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}<br>
-<br>
-     virtual void DescribeTo(::std::ostream *os) const {<br>
-       *os << "distance between begin() and end() ";<br>
-       distance_matcher_.DescribeTo(os);<br>
+  public:<br>
+    typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
+    typedef internal::StlContainerView<RawContainer> View;<br>
+    typedef typename View::type StlContainer;<br>
+    typedef typename View::const_reference StlContainerReference;<br>
+    typedef decltype(std::begin(<br>
+        std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
+    typedef typename std::iterator_traits<<br>
+        StlContainerConstIterator>::<br>
diff erence_type DistanceType;<br>
+    explicit Impl(const DistanceMatcher& distance_matcher)<br>
+        : distance_matcher_(MatcherCast<DistanceType>(distance_matcher)) {}<br>
+<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
+      *os << "distance between begin() and end() ";<br>
+      distance_matcher_.DescribeTo(os);<br>
     }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "distance between begin() and end() ";<br>
       distance_matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(Container container,<br>
-                                 MatchResultListener* listener) const {<br>
-#if GTEST_HAS_STD_BEGIN_AND_END_<br>
+    bool MatchAndExplain(Container container,<br>
+                         MatchResultListener* listener) const override {<br>
       using std::begin;<br>
       using std::end;<br>
       DistanceType distance = std::distance(begin(container), end(container));<br>
-#else<br>
-      DistanceType distance = std::distance(container.begin(), container.end());<br>
-#endif<br>
       StringMatchResultListener distance_listener;<br>
       const bool result =<br>
           distance_matcher_.MatchAndExplain(distance, &distance_listener);<br>
@@ -2850,15 +2082,15 @@ class ContainerEqMatcher {<br>
   typedef typename View::type StlContainer;<br>
   typedef typename View::const_reference StlContainerReference;<br>
<br>
+  static_assert(!std::is_const<Container>::value,<br>
+                "Container type must not be const");<br>
+  static_assert(!std::is_reference<Container>::value,<br>
+                "Container type must not be a reference");<br>
+<br>
   // We make a copy of expected in case the elements in it are modified<br>
   // after this matcher is created.<br>
   explicit ContainerEqMatcher(const Container& expected)<br>
-      : expected_(View::Copy(expected)) {<br>
-    // Makes sure the user doesn't instantiate this class template<br>
-    // with a const or reference type.<br>
-    (void)testing::StaticAssertTypeEq<Container,<br>
-        GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>();<br>
-  }<br>
+      : expected_(View::Copy(expected)) {}<br>
<br>
   void DescribeTo(::std::ostream* os) const {<br>
     *os << "equals ";<br>
@@ -2872,9 +2104,8 @@ class ContainerEqMatcher {<br>
   template <typename LhsContainer><br>
   bool MatchAndExplain(const LhsContainer& lhs,<br>
                        MatchResultListener* listener) const {<br>
-    // GTEST_REMOVE_CONST_() is needed to work around an MSVC 8.0 bug<br>
-    // that causes LhsContainer to be a const type sometimes.<br>
-    typedef internal::StlContainerView<GTEST_REMOVE_CONST_(LhsContainer)><br>
+    typedef internal::StlContainerView<<br>
+        typename std::remove_const<LhsContainer>::type><br>
         LhsView;<br>
     typedef typename LhsView::type LhsStlContainer;<br>
     StlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
@@ -2882,7 +2113,7 @@ class ContainerEqMatcher {<br>
       return true;<br>
<br>
     ::std::ostream* const os = listener->stream();<br>
-    if (os != NULL) {<br>
+    if (os != nullptr) {<br>
       // Something is <br>
diff erent. Check for extra values first.<br>
       bool printed_header = false;<br>
       for (typename LhsStlContainer::const_iterator it =<br>
@@ -2962,18 +2193,18 @@ class WhenSortedByMatcher {<br>
     Impl(const Comparator& comparator, const ContainerMatcher& matcher)<br>
         : comparator_(comparator), matcher_(matcher) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "(when sorted) ";<br>
       matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "(when sorted) ";<br>
       matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(LhsContainer lhs,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(LhsContainer lhs,<br>
+                         MatchResultListener* listener) const override {<br>
       LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
       ::std::vector<LhsValue> sorted_container(lhs_stl_container.begin(),<br>
                                                lhs_stl_container.end());<br>
@@ -3012,7 +2243,7 @@ class WhenSortedByMatcher {<br>
 };<br>
<br>
 // Implements Pointwise(tuple_matcher, rhs_container).  tuple_matcher<br>
-// must be able to be safely cast to Matcher<tuple<const T1&, const<br>
+// must be able to be safely cast to Matcher<std::tuple<const T1&, const<br>
 // T2&> >, where T1 and T2 are the types of elements in the LHS<br>
 // container and the RHS container respectively.<br>
 template <typename TupleMatcher, typename RhsContainer><br>
@@ -3026,15 +2257,15 @@ class PointwiseMatcher {<br>
   typedef typename RhsView::type RhsStlContainer;<br>
   typedef typename RhsStlContainer::value_type RhsValue;<br>
<br>
+  static_assert(!std::is_const<RhsContainer>::value,<br>
+                "RhsContainer type must not be const");<br>
+  static_assert(!std::is_reference<RhsContainer>::value,<br>
+                "RhsContainer type must not be a reference");<br>
+<br>
   // Like ContainerEq, we make a copy of rhs in case the elements in<br>
   // it are modified after this matcher is created.<br>
   PointwiseMatcher(const TupleMatcher& tuple_matcher, const RhsContainer& rhs)<br>
-      : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {<br>
-    // Makes sure the user doesn't instantiate this class template<br>
-    // with a const or reference type.<br>
-    (void)testing::StaticAssertTypeEq<RhsContainer,<br>
-        GTEST_REMOVE_REFERENCE_AND_CONST_(RhsContainer)>();<br>
-  }<br>
+      : tuple_matcher_(tuple_matcher), rhs_(RhsView::Copy(rhs)) {}<br>
<br>
   template <typename LhsContainer><br>
   operator Matcher<LhsContainer>() const {<br>
@@ -3042,7 +2273,8 @@ class PointwiseMatcher {<br>
         !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(LhsContainer)>::value,<br>
         use_UnorderedPointwise_with_hash_tables);<br>
<br>
-    return MakeMatcher(new Impl<LhsContainer>(tuple_matcher_, rhs_));<br>
+    return Matcher<LhsContainer>(<br>
+        new Impl<const LhsContainer&>(tuple_matcher_, rhs_));<br>
   }<br>
<br>
   template <typename LhsContainer><br>
@@ -3057,21 +2289,21 @@ class PointwiseMatcher {<br>
     // reference, as they may be expensive to copy.  We must use tuple<br>
     // instead of pair here, as a pair cannot hold references (C++ 98,<br>
     // 20.2.2 [lib.pairs]).<br>
-    typedef ::testing::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;<br>
+    typedef ::std::tuple<const LhsValue&, const RhsValue&> InnerMatcherArg;<br>
<br>
     Impl(const TupleMatcher& tuple_matcher, const RhsStlContainer& rhs)<br>
         // mono_tuple_matcher_ holds a monomorphic version of the tuple matcher.<br>
         : mono_tuple_matcher_(SafeMatcherCast<InnerMatcherArg>(tuple_matcher)),<br>
           rhs_(rhs) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "contains " << rhs_.size()<br>
           << " values, where each value and its corresponding value in ";<br>
       UniversalPrinter<RhsStlContainer>::Print(rhs_, os);<br>
       *os << " ";<br>
       mono_tuple_matcher_.DescribeTo(os);<br>
     }<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "doesn't contain exactly " << rhs_.size()<br>
           << " values, or contains a value x at some index i"<br>
           << " where x and the i-th value of ";<br>
@@ -3080,8 +2312,8 @@ class PointwiseMatcher {<br>
       mono_tuple_matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(LhsContainer lhs,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(LhsContainer lhs,<br>
+                         MatchResultListener* listener) const override {<br>
       LhsStlContainerReference lhs_stl_container = LhsView::ConstReference(lhs);<br>
       const size_t actual_size = lhs_stl_container.size();<br>
       if (actual_size != rhs_.size()) {<br>
@@ -3188,18 +2420,18 @@ class ContainsMatcherImpl : public QuantifierMatcherImpl<Container> {<br>
       : QuantifierMatcherImpl<Container>(inner_matcher) {}<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "contains at least one element that ";<br>
     this->inner_matcher_.DescribeTo(os);<br>
   }<br>
<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "doesn't contain any element that ";<br>
     this->inner_matcher_.DescribeTo(os);<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(Container container,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(Container container,<br>
+                       MatchResultListener* listener) const override {<br>
     return this->MatchAndExplainImpl(false, container, listener);<br>
   }<br>
<br>
@@ -3217,18 +2449,18 @@ class EachMatcherImpl : public QuantifierMatcherImpl<Container> {<br>
       : QuantifierMatcherImpl<Container>(inner_matcher) {}<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "only contains elements that ";<br>
     this->inner_matcher_.DescribeTo(os);<br>
   }<br>
<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "contains some element that ";<br>
     this->inner_matcher_.DescribeNegationTo(os);<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(Container container,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(Container container,<br>
+                       MatchResultListener* listener) const override {<br>
     return this->MatchAndExplainImpl(true, container, listener);<br>
   }<br>
<br>
@@ -3244,7 +2476,8 @@ class ContainsMatcher {<br>
<br>
   template <typename Container><br>
   operator Matcher<Container>() const {<br>
-    return MakeMatcher(new ContainsMatcherImpl<Container>(inner_matcher_));<br>
+    return Matcher<Container>(<br>
+        new ContainsMatcherImpl<const Container&>(inner_matcher_));<br>
   }<br>
<br>
  private:<br>
@@ -3261,7 +2494,8 @@ class EachMatcher {<br>
<br>
   template <typename Container><br>
   operator Matcher<Container>() const {<br>
-    return MakeMatcher(new EachMatcherImpl<Container>(inner_matcher_));<br>
+    return Matcher<Container>(<br>
+        new EachMatcherImpl<const Container&>(inner_matcher_));<br>
   }<br>
<br>
  private:<br>
@@ -3274,7 +2508,6 @@ struct Rank1 {};<br>
 struct Rank0 : Rank1 {};<br>
<br>
 namespace pair_getters {<br>
-#if GTEST_LANG_CXX11<br>
 using std::get;<br>
 template <typename T><br>
 auto First(T& x, Rank1) -> decltype(get<0>(x)) {  // NOLINT<br>
@@ -3293,25 +2526,6 @@ template <typename T><br>
 auto Second(T& x, Rank0) -> decltype((x.second)) {  // NOLINT<br>
   return x.second;<br>
 }<br>
-#else<br>
-template <typename T><br>
-typename T::first_type& First(T& x, Rank0) {  // NOLINT<br>
-  return x.first;<br>
-}<br>
-template <typename T><br>
-const typename T::first_type& First(const T& x, Rank0) {<br>
-  return x.first;<br>
-}<br>
-<br>
-template <typename T><br>
-typename T::second_type& Second(T& x, Rank0) {  // NOLINT<br>
-  return x.second;<br>
-}<br>
-template <typename T><br>
-const typename T::second_type& Second(const T& x, Rank0) {<br>
-  return x.second;<br>
-}<br>
-#endif  // GTEST_LANG_CXX11<br>
 }  // namespace pair_getters<br>
<br>
 // Implements Key(inner_matcher) for the given argument pair type.<br>
@@ -3330,9 +2544,10 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {<br>
           testing::SafeMatcherCast<const KeyType&>(inner_matcher)) {<br>
   }<br>
<br>
-  // Returns true iff 'key_value.first' (the key) matches the inner matcher.<br>
-  virtual bool MatchAndExplain(PairType key_value,<br>
-                               MatchResultListener* listener) const {<br>
+  // Returns true if and only if 'key_value.first' (the key) matches the inner<br>
+  // matcher.<br>
+  bool MatchAndExplain(PairType key_value,<br>
+                       MatchResultListener* listener) const override {<br>
     StringMatchResultListener inner_listener;<br>
     const bool match = inner_matcher_.MatchAndExplain(<br>
         pair_getters::First(key_value, Rank0()), &inner_listener);<br>
@@ -3344,13 +2559,13 @@ class KeyMatcherImpl : public MatcherInterface<PairType> {<br>
   }<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "has a key that ";<br>
     inner_matcher_.DescribeTo(os);<br>
   }<br>
<br>
   // Describes what the negation of this matcher does.<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "doesn't have a key that ";<br>
     inner_matcher_.DescribeTo(os);<br>
   }<br>
@@ -3369,7 +2584,8 @@ class KeyMatcher {<br>
<br>
   template <typename PairType><br>
   operator Matcher<PairType>() const {<br>
-    return MakeMatcher(new KeyMatcherImpl<PairType>(matcher_for_key_));<br>
+    return Matcher<PairType>(<br>
+        new KeyMatcherImpl<const PairType&>(matcher_for_key_));<br>
   }<br>
<br>
  private:<br>
@@ -3396,7 +2612,7 @@ class PairMatcherImpl : public MatcherInterface<PairType> {<br>
   }<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     *os << "has a first field that ";<br>
     first_matcher_.DescribeTo(os);<br>
     *os << ", and has a second field that ";<br>
@@ -3404,17 +2620,17 @@ class PairMatcherImpl : public MatcherInterface<PairType> {<br>
   }<br>
<br>
   // Describes what the negation of this matcher does.<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     *os << "has a first field that ";<br>
     first_matcher_.DescribeNegationTo(os);<br>
     *os << ", or has a second field that ";<br>
     second_matcher_.DescribeNegationTo(os);<br>
   }<br>
<br>
-  // Returns true iff 'a_pair.first' matches first_matcher and 'a_pair.second'<br>
-  // matches second_matcher.<br>
-  virtual bool MatchAndExplain(PairType a_pair,<br>
-                               MatchResultListener* listener) const {<br>
+  // Returns true if and only if 'a_pair.first' matches first_matcher and<br>
+  // 'a_pair.second' matches second_matcher.<br>
+  bool MatchAndExplain(PairType a_pair,<br>
+                       MatchResultListener* listener) const override {<br>
     if (!listener->IsInterested()) {<br>
       // If the listener is not interested, we don't need to construct the<br>
       // explanation.<br>
@@ -3474,9 +2690,8 @@ class PairMatcher {<br>
<br>
   template <typename PairType><br>
   operator Matcher<PairType> () const {<br>
-    return MakeMatcher(<br>
-        new PairMatcherImpl<PairType>(<br>
-            first_matcher_, second_matcher_));<br>
+    return Matcher<PairType>(<br>
+        new PairMatcherImpl<const PairType&>(first_matcher_, second_matcher_));<br>
   }<br>
<br>
  private:<br>
@@ -3509,7 +2724,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
   }<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     if (count() == 0) {<br>
       *os << "is empty";<br>
     } else if (count() == 1) {<br>
@@ -3528,7 +2743,7 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
   }<br>
<br>
   // Describes what the negation of this matcher does.<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     if (count() == 0) {<br>
       *os << "isn't empty";<br>
       return;<br>
@@ -3544,8 +2759,8 @@ class ElementsAreMatcherImpl : public MatcherInterface<Container> {<br>
     }<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(Container container,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(Container container,<br>
+                       MatchResultListener* listener) const override {<br>
     // To work with stream-like "containers", we must only walk<br>
     // through the elements in one pass.<br>
<br>
@@ -3749,6 +2964,7 @@ class UnorderedElementsAreMatcherImpl<br>
  public:<br>
   typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
   typedef internal::StlContainerView<RawContainer> View;<br>
+  typedef typename View::type StlContainer;<br>
   typedef typename View::const_reference StlContainerReference;<br>
   typedef decltype(std::begin(<br>
       std::declval<StlContainerReference>())) StlContainerConstIterator;<br>
@@ -3766,17 +2982,17 @@ class UnorderedElementsAreMatcherImpl<br>
   }<br>
<br>
   // Describes what this matcher does.<br>
-  virtual void DescribeTo(::std::ostream* os) const {<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
     return UnorderedElementsAreMatcherImplBase::DescribeToImpl(os);<br>
   }<br>
<br>
   // Describes what the negation of this matcher does.<br>
-  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
     return UnorderedElementsAreMatcherImplBase::DescribeNegationToImpl(os);<br>
   }<br>
<br>
-  virtual bool MatchAndExplain(Container container,<br>
-                               MatchResultListener* listener) const {<br>
+  bool MatchAndExplain(Container container,<br>
+                       MatchResultListener* listener) const override {<br>
     StlContainerReference stl_container = View::ConstReference(container);<br>
     ::std::vector<std::string> element_printouts;<br>
     MatchMatrix matrix =<br>
@@ -3864,11 +3080,13 @@ class UnorderedElementsAreMatcher {<br>
         decltype(*std::declval<StlContainerConstIterator &>())>::type Element;<br>
     typedef ::std::vector<Matcher<const Element&> > MatcherVec;<br>
     MatcherVec matchers;<br>
-    matchers.reserve(::testing::tuple_size<MatcherTuple>::value);<br>
+    matchers.reserve(::std::tuple_size<MatcherTuple>::value);<br>
     TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,<br>
                          ::std::back_inserter(matchers));<br>
-    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(<br>
-        UnorderedMatcherRequire::ExactMatch, matchers.begin(), matchers.end()));<br>
+    return Matcher<Container>(<br>
+        new UnorderedElementsAreMatcherImpl<const Container&>(<br>
+            UnorderedMatcherRequire::ExactMatch, matchers.begin(),<br>
+            matchers.end()));<br>
   }<br>
<br>
  private:<br>
@@ -3886,7 +3104,7 @@ class ElementsAreMatcher {<br>
   operator Matcher<Container>() const {<br>
     GTEST_COMPILE_ASSERT_(<br>
         !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value ||<br>
-            ::testing::tuple_size<MatcherTuple>::value < 2,<br>
+            ::std::tuple_size<MatcherTuple>::value < 2,<br>
         use_UnorderedElementsAre_with_hash_tables);<br>
<br>
     typedef GTEST_REMOVE_REFERENCE_AND_CONST_(Container) RawContainer;<br>
@@ -3898,11 +3116,11 @@ class ElementsAreMatcher {<br>
         decltype(*std::declval<StlContainerConstIterator &>())>::type Element;<br>
     typedef ::std::vector<Matcher<const Element&> > MatcherVec;<br>
     MatcherVec matchers;<br>
-    matchers.reserve(::testing::tuple_size<MatcherTuple>::value);<br>
+    matchers.reserve(::std::tuple_size<MatcherTuple>::value);<br>
     TransformTupleValues(CastAndAppendTransform<const Element&>(), matchers_,<br>
                          ::std::back_inserter(matchers));<br>
-    return MakeMatcher(new ElementsAreMatcherImpl<Container>(<br>
-                           matchers.begin(), matchers.end()));<br>
+    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(<br>
+        matchers.begin(), matchers.end()));<br>
   }<br>
<br>
  private:<br>
@@ -3921,8 +3139,9 @@ class UnorderedElementsAreArrayMatcher {<br>
<br>
   template <typename Container><br>
   operator Matcher<Container>() const {<br>
-    return MakeMatcher(new UnorderedElementsAreMatcherImpl<Container>(<br>
-        match_flags_, matchers_.begin(), matchers_.end()));<br>
+    return Matcher<Container>(<br>
+        new UnorderedElementsAreMatcherImpl<const Container&>(<br>
+            match_flags_, matchers_.begin(), matchers_.end()));<br>
   }<br>
<br>
  private:<br>
@@ -3945,7 +3164,7 @@ class ElementsAreArrayMatcher {<br>
         !IsHashTable<GTEST_REMOVE_REFERENCE_AND_CONST_(Container)>::value,<br>
         use_UnorderedElementsAreArray_with_hash_tables);<br>
<br>
-    return MakeMatcher(new ElementsAreMatcherImpl<Container>(<br>
+    return Matcher<Container>(new ElementsAreMatcherImpl<const Container&>(<br>
         matchers_.begin(), matchers_.end()));<br>
   }<br>
<br>
@@ -3957,8 +3176,8 @@ class ElementsAreArrayMatcher {<br>
<br>
 // Given a 2-tuple matcher tm of type Tuple2Matcher and a value second<br>
 // of type Second, BoundSecondMatcher<Tuple2Matcher, Second>(tm,<br>
-// second) is a polymorphic matcher that matches a value x iff tm<br>
-// matches tuple (x, second).  Useful for implementing<br>
+// second) is a polymorphic matcher that matches a value x if and only if<br>
+// tm matches tuple (x, second).  Useful for implementing<br>
 // UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
 //<br>
 // BoundSecondMatcher is copyable and assignable, as we need to put<br>
@@ -3991,20 +3210,20 @@ class BoundSecondMatcher {<br>
   template <typename T><br>
   class Impl : public MatcherInterface<T> {<br>
    public:<br>
-    typedef ::testing::tuple<T, Second> ArgTuple;<br>
+    typedef ::std::tuple<T, Second> ArgTuple;<br>
<br>
     Impl(const Tuple2Matcher& tm, const Second& second)<br>
         : mono_tuple2_matcher_(SafeMatcherCast<const ArgTuple&>(tm)),<br>
           second_value_(second) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "and ";<br>
       UniversalPrint(second_value_, os);<br>
       *os << " ";<br>
       mono_tuple2_matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(T x, MatchResultListener* listener) const override {<br>
       return mono_tuple2_matcher_.MatchAndExplain(ArgTuple(x, second_value_),<br>
                                                   listener);<br>
     }<br>
@@ -4022,8 +3241,8 @@ class BoundSecondMatcher {<br>
<br>
 // Given a 2-tuple matcher tm and a value second,<br>
 // MatcherBindSecond(tm, second) returns a matcher that matches a<br>
-// value x iff tm matches tuple (x, second).  Useful for implementing<br>
-// UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
+// value x if and only if tm matches tuple (x, second).  Useful for<br>
+// implementing UnorderedPointwise() in terms of UnorderedElementsAreArray().<br>
 template <typename Tuple2Matcher, typename Second><br>
 BoundSecondMatcher<Tuple2Matcher, Second> MatcherBindSecond(<br>
     const Tuple2Matcher& tm, const Second& second) {<br>
@@ -4048,7 +3267,7 @@ class OptionalMatcher {<br>
<br>
   template <typename Optional><br>
   operator Matcher<Optional>() const {<br>
-    return MakeMatcher(new Impl<Optional>(value_matcher_));<br>
+    return Matcher<Optional>(new Impl<const Optional&>(value_matcher_));<br>
   }<br>
<br>
   template <typename Optional><br>
@@ -4059,18 +3278,18 @@ class OptionalMatcher {<br>
     explicit Impl(const ValueMatcher& value_matcher)<br>
         : value_matcher_(MatcherCast<ValueType>(value_matcher)) {}<br>
<br>
-    virtual void DescribeTo(::std::ostream* os) const {<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
       *os << "value ";<br>
       value_matcher_.DescribeTo(os);<br>
     }<br>
<br>
-    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
       *os << "value ";<br>
       value_matcher_.DescribeNegationTo(os);<br>
     }<br>
<br>
-    virtual bool MatchAndExplain(Optional optional,<br>
-                                 MatchResultListener* listener) const {<br>
+    bool MatchAndExplain(Optional optional,<br>
+                         MatchResultListener* listener) const override {<br>
       if (!optional) {<br>
         *listener << "which is not engaged";<br>
         return false;<br>
@@ -4106,11 +3325,12 @@ template <typename T><br>
 class VariantMatcher {<br>
  public:<br>
   explicit VariantMatcher(::testing::Matcher<const T&> matcher)<br>
-      : matcher_(internal::move(matcher)) {}<br>
+      : matcher_(std::move(matcher)) {}<br>
<br>
   template <typename Variant><br>
   bool MatchAndExplain(const Variant& value,<br>
                        ::testing::MatchResultListener* listener) const {<br>
+    using std::get;<br>
     if (!listener->IsInterested()) {<br>
       return holds_alternative<T>(value) && matcher_.Matches(get<T>(value));<br>
     }<br>
@@ -4173,11 +3393,11 @@ class AnyCastMatcher {<br>
                        ::testing::MatchResultListener* listener) const {<br>
     if (!listener->IsInterested()) {<br>
       const T* ptr = any_cast<T>(&value);<br>
-      return ptr != NULL && matcher_.Matches(*ptr);<br>
+      return ptr != nullptr && matcher_.Matches(*ptr);<br>
     }<br>
<br>
     const T* elem = any_cast<T>(&value);<br>
-    if (elem == NULL) {<br>
+    if (elem == nullptr) {<br>
       *listener << "whose value is not of type '" << GetTypeName() << "'";<br>
       return false;<br>
     }<br>
@@ -4215,6 +3435,80 @@ class AnyCastMatcher {<br>
 };<br>
<br>
 }  // namespace any_cast_matcher<br>
+<br>
+// Implements the Args() matcher.<br>
+template <class ArgsTuple, size_t... k><br>
+class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {<br>
+ public:<br>
+  using RawArgsTuple = typename std::decay<ArgsTuple>::type;<br>
+  using SelectedArgs =<br>
+      std::tuple<typename std::tuple_element<k, RawArgsTuple>::type...>;<br>
+  using MonomorphicInnerMatcher = Matcher<const SelectedArgs&>;<br>
+<br>
+  template <typename InnerMatcher><br>
+  explicit ArgsMatcherImpl(const InnerMatcher& inner_matcher)<br>
+      : inner_matcher_(SafeMatcherCast<const SelectedArgs&>(inner_matcher)) {}<br>
+<br>
+  bool MatchAndExplain(ArgsTuple args,<br>
+                       MatchResultListener* listener) const override {<br>
+    // Workaround spurious C4100 on MSVC<=15.7 when k is empty.<br>
+    (void)args;<br>
+    const SelectedArgs& selected_args =<br>
+        std::forward_as_tuple(std::get<k>(args)...);<br>
+    if (!listener->IsInterested()) return inner_matcher_.Matches(selected_args);<br>
+<br>
+    PrintIndices(listener->stream());<br>
+    *listener << "are " << PrintToString(selected_args);<br>
+<br>
+    StringMatchResultListener inner_listener;<br>
+    const bool match =<br>
+        inner_matcher_.MatchAndExplain(selected_args, &inner_listener);<br>
+    PrintIfNotEmpty(inner_listener.str(), listener->stream());<br>
+    return match;<br>
+  }<br>
+<br>
+  void DescribeTo(::std::ostream* os) const override {<br>
+    *os << "are a tuple ";<br>
+    PrintIndices(os);<br>
+    inner_matcher_.DescribeTo(os);<br>
+  }<br>
+<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
+    *os << "are a tuple ";<br>
+    PrintIndices(os);<br>
+    inner_matcher_.DescribeNegationTo(os);<br>
+  }<br>
+<br>
+ private:<br>
+  // Prints the indices of the selected fields.<br>
+  static void PrintIndices(::std::ostream* os) {<br>
+    *os << "whose fields (";<br>
+    const char* sep = "";<br>
+    // Workaround spurious C4189 on MSVC<=15.7 when k is empty.<br>
+    (void)sep;<br>
+    const char* dummy[] = {"", (*os << sep << "#" << k, sep = ", ")...};<br>
+    (void)dummy;<br>
+    *os << ") ";<br>
+  }<br>
+<br>
+  MonomorphicInnerMatcher inner_matcher_;<br>
+};<br>
+<br>
+template <class InnerMatcher, size_t... k><br>
+class ArgsMatcher {<br>
+ public:<br>
+  explicit ArgsMatcher(InnerMatcher inner_matcher)<br>
+      : inner_matcher_(std::move(inner_matcher)) {}<br>
+<br>
+  template <typename ArgsTuple><br>
+  operator Matcher<ArgsTuple>() const {  // NOLINT<br>
+    return MakeMatcher(new ArgsMatcherImpl<ArgsTuple, k...>(inner_matcher_));<br>
+  }<br>
+<br>
+ private:<br>
+  InnerMatcher inner_matcher_;<br>
+};<br>
+<br>
 }  // namespace internal<br>
<br>
 // ElementsAreArray(iterator_first, iterator_last)<br>
@@ -4258,13 +3552,11 @@ ElementsAreArray(const Container& container) {<br>
   return ElementsAreArray(container.begin(), container.end());<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
 template <typename T><br>
 inline internal::ElementsAreArrayMatcher<T><br>
 ElementsAreArray(::std::initializer_list<T> xs) {<br>
   return ElementsAreArray(xs.begin(), xs.end());<br>
 }<br>
-#endif<br>
<br>
 // UnorderedElementsAreArray(iterator_first, iterator_last)<br>
 // UnorderedElementsAreArray(pointer, count)<br>
@@ -4307,13 +3599,11 @@ UnorderedElementsAreArray(const Container& container) {<br>
   return UnorderedElementsAreArray(container.begin(), container.end());<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
 template <typename T><br>
 inline internal::UnorderedElementsAreArrayMatcher<T><br>
 UnorderedElementsAreArray(::std::initializer_list<T> xs) {<br>
   return UnorderedElementsAreArray(xs.begin(), xs.end());<br>
 }<br>
-#endif<br>
<br>
 // _ is a matcher that matches anything of any type.<br>
 //<br>
@@ -4335,70 +3625,13 @@ inline Matcher<T> A() {<br>
 template <typename T><br>
 inline Matcher<T> An() { return A<T>(); }<br>
<br>
-// Creates a polymorphic matcher that matches anything equal to x.<br>
-// Note: if the parameter of Eq() were declared as const T&, Eq("foo")<br>
-// wouldn't compile.<br>
-template <typename T><br>
-inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }<br>
-<br>
-// Constructs a Matcher<T> from a 'value' of type T.  The constructed<br>
-// matcher matches any value that's equal to 'value'.<br>
-template <typename T><br>
-Matcher<T>::Matcher(T value) { *this = Eq(value); }<br>
-<br>
 template <typename T, typename M><br>
 Matcher<T> internal::MatcherCastImpl<T, M>::CastImpl(<br>
-    const M& value,<br>
-    internal::BooleanConstant<false> /* convertible_to_matcher */,<br>
-    internal::BooleanConstant<false> /* convertible_to_T */) {<br>
+    const M& value, std::false_type /* convertible_to_matcher */,<br>
+    std::false_type /* convertible_to_T */) {<br>
   return Eq(value);<br>
 }<br>
<br>
-// Creates a monomorphic matcher that matches anything with type Lhs<br>
-// and equal to rhs.  A user may need to use this instead of Eq(...)<br>
-// in order to resolve an overloading ambiguity.<br>
-//<br>
-// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))<br>
-// or Matcher<T>(x), but more readable than the latter.<br>
-//<br>
-// We could define similar monomorphic matchers for other comparison<br>
-// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do<br>
-// it yet as those are used much less than Eq() in practice.  A user<br>
-// can always write Matcher<T>(Lt(5)) to be explicit about the type,<br>
-// for example.<br>
-template <typename Lhs, typename Rhs><br>
-inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }<br>
-<br>
-// Creates a polymorphic matcher that matches anything >= x.<br>
-template <typename Rhs><br>
-inline internal::GeMatcher<Rhs> Ge(Rhs x) {<br>
-  return internal::GeMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything > x.<br>
-template <typename Rhs><br>
-inline internal::GtMatcher<Rhs> Gt(Rhs x) {<br>
-  return internal::GtMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything <= x.<br>
-template <typename Rhs><br>
-inline internal::LeMatcher<Rhs> Le(Rhs x) {<br>
-  return internal::LeMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything < x.<br>
-template <typename Rhs><br>
-inline internal::LtMatcher<Rhs> Lt(Rhs x) {<br>
-  return internal::LtMatcher<Rhs>(x);<br>
-}<br>
-<br>
-// Creates a polymorphic matcher that matches anything != x.<br>
-template <typename Rhs><br>
-inline internal::NeMatcher<Rhs> Ne(Rhs x) {<br>
-  return internal::NeMatcher<Rhs>(x);<br>
-}<br>
-<br>
 // Creates a polymorphic matcher that matches any NULL pointer.<br>
 inline PolymorphicMatcher<internal::IsNullMatcher > IsNull() {<br>
   return MakePolymorphicMatcher(internal::IsNullMatcher());<br>
@@ -4500,7 +3733,7 @@ WhenDynamicCastTo(const Matcher<To>& inner_matcher) {<br>
 // Creates a matcher that matches an object whose given field matches<br>
 // 'matcher'.  For example,<br>
 //   Field(&Foo::number, Ge(5))<br>
-// matches a Foo object x iff x.number >= 5.<br>
+// matches a Foo object x if and only if x.number >= 5.<br>
 template <typename Class, typename FieldType, typename FieldMatcher><br>
 inline PolymorphicMatcher<<br>
   internal::FieldMatcher<Class, FieldType> > Field(<br>
@@ -4527,7 +3760,7 @@ inline PolymorphicMatcher<internal::FieldMatcher<Class, FieldType> > Field(<br>
 // Creates a matcher that matches an object whose given property<br>
 // matches 'matcher'.  For example,<br>
 //   Property(&Foo::str, StartsWith("hi"))<br>
-// matches a Foo object x iff x.str() starts with "hi".<br>
+// matches a Foo object x if and only if x.str() starts with "hi".<br>
 template <typename Class, typename PropertyType, typename PropertyMatcher><br>
 inline PolymorphicMatcher<internal::PropertyMatcher<<br>
     Class, PropertyType, PropertyType (Class::*)() const> ><br>
@@ -4536,8 +3769,7 @@ Property(PropertyType (Class::*property)() const,<br>
   return MakePolymorphicMatcher(<br>
       internal::PropertyMatcher<Class, PropertyType,<br>
                                 PropertyType (Class::*)() const>(<br>
-          property,<br>
-          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+          property, MatcherCast<const PropertyType&>(matcher)));<br>
   // The call to MatcherCast() is required for supporting inner<br>
   // matchers of compatible types.  For example, it allows<br>
   //   Property(&Foo::bar, m)<br>
@@ -4555,11 +3787,9 @@ Property(const std::string& property_name,<br>
   return MakePolymorphicMatcher(<br>
       internal::PropertyMatcher<Class, PropertyType,<br>
                                 PropertyType (Class::*)() const>(<br>
-          property_name, property,<br>
-          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+          property_name, property, MatcherCast<const PropertyType&>(matcher)));<br>
 }<br>
<br>
-#if GTEST_LANG_CXX11<br>
 // The same as above but for reference-qualified member functions.<br>
 template <typename Class, typename PropertyType, typename PropertyMatcher><br>
 inline PolymorphicMatcher<internal::PropertyMatcher<<br>
@@ -4568,9 +3798,8 @@ Property(PropertyType (Class::*property)() const &,<br>
          const PropertyMatcher& matcher) {<br>
   return MakePolymorphicMatcher(<br>
       internal::PropertyMatcher<Class, PropertyType,<br>
-                                PropertyType (Class::*)() const &>(<br>
-          property,<br>
-          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+                                PropertyType (Class::*)() const&>(<br>
+          property, MatcherCast<const PropertyType&>(matcher)));<br>
 }<br>
<br>
 // Three-argument form for reference-qualified member functions.<br>
@@ -4582,17 +3811,14 @@ Property(const std::string& property_name,<br>
          const PropertyMatcher& matcher) {<br>
   return MakePolymorphicMatcher(<br>
       internal::PropertyMatcher<Class, PropertyType,<br>
-                                PropertyType (Class::*)() const &>(<br>
-          property_name, property,<br>
-          MatcherCast<GTEST_REFERENCE_TO_CONST_(PropertyType)>(matcher)));<br>
+                                PropertyType (Class::*)() const&>(<br>
+          property_name, property, MatcherCast<const PropertyType&>(matcher)));<br>
 }<br>
-#endif<br>
<br>
-// Creates a matcher that matches an object iff the result of applying<br>
-// a callable to x matches 'matcher'.<br>
-// For example,<br>
+// Creates a matcher that matches an object if and only if the result of<br>
+// applying a callable to x matches 'matcher'. For example,<br>
 //   ResultOf(f, StartsWith("hi"))<br>
-// matches a Foo object x iff f(x) starts with "hi".<br>
+// matches a Foo object x if and only if f(x) starts with "hi".<br>
 // `callable` parameter can be a function, function pointer, or a functor. It is<br>
 // required to keep no state affecting the results of the calls on it and make<br>
 // no assumptions about how many calls will be made. Any state it keeps must be<br>
@@ -4601,7 +3827,7 @@ template <typename Callable, typename InnerMatcher><br>
 internal::ResultOfMatcher<Callable, InnerMatcher> ResultOf(<br>
     Callable callable, InnerMatcher matcher) {<br>
   return internal::ResultOfMatcher<Callable, InnerMatcher>(<br>
-      internal::move(callable), internal::move(matcher));<br>
+      std::move(callable), std::move(matcher));<br>
 }<br>
<br>
 // String matchers.<br>
@@ -4655,29 +3881,7 @@ inline PolymorphicMatcher<internal::EndsWithMatcher<std::string> > EndsWith(<br>
   return MakePolymorphicMatcher(internal::EndsWithMatcher<std::string>(suffix));<br>
 }<br>
<br>
-// Matches a string that fully matches regular expression 'regex'.<br>
-// The matcher takes ownership of 'regex'.<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
-    const internal::RE* regex) {<br>
-  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));<br>
-}<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
-    const std::string& regex) {<br>
-  return MatchesRegex(new internal::RE(regex));<br>
-}<br>
-<br>
-// Matches a string that contains regular expression 'regex'.<br>
-// The matcher takes ownership of 'regex'.<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
-    const internal::RE* regex) {<br>
-  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));<br>
-}<br>
-inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
-    const std::string& regex) {<br>
-  return ContainsRegex(new internal::RE(regex));<br>
-}<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING<br>
+#if GTEST_HAS_STD_WSTRING<br>
 // Wide string matchers.<br>
<br>
 // Matches a string equal to str.<br>
@@ -4730,7 +3934,7 @@ inline PolymorphicMatcher<internal::EndsWithMatcher<std::wstring> > EndsWith(<br>
       internal::EndsWithMatcher<std::wstring>(suffix));<br>
 }<br>
<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING || GTEST_HAS_STD_WSTRING<br>
+#endif  // GTEST_HAS_STD_WSTRING<br>
<br>
 // Creates a polymorphic matcher that matches a 2-tuple where the<br>
 // first field == the second field.<br>
@@ -4852,12 +4056,12 @@ BeginEndDistanceIs(const DistanceMatcher& distance_matcher) {<br>
 // values that are included in one container but not the other. (Duplicate<br>
 // values and order <br>
diff erences are not explained.)<br>
 template <typename Container><br>
-inline PolymorphicMatcher<internal::ContainerEqMatcher<  // NOLINT<br>
-                            GTEST_REMOVE_CONST_(Container)> ><br>
-    ContainerEq(const Container& rhs) {<br>
+inline PolymorphicMatcher<internal::ContainerEqMatcher<<br>
+    typename std::remove_const<Container>::type>><br>
+ContainerEq(const Container& rhs) {<br>
   // This following line is for working around a bug in MSVC 8.0,<br>
   // which causes Container to be a const type sometimes.<br>
-  typedef GTEST_REMOVE_CONST_(Container) RawContainer;<br>
+  typedef typename std::remove_const<Container>::type RawContainer;<br>
   return MakePolymorphicMatcher(<br>
       internal::ContainerEqMatcher<RawContainer>(rhs));<br>
 }<br>
@@ -4885,22 +4089,21 @@ WhenSorted(const ContainerMatcher& container_matcher) {<br>
 // Matches an STL-style container or a native array that contains the<br>
 // same number of elements as in rhs, where its i-th element and rhs's<br>
 // i-th element (as a pair) satisfy the given pair matcher, for all i.<br>
-// TupleMatcher must be able to be safely cast to Matcher<tuple<const<br>
+// TupleMatcher must be able to be safely cast to Matcher<std::tuple<const<br>
 // T1&, const T2&> >, where T1 and T2 are the types of elements in the<br>
 // LHS container and the RHS container respectively.<br>
 template <typename TupleMatcher, typename Container><br>
 inline internal::PointwiseMatcher<TupleMatcher,<br>
-                                  GTEST_REMOVE_CONST_(Container)><br>
+                                  typename std::remove_const<Container>::type><br>
 Pointwise(const TupleMatcher& tuple_matcher, const Container& rhs) {<br>
   // This following line is for working around a bug in MSVC 8.0,<br>
   // which causes Container to be a const type sometimes (e.g. when<br>
   // rhs is a const int[])..<br>
-  typedef GTEST_REMOVE_CONST_(Container) RawContainer;<br>
+  typedef typename std::remove_const<Container>::type RawContainer;<br>
   return internal::PointwiseMatcher<TupleMatcher, RawContainer>(<br>
       tuple_matcher, rhs);<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
 // Supports the Pointwise(m, {a, b, c}) syntax.<br>
 template <typename TupleMatcher, typename T><br>
@@ -4909,14 +4112,13 @@ inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(<br>
   return Pointwise(tuple_matcher, std::vector<T>(rhs));<br>
 }<br>
<br>
-#endif  // GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
 // UnorderedPointwise(pair_matcher, rhs) matches an STL-style<br>
 // container or a native array that contains the same number of<br>
 // elements as in rhs, where in some permutation of the container, its<br>
 // i-th element and rhs's i-th element (as a pair) satisfy the given<br>
 // pair matcher, for all i.  Tuple2Matcher must be able to be safely<br>
-// cast to Matcher<tuple<const T1&, const T2&> >, where T1 and T2 are<br>
+// cast to Matcher<std::tuple<const T1&, const T2&> >, where T1 and T2 are<br>
 // the types of elements in the LHS container and the RHS container<br>
 // respectively.<br>
 //<br>
@@ -4925,14 +4127,15 @@ inline internal::PointwiseMatcher<TupleMatcher, std::vector<T> > Pointwise(<br>
 template <typename Tuple2Matcher, typename RhsContainer><br>
 inline internal::UnorderedElementsAreArrayMatcher<<br>
     typename internal::BoundSecondMatcher<<br>
-        Tuple2Matcher, typename internal::StlContainerView<GTEST_REMOVE_CONST_(<br>
-                           RhsContainer)>::type::value_type> ><br>
+        Tuple2Matcher,<br>
+        typename internal::StlContainerView<<br>
+            typename std::remove_const<RhsContainer>::type>::type::value_type>><br>
 UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
                    const RhsContainer& rhs_container) {<br>
   // This following line is for working around a bug in MSVC 8.0,<br>
   // which causes RhsContainer to be a const type sometimes (e.g. when<br>
   // rhs_container is a const int[]).<br>
-  typedef GTEST_REMOVE_CONST_(RhsContainer) RawRhsContainer;<br>
+  typedef typename std::remove_const<RhsContainer>::type RawRhsContainer;<br>
<br>
   // RhsView allows the same code to handle RhsContainer being a<br>
   // STL-style container and it being a native C-style array.<br>
@@ -4954,7 +4157,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
   return UnorderedElementsAreArray(matchers);<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
 // Supports the UnorderedPointwise(m, {a, b, c}) syntax.<br>
 template <typename Tuple2Matcher, typename T><br>
@@ -4965,7 +4167,6 @@ UnorderedPointwise(const Tuple2Matcher& tuple2_matcher,<br>
   return UnorderedPointwise(tuple2_matcher, std::vector<T>(rhs));<br>
 }<br>
<br>
-#endif  // GTEST_HAS_STD_INITIALIZER_LIST_<br>
<br>
 // Matches an STL-style container or a native array that contains at<br>
 // least one element matching the given value or matcher.<br>
@@ -5045,13 +4246,11 @@ IsSupersetOf(const Container& container) {<br>
   return IsSupersetOf(container.begin(), container.end());<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
 template <typename T><br>
 inline internal::UnorderedElementsAreArrayMatcher<T> IsSupersetOf(<br>
     ::std::initializer_list<T> xs) {<br>
   return IsSupersetOf(xs.begin(), xs.end());<br>
 }<br>
-#endif<br>
<br>
 // IsSubsetOf(iterator_first, iterator_last)<br>
 // IsSubsetOf(pointer, count)<br>
@@ -5104,13 +4303,11 @@ IsSubsetOf(const Container& container) {<br>
   return IsSubsetOf(container.begin(), container.end());<br>
 }<br>
<br>
-#if GTEST_HAS_STD_INITIALIZER_LIST_<br>
 template <typename T><br>
 inline internal::UnorderedElementsAreArrayMatcher<T> IsSubsetOf(<br>
     ::std::initializer_list<T> xs) {<br>
   return IsSubsetOf(xs.begin(), xs.end());<br>
 }<br>
-#endif<br>
<br>
 // Matches an STL-style container or a native array that contains only<br>
 // elements matching the given value or matcher.<br>
@@ -5171,7 +4368,7 @@ inline internal::MatcherAsPredicate<M> Matches(M matcher) {<br>
   return internal::MatcherAsPredicate<M>(matcher);<br>
 }<br>
<br>
-// Returns true iff the value matches the matcher.<br>
+// Returns true if and only if the value matches the matcher.<br>
 template <typename T, typename M><br>
 inline bool Value(const T& value, M matcher) {<br>
   return testing::Matches(matcher)(value);<br>
@@ -5207,9 +4404,25 @@ std::string DescribeMatcher(const M& matcher, bool negation = false) {<br>
   return ss.str();<br>
 }<br>
<br>
-#if GTEST_LANG_CXX11<br>
-// Define variadic matcher versions. They are overloaded in<br>
-// gmock-generated-matchers.h for the cases supported by pre C++11 compilers.<br>
+template <typename... Args><br>
+internal::ElementsAreMatcher<<br>
+    std::tuple<typename std::decay<const Args&>::type...>><br>
+ElementsAre(const Args&... matchers) {<br>
+  return internal::ElementsAreMatcher<<br>
+      std::tuple<typename std::decay<const Args&>::type...>>(<br>
+      std::make_tuple(matchers...));<br>
+}<br>
+<br>
+template <typename... Args><br>
+internal::UnorderedElementsAreMatcher<<br>
+    std::tuple<typename std::decay<const Args&>::type...>><br>
+UnorderedElementsAre(const Args&... matchers) {<br>
+  return internal::UnorderedElementsAreMatcher<<br>
+      std::tuple<typename std::decay<const Args&>::type...>>(<br>
+      std::make_tuple(matchers...));<br>
+}<br>
+<br>
+// Define variadic matcher versions.<br>
 template <typename... Args><br>
 internal::AllOfMatcher<typename std::decay<const Args&>::type...> AllOf(<br>
     const Args&... matchers) {<br>
@@ -5224,24 +4437,97 @@ internal::AnyOfMatcher<typename std::decay<const Args&>::type...> AnyOf(<br>
       matchers...);<br>
 }<br>
<br>
-template <typename... Args><br>
-internal::ElementsAreMatcher<tuple<typename std::decay<const Args&>::type...>><br>
-ElementsAre(const Args&... matchers) {<br>
-  return internal::ElementsAreMatcher<<br>
-      tuple<typename std::decay<const Args&>::type...>>(<br>
-      make_tuple(matchers...));<br>
+// AnyOfArray(array)<br>
+// AnyOfArray(pointer, count)<br>
+// AnyOfArray(container)<br>
+// AnyOfArray({ e1, e2, ..., en })<br>
+// AnyOfArray(iterator_first, iterator_last)<br>
+//<br>
+// AnyOfArray() verifies whether a given value matches any member of a<br>
+// collection of matchers.<br>
+//<br>
+// AllOfArray(array)<br>
+// AllOfArray(pointer, count)<br>
+// AllOfArray(container)<br>
+// AllOfArray({ e1, e2, ..., en })<br>
+// AllOfArray(iterator_first, iterator_last)<br>
+//<br>
+// AllOfArray() verifies whether a given value matches all members of a<br>
+// collection of matchers.<br>
+//<br>
+// The matchers can be specified as an array, a pointer and count, a container,<br>
+// an initializer list, or an STL iterator range. In each of these cases, the<br>
+// underlying matchers can be either values or matchers.<br>
+<br>
+template <typename Iter><br>
+inline internal::AnyOfArrayMatcher<<br>
+    typename ::std::iterator_traits<Iter>::value_type><br>
+AnyOfArray(Iter first, Iter last) {<br>
+  return internal::AnyOfArrayMatcher<<br>
+      typename ::std::iterator_traits<Iter>::value_type>(first, last);<br>
 }<br>
<br>
-template <typename... Args><br>
-internal::UnorderedElementsAreMatcher<<br>
-    tuple<typename std::decay<const Args&>::type...>><br>
-UnorderedElementsAre(const Args&... matchers) {<br>
-  return internal::UnorderedElementsAreMatcher<<br>
-      tuple<typename std::decay<const Args&>::type...>>(<br>
-      make_tuple(matchers...));<br>
+template <typename Iter><br>
+inline internal::AllOfArrayMatcher<<br>
+    typename ::std::iterator_traits<Iter>::value_type><br>
+AllOfArray(Iter first, Iter last) {<br>
+  return internal::AllOfArrayMatcher<<br>
+      typename ::std::iterator_traits<Iter>::value_type>(first, last);<br>
 }<br>
<br>
-#endif  // GTEST_LANG_CXX11<br>
+template <typename T><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T* ptr, size_t count) {<br>
+  return AnyOfArray(ptr, ptr + count);<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(const T* ptr, size_t count) {<br>
+  return AllOfArray(ptr, ptr + count);<br>
+}<br>
+<br>
+template <typename T, size_t N><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(const T (&array)[N]) {<br>
+  return AnyOfArray(array, N);<br>
+}<br>
+<br>
+template <typename T, size_t N><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(const T (&array)[N]) {<br>
+  return AllOfArray(array, N);<br>
+}<br>
+<br>
+template <typename Container><br>
+inline internal::AnyOfArrayMatcher<typename Container::value_type> AnyOfArray(<br>
+    const Container& container) {<br>
+  return AnyOfArray(container.begin(), container.end());<br>
+}<br>
+<br>
+template <typename Container><br>
+inline internal::AllOfArrayMatcher<typename Container::value_type> AllOfArray(<br>
+    const Container& container) {<br>
+  return AllOfArray(container.begin(), container.end());<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AnyOfArrayMatcher<T> AnyOfArray(<br>
+    ::std::initializer_list<T> xs) {<br>
+  return AnyOfArray(xs.begin(), xs.end());<br>
+}<br>
+<br>
+template <typename T><br>
+inline internal::AllOfArrayMatcher<T> AllOfArray(<br>
+    ::std::initializer_list<T> xs) {<br>
+  return AllOfArray(xs.begin(), xs.end());<br>
+}<br>
+<br>
+// Args<N1, N2, ..., Nk>(a_matcher) matches a tuple if the selected<br>
+// fields of it matches a_matcher.  C++ doesn't support default<br>
+// arguments for function templates, so we have to overload it.<br>
+template <size_t... k, typename InnerMatcher><br>
+internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...> Args(<br>
+    InnerMatcher&& matcher) {<br>
+  return internal::ArgsMatcher<typename std::decay<InnerMatcher>::type, k...>(<br>
+      std::forward<InnerMatcher>(matcher));<br>
+}<br>
<br>
 // AllArgs(m) is a synonym of m.  This is useful in<br>
 //<br>
@@ -5288,8 +4574,8 @@ PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(<br>
<br>
 // These macros allow using matchers to check values in Google Test<br>
 // tests.  ASSERT_THAT(value, matcher) and EXPECT_THAT(value, matcher)<br>
-// succeed iff the value matches the matcher.  If the assertion fails,<br>
-// the value and the description of the matcher will be printed.<br>
+// succeed if and only if the value matches the matcher.  If the assertion<br>
+// fails, the value and the description of the matcher will be printed.<br>
 #define ASSERT_THAT(value, matcher) ASSERT_PRED_FORMAT1(\<br>
     ::testing::internal::MakePredicateFormatterFromMatcher(matcher), value)<br>
 #define EXPECT_THAT(value, matcher) EXPECT_PRED_FORMAT1(\<br>
@@ -5297,14 +4583,14 @@ PolymorphicMatcher<internal::variant_matcher::VariantMatcher<T> > VariantWith(<br>
<br>
 }  // namespace testing<br>
<br>
-GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046<br>
-<br>
 #ifdef __clang__<br>
 #if __has_warning("-Wdeprecated-copy")<br>
 #pragma clang diagnostic pop<br>
 #endif<br>
 #endif<br>
<br>
+GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046<br>
+<br>
 // Include any custom callback matchers added by the local installation.<br>
 // We must include this header at the end to make sure it can use the<br>
 // declarations from this file.<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
index 632a54cb8ab1b..56de2d10681a0 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-more-actions.h<br>
@@ -40,59 +40,13 @@<br>
 #define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_<br>
<br>
 #include <algorithm><br>
+#include <type_traits><br>
<br>
 #include "gmock/gmock-generated-actions.h"<br>
<br>
 namespace testing {<br>
 namespace internal {<br>
<br>
-// Implements the Invoke(f) action.  The template argument<br>
-// FunctionImpl is the implementation type of f, which can be either a<br>
-// function pointer or a functor.  Invoke(f) can be used as an<br>
-// Action<F> as long as f's type is compatible with F (i.e. f can be<br>
-// assigned to a tr1::function<F>).<br>
-template <typename FunctionImpl><br>
-class InvokeAction {<br>
- public:<br>
-  // The c'tor makes a copy of function_impl (either a function<br>
-  // pointer or a functor).<br>
-  explicit InvokeAction(FunctionImpl function_impl)<br>
-      : function_impl_(function_impl) {}<br>
-<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple& args) {<br>
-    return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args);<br>
-  }<br>
-<br>
- private:<br>
-  FunctionImpl function_impl_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(InvokeAction);<br>
-};<br>
-<br>
-// Implements the Invoke(object_ptr, &Class::Method) action.<br>
-template <class Class, typename MethodPtr><br>
-class InvokeMethodAction {<br>
- public:<br>
-  InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr)<br>
-      : method_ptr_(method_ptr), obj_ptr_(obj_ptr) {}<br>
-<br>
-  template <typename Result, typename ArgumentTuple><br>
-  Result Perform(const ArgumentTuple& args) const {<br>
-    return InvokeHelper<Result, ArgumentTuple>::InvokeMethod(<br>
-        obj_ptr_, method_ptr_, args);<br>
-  }<br>
-<br>
- private:<br>
-  // The order of these members matters.  Reversing the order can trigger<br>
-  // warning C4121 in MSVC (see<br>
-  // <a href="http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm" rel="noreferrer" target="_blank">http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm</a> ).<br>
-  const MethodPtr method_ptr_;<br>
-  Class* const obj_ptr_;<br>
-<br>
-  GTEST_DISALLOW_ASSIGN_(InvokeMethodAction);<br>
-};<br>
-<br>
 // An internal replacement for std::copy which mimics its behavior. This is<br>
 // necessary because Visual Studio deprecates ::std::copy, issuing warning 4996.<br>
 // However Visual Studio 2010 and later do not honor #pragmas which disable that<br>
@@ -111,45 +65,6 @@ inline OutputIterator CopyElements(InputIterator first,<br>
<br>
 // Various overloads for Invoke().<br>
<br>
-// Creates an action that invokes 'function_impl' with the mock<br>
-// function's arguments.<br>
-template <typename FunctionImpl><br>
-PolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke(<br>
-    FunctionImpl function_impl) {<br>
-  return MakePolymorphicAction(<br>
-      internal::InvokeAction<FunctionImpl>(function_impl));<br>
-}<br>
-<br>
-// Creates an action that invokes the given method on the given object<br>
-// with the mock function's arguments.<br>
-template <class Class, typename MethodPtr><br>
-PolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke(<br>
-    Class* obj_ptr, MethodPtr method_ptr) {<br>
-  return MakePolymorphicAction(<br>
-      internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr));<br>
-}<br>
-<br>
-// WithoutArgs(inner_action) can be used in a mock function with a<br>
-// non-empty argument list to perform inner_action, which takes no<br>
-// argument.  In other words, it adapts an action accepting no<br>
-// argument to one that accepts (and ignores) arguments.<br>
-template <typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction><br>
-WithoutArgs(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction>(action);<br>
-}<br>
-<br>
-// WithArg<k>(an_action) creates an action that passes the k-th<br>
-// (0-based) argument of the mock function to an_action and performs<br>
-// it.  It adapts an action accepting one argument to one that accepts<br>
-// multiple arguments.  For convenience, we also provide<br>
-// WithArgs<k>(an_action) (defined below) as a synonym.<br>
-template <int k, typename InnerAction><br>
-inline internal::WithArgsAction<InnerAction, k><br>
-WithArg(const InnerAction& action) {<br>
-  return internal::WithArgsAction<InnerAction, k>(action);<br>
-}<br>
-<br>
 // The ACTION*() macros trigger warning C4100 (unreferenced formal<br>
 // parameter) in MSVC with -W4.  Unfortunately they cannot be fixed in<br>
 // the macro definition, as the warnings are generated when the macro<br>
@@ -164,7 +79,7 @@ WithArg(const InnerAction& action) {<br>
 ACTION_TEMPLATE(ReturnArg,<br>
                 HAS_1_TEMPLATE_PARAMS(int, k),<br>
                 AND_0_VALUE_PARAMS()) {<br>
-  return ::testing::get<k>(args);<br>
+  return ::std::get<k>(args);<br>
 }<br>
<br>
 // Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the<br>
@@ -172,7 +87,7 @@ ACTION_TEMPLATE(ReturnArg,<br>
 ACTION_TEMPLATE(SaveArg,<br>
                 HAS_1_TEMPLATE_PARAMS(int, k),<br>
                 AND_1_VALUE_PARAMS(pointer)) {<br>
-  *pointer = ::testing::get<k>(args);<br>
+  *pointer = ::std::get<k>(args);<br>
 }<br>
<br>
 // Action SaveArgPointee<k>(pointer) saves the value pointed to<br>
@@ -180,7 +95,7 @@ ACTION_TEMPLATE(SaveArg,<br>
 ACTION_TEMPLATE(SaveArgPointee,<br>
                 HAS_1_TEMPLATE_PARAMS(int, k),<br>
                 AND_1_VALUE_PARAMS(pointer)) {<br>
-  *pointer = *::testing::get<k>(args);<br>
+  *pointer = *::std::get<k>(args);<br>
 }<br>
<br>
 // Action SetArgReferee<k>(value) assigns 'value' to the variable<br>
@@ -188,13 +103,13 @@ ACTION_TEMPLATE(SaveArgPointee,<br>
 ACTION_TEMPLATE(SetArgReferee,<br>
                 HAS_1_TEMPLATE_PARAMS(int, k),<br>
                 AND_1_VALUE_PARAMS(value)) {<br>
-  typedef typename ::testing::tuple_element<k, args_type>::type argk_type;<br>
+  typedef typename ::std::tuple_element<k, args_type>::type argk_type;<br>
   // Ensures that argument #k is a reference.  If you get a compiler<br>
   // error on the next line, you are using SetArgReferee<k>(value) in<br>
   // a mock function whose k-th (0-based) argument is not a reference.<br>
-  GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value,<br>
+  GTEST_COMPILE_ASSERT_(std::is_reference<argk_type>::value,<br>
                         SetArgReferee_must_be_used_with_a_reference_argument);<br>
-  ::testing::get<k>(args) = value;<br>
+  ::std::get<k>(args) = value;<br>
 }<br>
<br>
 // Action SetArrayArgument<k>(first, last) copies the elements in<br>
@@ -207,9 +122,9 @@ ACTION_TEMPLATE(SetArrayArgument,<br>
                 AND_2_VALUE_PARAMS(first, last)) {<br>
   // Visual Studio deprecates ::std::copy, so we use our own copy in that case.<br>
 #ifdef _MSC_VER<br>
-  internal::CopyElements(first, last, ::testing::get<k>(args));<br>
+  internal::CopyElements(first, last, ::std::get<k>(args));<br>
 #else<br>
-  ::std::copy(first, last, ::testing::get<k>(args));<br>
+  ::std::copy(first, last, ::std::get<k>(args));<br>
 #endif<br>
 }<br>
<br>
@@ -218,7 +133,7 @@ ACTION_TEMPLATE(SetArrayArgument,<br>
 ACTION_TEMPLATE(DeleteArg,<br>
                 HAS_1_TEMPLATE_PARAMS(int, k),<br>
                 AND_0_VALUE_PARAMS()) {<br>
-  delete ::testing::get<k>(args);<br>
+  delete ::std::get<k>(args);<br>
 }<br>
<br>
 // This action returns the value pointed to by 'pointer'.<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
new file mode 100644<br>
index 0000000000000..5495a9805b5fa<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-nice-strict.h<br>
@@ -0,0 +1,215 @@<br>
+// Copyright 2008, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+//     * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+//     * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+//     * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+<br>
+// Implements class templates NiceMock, NaggyMock, and StrictMock.<br>
+//<br>
+// Given a mock class MockFoo that is created using Google Mock,<br>
+// NiceMock<MockFoo> is a subclass of MockFoo that allows<br>
+// uninteresting calls (i.e. calls to mock methods that have no<br>
+// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo<br>
+// that prints a warning when an uninteresting call occurs, and<br>
+// StrictMock<MockFoo> is a subclass of MockFoo that treats all<br>
+// uninteresting calls as errors.<br>
+//<br>
+// Currently a mock is naggy by default, so MockFoo and<br>
+// NaggyMock<MockFoo> behave like the same.  However, we will soon<br>
+// switch the default behavior of mocks to be nice, as that in general<br>
+// leads to more maintainable tests.  When that happens, MockFoo will<br>
+// stop behaving like NaggyMock<MockFoo> and start behaving like<br>
+// NiceMock<MockFoo>.<br>
+//<br>
+// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of<br>
+// their respective base class.  Therefore you can write<br>
+// NiceMock<MockFoo>(5, "a") to construct a nice mock where MockFoo<br>
+// has a constructor that accepts (int, const char*), for example.<br>
+//<br>
+// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,<br>
+// and StrictMock<MockFoo> only works for mock methods defined using<br>
+// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.<br>
+// If a mock method is defined in a base class of MockFoo, the "nice"<br>
+// or "strict" modifier may not affect it, depending on the compiler.<br>
+// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT<br>
+// supported.<br>
+<br>
+// GOOGLETEST_CM0002 DO NOT DELETE<br>
+<br>
+#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
+#define GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
+<br>
+#include "gmock/gmock-spec-builders.h"<br>
+#include "gmock/internal/gmock-port.h"<br>
+<br>
+namespace testing {<br>
+<br>
+template <class MockClass><br>
+class NiceMock : public MockClass {<br>
+ public:<br>
+  NiceMock() : MockClass() {<br>
+    ::testing::Mock::AllowUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  // Ideally, we would inherit base class's constructors through a using<br>
+  // declaration, which would preserve their visibility. However, many existing<br>
+  // tests rely on the fact that current implementation reexports protected<br>
+  // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+  // Single argument constructor is special-cased so that it can be<br>
+  // made explicit.<br>
+  template <typename A><br>
+  explicit NiceMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+    ::testing::Mock::AllowUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  template <typename A1, typename A2, typename... An><br>
+  NiceMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+                  std::forward<An>(args)...) {<br>
+    ::testing::Mock::AllowUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  ~NiceMock() {  // NOLINT<br>
+    ::testing::Mock::UnregisterCallReaction(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+ private:<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);<br>
+};<br>
+<br>
+template <class MockClass><br>
+class NaggyMock : public MockClass {<br>
+ public:<br>
+  NaggyMock() : MockClass() {<br>
+    ::testing::Mock::WarnUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  // Ideally, we would inherit base class's constructors through a using<br>
+  // declaration, which would preserve their visibility. However, many existing<br>
+  // tests rely on the fact that current implementation reexports protected<br>
+  // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+  // Single argument constructor is special-cased so that it can be<br>
+  // made explicit.<br>
+  template <typename A><br>
+  explicit NaggyMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+    ::testing::Mock::WarnUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  template <typename A1, typename A2, typename... An><br>
+  NaggyMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+                  std::forward<An>(args)...) {<br>
+    ::testing::Mock::WarnUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  ~NaggyMock() {  // NOLINT<br>
+    ::testing::Mock::UnregisterCallReaction(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+ private:<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);<br>
+};<br>
+<br>
+template <class MockClass><br>
+class StrictMock : public MockClass {<br>
+ public:<br>
+  StrictMock() : MockClass() {<br>
+    ::testing::Mock::FailUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  // Ideally, we would inherit base class's constructors through a using<br>
+  // declaration, which would preserve their visibility. However, many existing<br>
+  // tests rely on the fact that current implementation reexports protected<br>
+  // constructors as public. These tests would need to be cleaned up first.<br>
+<br>
+  // Single argument constructor is special-cased so that it can be<br>
+  // made explicit.<br>
+  template <typename A><br>
+  explicit StrictMock(A&& arg) : MockClass(std::forward<A>(arg)) {<br>
+    ::testing::Mock::FailUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  template <typename A1, typename A2, typename... An><br>
+  StrictMock(A1&& arg1, A2&& arg2, An&&... args)<br>
+      : MockClass(std::forward<A1>(arg1), std::forward<A2>(arg2),<br>
+                  std::forward<An>(args)...) {<br>
+    ::testing::Mock::FailUninterestingCalls(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+  ~StrictMock() {  // NOLINT<br>
+    ::testing::Mock::UnregisterCallReaction(<br>
+        internal::ImplicitCast_<MockClass*>(this));<br>
+  }<br>
+<br>
+ private:<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);<br>
+};<br>
+<br>
+// The following specializations catch some (relatively more common)<br>
+// user errors of nesting nice and strict mocks.  They do NOT catch<br>
+// all possible errors.<br>
+<br>
+// These specializations are declared but not defined, as NiceMock,<br>
+// NaggyMock, and StrictMock cannot be nested.<br>
+<br>
+template <typename MockClass><br>
+class NiceMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NiceMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NiceMock<StrictMock<MockClass> >;<br>
+<br>
+template <typename MockClass><br>
+class NaggyMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NaggyMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class NaggyMock<StrictMock<MockClass> >;<br>
+<br>
+template <typename MockClass><br>
+class StrictMock<NiceMock<MockClass> >;<br>
+template <typename MockClass><br>
+class StrictMock<NaggyMock<MockClass> >;<br>
+template <typename MockClass><br>
+class StrictMock<StrictMock<MockClass> >;<br>
+<br>
+}  // namespace testing<br>
+<br>
+#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_NICE_STRICT_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h b/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
index 61e7134230aa3..7df6c87a4c307 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock-spec-builders.h<br>
@@ -63,10 +63,14 @@<br>
 #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_<br>
 #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_<br>
<br>
+#include <functional><br>
 #include <map><br>
+#include <memory><br>
 #include <set><br>
 #include <sstream><br>
 #include <string><br>
+#include <type_traits><br>
+#include <utility><br>
 #include <vector><br>
 #include "gmock/gmock-actions.h"<br>
 #include "gmock/gmock-cardinalities.h"<br>
@@ -106,9 +110,6 @@ template <typename F> class TypedExpectation;<br>
 // Helper class for testing the Expectation class template.<br>
 class ExpectationTester;<br>
<br>
-// Base class for function mockers.<br>
-template <typename F> class FunctionMockerBase;<br>
-<br>
 // Protects the mock object registry (in class Mock), all function<br>
 // mockers, and all expectations.<br>
 //<br>
@@ -125,9 +126,9 @@ GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_gmock_mutex);<br>
 // Untyped base class for ActionResultHolder<R>.<br>
 class UntypedActionResultHolderBase;<br>
<br>
-// Abstract base class of FunctionMockerBase.  This is the<br>
+// Abstract base class of FunctionMocker.  This is the<br>
 // type-agnostic part of the function mocker interface.  Its pure<br>
-// virtual methods are implemented by FunctionMockerBase.<br>
+// virtual methods are implemented by FunctionMocker.<br>
 class GTEST_API_ UntypedFunctionMockerBase {<br>
  public:<br>
   UntypedFunctionMockerBase();<br>
@@ -189,7 +190,6 @@ class GTEST_API_ UntypedFunctionMockerBase {<br>
   // this information in the global mock registry.  Will be called<br>
   // whenever an EXPECT_CALL() or ON_CALL() is executed on this mock<br>
   // method.<br>
-  // FIXME: rename to SetAndRegisterOwner().<br>
   void RegisterOwner(const void* mock_obj)<br>
       GTEST_LOCK_EXCLUDED_(g_gmock_mutex);<br>
<br>
@@ -220,8 +220,7 @@ class GTEST_API_ UntypedFunctionMockerBase {<br>
  protected:<br>
   typedef std::vector<const void*> UntypedOnCallSpecs;<br>
<br>
-  typedef std::vector<internal::linked_ptr<ExpectationBase> ><br>
-  UntypedExpectations;<br>
+  using UntypedExpectations = std::vector<std::shared_ptr<ExpectationBase>>;<br>
<br>
   // Returns an Expectation object that references and co-owns exp,<br>
   // which must be an expectation on this mock function.<br>
@@ -306,11 +305,9 @@ class OnCallSpec : public UntypedOnCallSpecBase {<br>
       : UntypedOnCallSpecBase(a_file, a_line),<br>
         matchers_(matchers),<br>
         // By default, extra_matcher_ should match anything.  However,<br>
-        // we cannot initialize it with _ as that triggers a compiler<br>
-        // bug in Symbian's C++ compiler (cannot decide between two<br>
-        // overloaded constructors of Matcher<const ArgumentTuple&>).<br>
-        extra_matcher_(A<const ArgumentTuple&>()) {<br>
-  }<br>
+        // we cannot initialize it with _ as that causes ambiguity between<br>
+        // Matcher's copy and move constructor for some argument types.<br>
+        extra_matcher_(A<const ArgumentTuple&>()) {}<br>
<br>
   // Implements the .With() clause.<br>
   OnCallSpec& With(const Matcher<const ArgumentTuple&>& m) {<br>
@@ -337,7 +334,7 @@ class OnCallSpec : public UntypedOnCallSpecBase {<br>
     return *this;<br>
   }<br>
<br>
-  // Returns true iff the given arguments match the matchers.<br>
+  // Returns true if and only if the given arguments match the matchers.<br>
   bool Matches(const ArgumentTuple& args) const {<br>
     return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);<br>
   }<br>
@@ -395,18 +392,28 @@ class GTEST_API_ Mock {<br>
       GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
<br>
   // Verifies all expectations on the given mock object and clears its<br>
-  // default actions and expectations.  Returns true iff the<br>
+  // default actions and expectations.  Returns true if and only if the<br>
   // verification was successful.<br>
   static bool VerifyAndClear(void* mock_obj)<br>
       GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
<br>
+  // Returns whether the mock was created as a naggy mock (default)<br>
+  static bool IsNaggy(void* mock_obj)<br>
+      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+  // Returns whether the mock was created as a nice mock<br>
+  static bool IsNice(void* mock_obj)<br>
+      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+  // Returns whether the mock was created as a strict mock<br>
+  static bool IsStrict(void* mock_obj)<br>
+      GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex);<br>
+<br>
  private:<br>
   friend class internal::UntypedFunctionMockerBase;<br>
<br>
   // Needed for a function mocker to register itself (so that we know<br>
   // how to clear a mock object).<br>
   template <typename F><br>
-  friend class internal::FunctionMockerBase;<br>
+  friend class internal::FunctionMocker;<br>
<br>
   template <typename M><br>
   friend class NiceMock;<br>
@@ -469,7 +476,7 @@ class GTEST_API_ Mock {<br>
   // Unregisters a mock method; removes the owning mock object from<br>
   // the registry when the last mock method associated with it has<br>
   // been unregistered.  This is called only in the destructor of<br>
-  // FunctionMockerBase.<br>
+  // FunctionMocker.<br>
   static void UnregisterLocked(internal::UntypedFunctionMockerBase* mocker)<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(internal::g_gmock_mutex);<br>
 };  // class Mock<br>
@@ -489,12 +496,7 @@ class GTEST_API_ Mock {<br>
 //   - Constness is shallow: a const Expectation object itself cannot<br>
 //     be modified, but the mutable methods of the ExpectationBase<br>
 //     object it references can be called via expectation_base().<br>
-//   - The constructors and destructor are defined out-of-line because<br>
-//     the Symbian WINSCW compiler wants to otherwise instantiate them<br>
-//     when it sees this class definition, at which point it doesn't have<br>
-//     ExpectationBase available yet, leading to incorrect destruction<br>
-//     in the linked_ptr (or compilation errors if using a checking<br>
-//     linked_ptr).<br>
+<br>
 class GTEST_API_ Expectation {<br>
  public:<br>
   // Constructs a null object that doesn't reference any expectation.<br>
@@ -516,7 +518,8 @@ class GTEST_API_ Expectation {<br>
   // The compiler-generated copy ctor and operator= work exactly as<br>
   // intended, so we don't need to define our own.<br>
<br>
-  // Returns true iff rhs references the same expectation as this object does.<br>
+  // Returns true if and only if rhs references the same expectation as this<br>
+  // object does.<br>
   bool operator==(const Expectation& rhs) const {<br>
     return expectation_base_ == rhs.expectation_base_;<br>
   }<br>
@@ -530,7 +533,7 @@ class GTEST_API_ Expectation {<br>
   friend class ::testing::internal::UntypedFunctionMockerBase;<br>
<br>
   template <typename F><br>
-  friend class ::testing::internal::FunctionMockerBase;<br>
+  friend class ::testing::internal::FunctionMocker;<br>
<br>
   template <typename F><br>
   friend class ::testing::internal::TypedExpectation;<br>
@@ -546,16 +549,15 @@ class GTEST_API_ Expectation {<br>
   typedef ::std::set<Expectation, Less> Set;<br>
<br>
   Expectation(<br>
-      const internal::linked_ptr<internal::ExpectationBase>& expectation_base);<br>
+      const std::shared_ptr<internal::ExpectationBase>& expectation_base);<br>
<br>
   // Returns the expectation this object references.<br>
-  const internal::linked_ptr<internal::ExpectationBase>&<br>
-  expectation_base() const {<br>
+  const std::shared_ptr<internal::ExpectationBase>& expectation_base() const {<br>
     return expectation_base_;<br>
   }<br>
<br>
-  // A linked_ptr that co-owns the expectation this handle references.<br>
-  internal::linked_ptr<internal::ExpectationBase> expectation_base_;<br>
+  // A shared_ptr that co-owns the expectation this handle references.<br>
+  std::shared_ptr<internal::ExpectationBase> expectation_base_;<br>
 };<br>
<br>
 // A set of expectation handles.  Useful in the .After() clause of<br>
@@ -599,8 +601,8 @@ class ExpectationSet {<br>
   // The compiler-generator ctor and operator= works exactly as<br>
   // intended, so we don't need to define our own.<br>
<br>
-  // Returns true iff rhs contains the same set of Expectation objects<br>
-  // as this does.<br>
+  // Returns true if and only if rhs contains the same set of Expectation<br>
+  // objects as this does.<br>
   bool operator==(const ExpectationSet& rhs) const {<br>
     return expectations_ == rhs.expectations_;<br>
   }<br>
@@ -637,11 +639,8 @@ class GTEST_API_ Sequence {<br>
   void AddExpectation(const Expectation& expectation) const;<br>
<br>
  private:<br>
-  // The last expectation in this sequence.  We use a linked_ptr here<br>
-  // because Sequence objects are copyable and we want the copies to<br>
-  // be aliases.  The linked_ptr allows the copies to co-own and share<br>
-  // the same Expectation object.<br>
-  internal::linked_ptr<Expectation> last_expectation_;<br>
+  // The last expectation in this sequence.<br>
+  std::shared_ptr<Expectation> last_expectation_;<br>
 };  // class Sequence<br>
<br>
 // An object of this type causes all EXPECT_CALL() statements<br>
@@ -764,8 +763,8 @@ class GTEST_API_ ExpectationBase {<br>
   // by the subclasses to implement the .Times() clause.<br>
   void SpecifyCardinality(const Cardinality& cardinality);<br>
<br>
-  // Returns true iff the user specified the cardinality explicitly<br>
-  // using a .Times().<br>
+  // Returns true if and only if the user specified the cardinality<br>
+  // explicitly using a .Times().<br>
   bool cardinality_specified() const { return cardinality_specified_; }<br>
<br>
   // Sets the cardinality of this expectation spec.<br>
@@ -781,7 +780,7 @@ class GTEST_API_ ExpectationBase {<br>
   void RetireAllPreRequisites()<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);<br>
<br>
-  // Returns true iff this expectation is retired.<br>
+  // Returns true if and only if this expectation is retired.<br>
   bool is_retired() const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
@@ -795,28 +794,29 @@ class GTEST_API_ ExpectationBase {<br>
     retired_ = true;<br>
   }<br>
<br>
-  // Returns true iff this expectation is satisfied.<br>
+  // Returns true if and only if this expectation is satisfied.<br>
   bool IsSatisfied() const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     return cardinality().IsSatisfiedByCallCount(call_count_);<br>
   }<br>
<br>
-  // Returns true iff this expectation is saturated.<br>
+  // Returns true if and only if this expectation is saturated.<br>
   bool IsSaturated() const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     return cardinality().IsSaturatedByCallCount(call_count_);<br>
   }<br>
<br>
-  // Returns true iff this expectation is over-saturated.<br>
+  // Returns true if and only if this expectation is over-saturated.<br>
   bool IsOverSaturated() const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     return cardinality().IsOverSaturatedByCallCount(call_count_);<br>
   }<br>
<br>
-  // Returns true iff all pre-requisites of this expectation are satisfied.<br>
+  // Returns true if and only if all pre-requisites of this expectation are<br>
+  // satisfied.<br>
   bool AllPrerequisitesAreSatisfied() const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex);<br>
<br>
@@ -859,12 +859,12 @@ class GTEST_API_ ExpectationBase {<br>
   const char* file_;          // The file that contains the expectation.<br>
   int line_;                  // The line number of the expectation.<br>
   const std::string source_text_;  // The EXPECT_CALL(...) source text.<br>
-  // True iff the cardinality is specified explicitly.<br>
+  // True if and only if the cardinality is specified explicitly.<br>
   bool cardinality_specified_;<br>
   Cardinality cardinality_;            // The cardinality of the expectation.<br>
   // The immediate pre-requisites (i.e. expectations that must be<br>
   // satisfied before this expectation can be matched) of this<br>
-  // expectation.  We use linked_ptr in the set because we want an<br>
+  // expectation.  We use std::shared_ptr in the set because we want an<br>
   // Expectation object to be co-owned by its FunctionMocker and its<br>
   // successors.  This allows multiple mock objects to be deleted at<br>
   // <br>
diff erent times.<br>
@@ -873,7 +873,7 @@ class GTEST_API_ ExpectationBase {<br>
   // This group of fields are the current state of the expectation,<br>
   // and can change as the mock function is called.<br>
   int call_count_;  // How many times this expectation has been invoked.<br>
-  bool retired_;    // True iff this expectation has retired.<br>
+  bool retired_;    // True if and only if this expectation has retired.<br>
   UntypedActions untyped_actions_;<br>
   bool extra_matcher_specified_;<br>
   bool repeated_action_specified_;  // True if a WillRepeatedly() was specified.<br>
@@ -893,20 +893,19 @@ class TypedExpectation : public ExpectationBase {<br>
   typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;<br>
   typedef typename Function<F>::Result Result;<br>
<br>
-  TypedExpectation(FunctionMockerBase<F>* owner, const char* a_file, int a_line,<br>
+  TypedExpectation(FunctionMocker<F>* owner, const char* a_file, int a_line,<br>
                    const std::string& a_source_text,<br>
                    const ArgumentMatcherTuple& m)<br>
       : ExpectationBase(a_file, a_line, a_source_text),<br>
         owner_(owner),<br>
         matchers_(m),<br>
         // By default, extra_matcher_ should match anything.  However,<br>
-        // we cannot initialize it with _ as that triggers a compiler<br>
-        // bug in Symbian's C++ compiler (cannot decide between two<br>
-        // overloaded constructors of Matcher<const ArgumentTuple&>).<br>
+        // we cannot initialize it with _ as that causes ambiguity between<br>
+        // Matcher's copy and move constructor for some argument types.<br>
         extra_matcher_(A<const ArgumentTuple&>()),<br>
         repeated_action_(DoDefault()) {}<br>
<br>
-  virtual ~TypedExpectation() {<br>
+  ~TypedExpectation() override {<br>
     // Check the validity of the action count if it hasn't been done<br>
     // yet (for example, if the expectation was never used).<br>
     CheckActionCountIfNotDone();<br>
@@ -1072,7 +1071,7 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
   // If this mock method has an extra matcher (i.e. .With(matcher)),<br>
   // describes it to the ostream.<br>
-  virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) {<br>
+  void MaybeDescribeExtraMatcherTo(::std::ostream* os) override {<br>
     if (extra_matcher_specified_) {<br>
       *os << "    Expected args: ";<br>
       extra_matcher_.DescribeTo(os);<br>
@@ -1082,26 +1081,25 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
  private:<br>
   template <typename Function><br>
-  friend class FunctionMockerBase;<br>
+  friend class FunctionMocker;<br>
<br>
   // Returns an Expectation object that references and co-owns this<br>
   // expectation.<br>
-  virtual Expectation GetHandle() {<br>
-    return owner_->GetHandleOf(this);<br>
-  }<br>
+  Expectation GetHandle() override { return owner_->GetHandleOf(this); }<br>
<br>
   // The following methods will be called only after the EXPECT_CALL()<br>
   // statement finishes and when the current thread holds<br>
   // g_gmock_mutex.<br>
<br>
-  // Returns true iff this expectation matches the given arguments.<br>
+  // Returns true if and only if this expectation matches the given arguments.<br>
   bool Matches(const ArgumentTuple& args) const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     return TupleMatches(matchers_, args) && extra_matcher_.Matches(args);<br>
   }<br>
<br>
-  // Returns true iff this expectation should handle the given arguments.<br>
+  // Returns true if and only if this expectation should handle the given<br>
+  // arguments.<br>
   bool ShouldHandleArguments(const ArgumentTuple& args) const<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
@@ -1161,10 +1159,9 @@ class TypedExpectation : public ExpectationBase {<br>
   }<br>
<br>
   // Returns the action that should be taken for the current invocation.<br>
-  const Action<F>& GetCurrentAction(<br>
-      const FunctionMockerBase<F>* mocker,<br>
-      const ArgumentTuple& args) const<br>
-          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
+  const Action<F>& GetCurrentAction(const FunctionMocker<F>* mocker,<br>
+                                    const ArgumentTuple& args) const<br>
+      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     const int count = call_count();<br>
     Assert(count >= 1, __FILE__, __LINE__,<br>
@@ -1186,9 +1183,10 @@ class TypedExpectation : public ExpectationBase {<br>
       Log(kWarning, ss.str(), 1);<br>
     }<br>
<br>
-    return count <= action_count ?<br>
-        *static_cast<const Action<F>*>(untyped_actions_[count - 1]) :<br>
-        repeated_action();<br>
+    return count <= action_count<br>
+               ? *static_cast<const Action<F>*>(<br>
+                     untyped_actions_[static_cast<size_t>(count - 1)])<br>
+               : repeated_action();<br>
   }<br>
<br>
   // Given the arguments of a mock function call, if the call will<br>
@@ -1198,12 +1196,11 @@ class TypedExpectation : public ExpectationBase {<br>
   // Mock does it to 'why'.  This method is not const as it calls<br>
   // IncrementCallCount().  A return value of NULL means the default<br>
   // action.<br>
-  const Action<F>* GetActionForArguments(<br>
-      const FunctionMockerBase<F>* mocker,<br>
-      const ArgumentTuple& args,<br>
-      ::std::ostream* what,<br>
-      ::std::ostream* why)<br>
-          GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
+  const Action<F>* GetActionForArguments(const FunctionMocker<F>* mocker,<br>
+                                         const ArgumentTuple& args,<br>
+                                         ::std::ostream* what,<br>
+                                         ::std::ostream* why)<br>
+      GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
     if (IsSaturated()) {<br>
       // We have an excessive call.<br>
@@ -1212,10 +1209,7 @@ class TypedExpectation : public ExpectationBase {<br>
       mocker->DescribeDefaultActionTo(args, what);<br>
       DescribeCallCountTo(why);<br>
<br>
-      // FIXME: allow the user to control whether<br>
-      // unexpected calls should fail immediately or continue using a<br>
-      // flag --gmock_unexpected_calls_are_fatal.<br>
-      return NULL;<br>
+      return nullptr;<br>
     }<br>
<br>
     IncrementCallCount();<br>
@@ -1232,7 +1226,7 @@ class TypedExpectation : public ExpectationBase {<br>
<br>
   // All the fields below won't change once the EXPECT_CALL()<br>
   // statement finishes.<br>
-  FunctionMockerBase<F>* const owner_;<br>
+  FunctionMocker<F>* const owner_;<br>
   ArgumentMatcherTuple matchers_;<br>
   Matcher<const ArgumentTuple&> extra_matcher_;<br>
   Action<F> repeated_action_;<br>
@@ -1264,7 +1258,7 @@ class MockSpec {<br>
<br>
   // Constructs a MockSpec object, given the function mocker object<br>
   // that the spec is associated with.<br>
-  MockSpec(internal::FunctionMockerBase<F>* function_mocker,<br>
+  MockSpec(internal::FunctionMocker<F>* function_mocker,<br>
            const ArgumentMatcherTuple& matchers)<br>
       : function_mocker_(function_mocker), matchers_(matchers) {}<br>
<br>
@@ -1300,7 +1294,7 @@ class MockSpec {<br>
   friend class internal::FunctionMocker;<br>
<br>
   // The function mocker that owns this spec.<br>
-  internal::FunctionMockerBase<F>* const function_mocker_;<br>
+  internal::FunctionMocker<F>* const function_mocker_;<br>
   // The argument matchers specified in the spec.<br>
   ArgumentMatcherTuple matchers_;<br>
<br>
@@ -1321,18 +1315,18 @@ class ReferenceOrValueWrapper {<br>
  public:<br>
   // Constructs a wrapper from the given value/reference.<br>
   explicit ReferenceOrValueWrapper(T value)<br>
-      : value_(::testing::internal::move(value)) {<br>
+      : value_(std::move(value)) {<br>
   }<br>
<br>
   // Unwraps and returns the underlying value/reference, exactly as<br>
   // originally passed. The behavior of calling this more than once on<br>
   // the same object is unspecified.<br>
-  T Unwrap() { return ::testing::internal::move(value_); }<br>
+  T Unwrap() { return std::move(value_); }<br>
<br>
   // Provides nondestructive access to the underlying value/reference.<br>
   // Always returns a const reference (more precisely,<br>
-  // const RemoveReference<T>&). The behavior of calling this after<br>
-  // calling Unwrap on the same object is unspecified.<br>
+  // const std::add_lvalue_reference<T>::type). The behavior of calling this<br>
+  // after calling Unwrap on the same object is unspecified.<br>
   const T& Peek() const {<br>
     return value_;<br>
   }<br>
@@ -1391,7 +1385,7 @@ class ActionResultHolder : public UntypedActionResultHolderBase {<br>
   }<br>
<br>
   // Prints the held value as an action's result to os.<br>
-  virtual void PrintAsActionResult(::std::ostream* os) const {<br>
+  void PrintAsActionResult(::std::ostream* os) const override {<br>
     *os << "\n          Returns: ";<br>
     // T may be a reference type, so we don't use UniversalPrint().<br>
     UniversalPrinter<T>::Print(result_.Peek(), os);<br>
@@ -1401,28 +1395,27 @@ class ActionResultHolder : public UntypedActionResultHolderBase {<br>
   // result in a new-ed ActionResultHolder.<br>
   template <typename F><br>
   static ActionResultHolder* PerformDefaultAction(<br>
-      const FunctionMockerBase<F>* func_mocker,<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
+      const FunctionMocker<F>* func_mocker,<br>
+      typename Function<F>::ArgumentTuple&& args,<br>
       const std::string& call_description) {<br>
     return new ActionResultHolder(Wrapper(func_mocker->PerformDefaultAction(<br>
-        internal::move(args), call_description)));<br>
+        std::move(args), call_description)));<br>
   }<br>
<br>
   // Performs the given action and returns the result in a new-ed<br>
   // ActionResultHolder.<br>
   template <typename F><br>
   static ActionResultHolder* PerformAction(<br>
-      const Action<F>& action,<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {<br>
+      const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {<br>
     return new ActionResultHolder(<br>
-        Wrapper(action.Perform(internal::move(args))));<br>
+        Wrapper(action.Perform(std::move(args))));<br>
   }<br>
<br>
  private:<br>
   typedef ReferenceOrValueWrapper<T> Wrapper;<br>
<br>
   explicit ActionResultHolder(Wrapper result)<br>
-      : result_(::testing::internal::move(result)) {<br>
+      : result_(std::move(result)) {<br>
   }<br>
<br>
   Wrapper result_;<br>
@@ -1436,16 +1429,16 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
  public:<br>
   void Unwrap() { }<br>
<br>
-  virtual void PrintAsActionResult(::std::ostream* /* os */) const {}<br>
+  void PrintAsActionResult(::std::ostream* /* os */) const override {}<br>
<br>
   // Performs the given mock function's default action and returns ownership<br>
   // of an empty ActionResultHolder*.<br>
   template <typename F><br>
   static ActionResultHolder* PerformDefaultAction(<br>
-      const FunctionMockerBase<F>* func_mocker,<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
+      const FunctionMocker<F>* func_mocker,<br>
+      typename Function<F>::ArgumentTuple&& args,<br>
       const std::string& call_description) {<br>
-    func_mocker->PerformDefaultAction(internal::move(args), call_description);<br>
+    func_mocker->PerformDefaultAction(std::move(args), call_description);<br>
     return new ActionResultHolder;<br>
   }<br>
<br>
@@ -1453,9 +1446,8 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
   // ActionResultHolder*.<br>
   template <typename F><br>
   static ActionResultHolder* PerformAction(<br>
-      const Action<F>& action,<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args) {<br>
-    action.Perform(internal::move(args));<br>
+      const Action<F>& action, typename Function<F>::ArgumentTuple&& args) {<br>
+    action.Perform(std::move(args));<br>
     return new ActionResultHolder;<br>
   }<br>
<br>
@@ -1464,23 +1456,39 @@ class ActionResultHolder<void> : public UntypedActionResultHolderBase {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionResultHolder);<br>
 };<br>
<br>
-// The base of the function mocker class for the given function type.<br>
-// We put the methods in this class instead of its child to avoid code<br>
-// bloat.<br>
 template <typename F><br>
-class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
+class FunctionMocker;<br>
+<br>
+template <typename R, typename... Args><br>
+class FunctionMocker<R(Args...)> final : public UntypedFunctionMockerBase {<br>
+  using F = R(Args...);<br>
+<br>
  public:<br>
-  typedef typename Function<F>::Result Result;<br>
-  typedef typename Function<F>::ArgumentTuple ArgumentTuple;<br>
-  typedef typename Function<F>::ArgumentMatcherTuple ArgumentMatcherTuple;<br>
+  using Result = R;<br>
+  using ArgumentTuple = std::tuple<Args...>;<br>
+  using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;<br>
+<br>
+  FunctionMocker() {}<br>
<br>
-  FunctionMockerBase() {}<br>
+  // There is no generally useful and implementable semantics of<br>
+  // copying a mock object, so copying a mock is usually a user error.<br>
+  // Thus we disallow copying function mockers.  If the user really<br>
+  // wants to copy a mock object, they should implement their own copy<br>
+  // operation, for example:<br>
+  //<br>
+  //   class MockFoo : public Foo {<br>
+  //    public:<br>
+  //     // Defines a copy constructor explicitly.<br>
+  //     MockFoo(const MockFoo& src) {}<br>
+  //     ...<br>
+  //   };<br>
+  FunctionMocker(const FunctionMocker&) = delete;<br>
+  FunctionMocker& operator=(const FunctionMocker&) = delete;<br>
<br>
   // The destructor verifies that all expectations on this mock<br>
   // function have been satisfied.  If not, it will report Google Test<br>
   // non-fatal failures for the violations.<br>
-  virtual ~FunctionMockerBase()<br>
-        GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+  ~FunctionMocker() override GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
     MutexLock l(&g_gmock_mutex);<br>
     VerifyAndClearExpectationsLocked();<br>
     Mock::UnregisterLocked(this);<br>
@@ -1500,7 +1508,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
         return spec;<br>
     }<br>
<br>
-    return NULL;<br>
+    return nullptr;<br>
   }<br>
<br>
   // Performs the default action of this mock function on the given<br>
@@ -1510,13 +1518,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
   // mutable state of this object, and thus can be called concurrently<br>
   // without locking.<br>
   // L = *<br>
-  Result PerformDefaultAction(<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args,<br>
-      const std::string& call_description) const {<br>
+  Result PerformDefaultAction(ArgumentTuple&& args,<br>
+                              const std::string& call_description) const {<br>
     const OnCallSpec<F>* const spec =<br>
         this->FindOnCallSpec(args);<br>
-    if (spec != NULL) {<br>
-      return spec->GetAction().Perform(internal::move(args));<br>
+    if (spec != nullptr) {<br>
+      return spec->GetAction().Perform(std::move(args));<br>
     }<br>
     const std::string message =<br>
         call_description +<br>
@@ -1537,11 +1544,11 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
   // the error message to describe the call in the case the default<br>
   // action fails.  The caller is responsible for deleting the result.<br>
   // L = *<br>
-  virtual UntypedActionResultHolderBase* UntypedPerformDefaultAction(<br>
+  UntypedActionResultHolderBase* UntypedPerformDefaultAction(<br>
       void* untyped_args,  // must point to an ArgumentTuple<br>
-      const std::string& call_description) const {<br>
+      const std::string& call_description) const override {<br>
     ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);<br>
-    return ResultHolder::PerformDefaultAction(this, internal::move(*args),<br>
+    return ResultHolder::PerformDefaultAction(this, std::move(*args),<br>
                                               call_description);<br>
   }<br>
<br>
@@ -1549,18 +1556,18 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
   // the action's result.  The caller is responsible for deleting the<br>
   // result.<br>
   // L = *<br>
-  virtual UntypedActionResultHolderBase* UntypedPerformAction(<br>
-      const void* untyped_action, void* untyped_args) const {<br>
+  UntypedActionResultHolderBase* UntypedPerformAction(<br>
+      const void* untyped_action, void* untyped_args) const override {<br>
     // Make a copy of the action before performing it, in case the<br>
     // action deletes the mock object (and thus deletes itself).<br>
     const Action<F> action = *static_cast<const Action<F>*>(untyped_action);<br>
     ArgumentTuple* args = static_cast<ArgumentTuple*>(untyped_args);<br>
-    return ResultHolder::PerformAction(action, internal::move(*args));<br>
+    return ResultHolder::PerformAction(action, std::move(*args));<br>
   }<br>
<br>
   // Implements UntypedFunctionMockerBase::ClearDefaultActionsLocked():<br>
   // clears the ON_CALL()s set on this mock function.<br>
-  virtual void ClearDefaultActionsLocked()<br>
+  void ClearDefaultActionsLocked() override<br>
       GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
<br>
@@ -1586,26 +1593,26 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
     g_gmock_mutex.Lock();<br>
   }<br>
<br>
- protected:<br>
-  template <typename Function><br>
-  friend class MockSpec;<br>
-<br>
-  typedef ActionResultHolder<Result> ResultHolder;<br>
-<br>
   // Returns the result of invoking this mock function with the given<br>
   // arguments.  This function can be safely called from multiple<br>
   // threads concurrently.<br>
-  Result InvokeWith(<br>
-      typename RvalueRef<typename Function<F>::ArgumentTuple>::type args)<br>
-      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
-    // const_cast is required since in C++98 we still pass ArgumentTuple around<br>
-    // by const& instead of rvalue reference.<br>
-    void* untyped_args = const_cast<void*>(static_cast<const void*>(&args));<br>
-    scoped_ptr<ResultHolder> holder(<br>
-        DownCast_<ResultHolder*>(this->UntypedInvokeWith(untyped_args)));<br>
+  Result Invoke(Args... args) GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+    ArgumentTuple tuple(std::forward<Args>(args)...);<br>
+    std::unique_ptr<ResultHolder> holder(DownCast_<ResultHolder*>(<br>
+        this->UntypedInvokeWith(static_cast<void*>(&tuple))));<br>
     return holder->Unwrap();<br>
   }<br>
<br>
+  MockSpec<F> With(Matcher<Args>... m) {<br>
+    return MockSpec<F>(this, ::std::make_tuple(std::move(m)...));<br>
+  }<br>
+<br>
+ protected:<br>
+  template <typename Function><br>
+  friend class MockSpec;<br>
+<br>
+  typedef ActionResultHolder<Result> ResultHolder;<br>
+<br>
   // Adds and returns a default action spec for this mock function.<br>
   OnCallSpec<F>& AddNewOnCallSpec(<br>
       const char* file, int line,<br>
@@ -1625,14 +1632,14 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
     Mock::RegisterUseByOnCallOrExpectCall(MockObject(), file, line);<br>
     TypedExpectation<F>* const expectation =<br>
         new TypedExpectation<F>(this, file, line, source_text, m);<br>
-    const linked_ptr<ExpectationBase> untyped_expectation(expectation);<br>
+    const std::shared_ptr<ExpectationBase> untyped_expectation(expectation);<br>
     // See the definition of untyped_expectations_ for why access to<br>
     // it is unprotected here.<br>
     untyped_expectations_.push_back(untyped_expectation);<br>
<br>
     // Adds this expectation into the implicit sequence if there is one.<br>
     Sequence* const implicit_sequence = g_gmock_implicit_sequence.get();<br>
-    if (implicit_sequence != NULL) {<br>
+    if (implicit_sequence != nullptr) {<br>
       implicit_sequence->AddExpectation(Expectation(untyped_expectation));<br>
     }<br>
<br>
@@ -1651,10 +1658,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
                                ::std::ostream* os) const {<br>
     const OnCallSpec<F>* const spec = FindOnCallSpec(args);<br>
<br>
-    if (spec == NULL) {<br>
-      *os << (internal::type_equals<Result, void>::value ?<br>
-              "returning directly.\n" :<br>
-              "returning default value.\n");<br>
+    if (spec == nullptr) {<br>
+      *os << (std::is_void<Result>::value ? "returning directly.\n"<br>
+                                          : "returning default value.\n");<br>
     } else {<br>
       *os << "taking default action specified at:\n"<br>
           << FormatFileLocation(spec->file(), spec->line()) << "\n";<br>
@@ -1664,10 +1670,9 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
   // Writes a message that the call is uninteresting (i.e. neither<br>
   // explicitly expected nor explicitly unexpected) to the given<br>
   // ostream.<br>
-  virtual void UntypedDescribeUninterestingCall(<br>
-      const void* untyped_args,<br>
-      ::std::ostream* os) const<br>
-          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+  void UntypedDescribeUninterestingCall(const void* untyped_args,<br>
+                                        ::std::ostream* os) const override<br>
+      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
     const ArgumentTuple& args =<br>
         *static_cast<const ArgumentTuple*>(untyped_args);<br>
     *os << "Uninteresting mock function call - ";<br>
@@ -1692,18 +1697,17 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
   // section.  The reason is that we have no control on what the<br>
   // action does (it can invoke an arbitrary user function or even a<br>
   // mock function) and excessive locking could cause a dead lock.<br>
-  virtual const ExpectationBase* UntypedFindMatchingExpectation(<br>
-      const void* untyped_args,<br>
-      const void** untyped_action, bool* is_excessive,<br>
-      ::std::ostream* what, ::std::ostream* why)<br>
-          GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
+  const ExpectationBase* UntypedFindMatchingExpectation(<br>
+      const void* untyped_args, const void** untyped_action, bool* is_excessive,<br>
+      ::std::ostream* what, ::std::ostream* why) override<br>
+      GTEST_LOCK_EXCLUDED_(g_gmock_mutex) {<br>
     const ArgumentTuple& args =<br>
         *static_cast<const ArgumentTuple*>(untyped_args);<br>
     MutexLock l(&g_gmock_mutex);<br>
     TypedExpectation<F>* exp = this->FindMatchingExpectationLocked(args);<br>
-    if (exp == NULL) {  // A match wasn't found.<br>
+    if (exp == nullptr) {  // A match wasn't found.<br>
       this->FormatUnexpectedCallMessageLocked(args, what, why);<br>
-      return NULL;<br>
+      return nullptr;<br>
     }<br>
<br>
     // This line must be done before calling GetActionForArguments(),<br>
@@ -1711,15 +1715,15 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
     // its saturation status.<br>
     *is_excessive = exp->IsSaturated();<br>
     const Action<F>* action = exp->GetActionForArguments(this, args, what, why);<br>
-    if (action != NULL && action->IsDoDefault())<br>
-      action = NULL;  // Normalize "do default" to NULL.<br>
+    if (action != nullptr && action->IsDoDefault())<br>
+      action = nullptr;  // Normalize "do default" to NULL.<br>
     *untyped_action = action;<br>
     return exp;<br>
   }<br>
<br>
   // Prints the given function arguments to the ostream.<br>
-  virtual void UntypedPrintArgs(const void* untyped_args,<br>
-                                ::std::ostream* os) const {<br>
+  void UntypedPrintArgs(const void* untyped_args,<br>
+                        ::std::ostream* os) const override {<br>
     const ArgumentTuple& args =<br>
         *static_cast<const ArgumentTuple*>(untyped_args);<br>
     UniversalPrint(args, os);<br>
@@ -1742,7 +1746,7 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
         return exp;<br>
       }<br>
     }<br>
-    return NULL;<br>
+    return nullptr;<br>
   }<br>
<br>
   // Returns a message that the arguments don't match any expectation.<br>
@@ -1764,12 +1768,12 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
       ::std::ostream* why) const<br>
           GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
     g_gmock_mutex.AssertHeld();<br>
-    const int count = static_cast<int>(untyped_expectations_.size());<br>
+    const size_t count = untyped_expectations_.size();<br>
     *why << "Google Mock tried the following " << count << " "<br>
          << (count == 1 ? "expectation, but it didn't match" :<br>
              "expectations, but none matched")<br>
          << ":\n";<br>
-    for (int i = 0; i < count; i++) {<br>
+    for (size_t i = 0; i < count; i++) {<br>
       TypedExpectation<F>* const expectation =<br>
           static_cast<TypedExpectation<F>*>(untyped_expectations_[i].get());<br>
       *why << "\n";<br>
@@ -1782,36 +1786,98 @@ class FunctionMockerBase : public UntypedFunctionMockerBase {<br>
       expectation->DescribeCallCountTo(why);<br>
     }<br>
   }<br>
-<br>
-  // There is no generally useful and implementable semantics of<br>
-  // copying a mock object, so copying a mock is usually a user error.<br>
-  // Thus we disallow copying function mockers.  If the user really<br>
-  // wants to copy a mock object, they should implement their own copy<br>
-  // operation, for example:<br>
-  //<br>
-  //   class MockFoo : public Foo {<br>
-  //    public:<br>
-  //     // Defines a copy constructor explicitly.<br>
-  //     MockFoo(const MockFoo& src) {}<br>
-  //     ...<br>
-  //   };<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(FunctionMockerBase);<br>
-};  // class FunctionMockerBase<br>
+};  // class FunctionMocker<br>
<br>
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4355<br>
<br>
-// Implements methods of FunctionMockerBase.<br>
-<br>
-// Verifies that all expectations on this mock function have been<br>
-// satisfied.  Reports one or more Google Test non-fatal failures and<br>
-// returns false if not.<br>
-<br>
 // Reports an uninteresting call (whose description is in msg) in the<br>
 // manner specified by 'reaction'.<br>
 void ReportUninterestingCall(CallReaction reaction, const std::string& msg);<br>
<br>
 }  // namespace internal<br>
<br>
+// A MockFunction<F> class has one mock method whose type is F.  It is<br>
+// useful when you just want your test code to emit some messages and<br>
+// have Google Mock verify the right messages are sent (and perhaps at<br>
+// the right times).  For example, if you are exercising code:<br>
+//<br>
+//   Foo(1);<br>
+//   Foo(2);<br>
+//   Foo(3);<br>
+//<br>
+// and want to verify that Foo(1) and Foo(3) both invoke<br>
+// mock.Bar("a"), but Foo(2) doesn't invoke anything, you can write:<br>
+//<br>
+// TEST(FooTest, InvokesBarCorrectly) {<br>
+//   MyMock mock;<br>
+//   MockFunction<void(string check_point_name)> check;<br>
+//   {<br>
+//     InSequence s;<br>
+//<br>
+//     EXPECT_CALL(mock, Bar("a"));<br>
+//     EXPECT_CALL(check, Call("1"));<br>
+//     EXPECT_CALL(check, Call("2"));<br>
+//     EXPECT_CALL(mock, Bar("a"));<br>
+//   }<br>
+//   Foo(1);<br>
+//   check.Call("1");<br>
+//   Foo(2);<br>
+//   check.Call("2");<br>
+//   Foo(3);<br>
+// }<br>
+//<br>
+// The expectation spec says that the first Bar("a") must happen<br>
+// before check point "1", the second Bar("a") must happen after check<br>
+// point "2", and nothing should happen between the two check<br>
+// points. The explicit check points make it easy to tell which<br>
+// Bar("a") is called by which call to Foo().<br>
+//<br>
+// MockFunction<F> can also be used to exercise code that accepts<br>
+// std::function<F> callbacks. To do so, use AsStdFunction() method<br>
+// to create std::function proxy forwarding to original object's Call.<br>
+// Example:<br>
+//<br>
+// TEST(FooTest, RunsCallbackWithBarArgument) {<br>
+//   MockFunction<int(string)> callback;<br>
+//   EXPECT_CALL(callback, Call("bar")).WillOnce(Return(1));<br>
+//   Foo(callback.AsStdFunction());<br>
+// }<br>
+template <typename F><br>
+class MockFunction;<br>
+<br>
+template <typename R, typename... Args><br>
+class MockFunction<R(Args...)> {<br>
+ public:<br>
+  MockFunction() {}<br>
+  MockFunction(const MockFunction&) = delete;<br>
+  MockFunction& operator=(const MockFunction&) = delete;<br>
+<br>
+  std::function<R(Args...)> AsStdFunction() {<br>
+    return [this](Args... args) -> R {<br>
+      return this->Call(std::forward<Args>(args)...);<br>
+    };<br>
+  }<br>
+<br>
+  // Implementation detail: the expansion of the MOCK_METHOD macro.<br>
+  R Call(Args... args) {<br>
+    mock_.SetOwnerAndName(this, "Call");<br>
+    return mock_.Invoke(std::forward<Args>(args)...);<br>
+  }<br>
+<br>
+  internal::MockSpec<R(Args...)> gmock_Call(Matcher<Args>... m) {<br>
+    mock_.RegisterOwner(this);<br>
+    return mock_.With(std::move(m)...);<br>
+  }<br>
+<br>
+  internal::MockSpec<R(Args...)> gmock_Call(const internal::WithoutMatchers&,<br>
+                                            R (*)(Args...)) {<br>
+    return this->gmock_Call(::testing::A<Args>()...);<br>
+  }<br>
+<br>
+ private:<br>
+  internal::FunctionMocker<R(Args...)> mock_;<br>
+};<br>
+<br>
 // The style guide prohibits "using" statements in a namespace scope<br>
 // inside a header file.  However, the MockSpec class template is<br>
 // meant to be defined in the ::testing namespace.  The following line<br>
@@ -1907,8 +1973,9 @@ GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251<br>
 // second argument is an internal type derived from the method signature. The<br>
 // failure to disambiguate two overloads of this method in the ON_CALL statement<br>
 // is how we block callers from setting expectations on overloaded methods.<br>
-#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call)                          \<br>
-  ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), NULL) \<br>
+#define GMOCK_ON_CALL_IMPL_(mock_expr, Setter, call)                    \<br>
+  ((mock_expr).gmock_##call)(::testing::internal::GetWithoutMatchers(), \<br>
+                             nullptr)                                   \<br>
       .Setter(__FILE__, __LINE__, #mock_expr, #call)<br>
<br>
 #define ON_CALL(obj, call) \<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/gmock.h b/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
index 436aabf7d9afe..45645ff637779 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/gmock.h<br>
@@ -39,14 +39,14 @@<br>
<br>
 // This file implements the following syntax:<br>
 //<br>
-//   ON_CALL(mock_object.Method(...))<br>
+//   ON_CALL(mock_object, Method(...))<br>
 //     .With(...) ?<br>
 //     .WillByDefault(...);<br>
 //<br>
 // where With() is optional and WillByDefault() must appear exactly<br>
 // once.<br>
 //<br>
-//   EXPECT_CALL(mock_object.Method(...))<br>
+//   EXPECT_CALL(mock_object, Method(...))<br>
 //     .With(...) ?<br>
 //     .Times(...) ?<br>
 //     .InSequence(...) *<br>
@@ -56,24 +56,25 @@<br>
 //<br>
 // where all clauses are optional and WillOnce() can be repeated.<br>
<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic push<br>
-#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
-#endif<br>
-#endif<br>
-<br>
 #include "gmock/gmock-actions.h"<br>
 #include "gmock/gmock-cardinalities.h"<br>
+#include "gmock/gmock-function-mocker.h"<br>
 #include "gmock/gmock-generated-actions.h"<br>
 #include "gmock/gmock-generated-function-mockers.h"<br>
 #include "gmock/gmock-generated-matchers.h"<br>
-#include "gmock/gmock-generated-nice-strict.h"<br>
 #include "gmock/gmock-matchers.h"<br>
 #include "gmock/gmock-more-actions.h"<br>
 #include "gmock/gmock-more-matchers.h"<br>
+#include "gmock/gmock-nice-strict.h"<br>
 #include "gmock/internal/gmock-internal-utils.h"<br>
<br>
+#ifdef __clang__<br>
+#if __has_warning("-Wdeprecated-copy")<br>
+#pragma clang diagnostic push<br>
+#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
+#endif<br>
+#endif<br>
+<br>
 namespace testing {<br>
<br>
 // Declares Google Mock flags that we want a user to use programmatically.<br>
@@ -98,6 +99,10 @@ GTEST_API_ void InitGoogleMock(int* argc, char** argv);<br>
 // UNICODE mode.<br>
 GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleMock();<br>
+<br>
 }  // namespace testing<br>
<br>
 #ifdef __clang__<br>
@@ -105,4 +110,5 @@ GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv);<br>
 #pragma clang diagnostic pop<br>
 #endif<br>
 #endif<br>
+<br>
 #endif  // GMOCK_INCLUDE_GMOCK_GMOCK_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
deleted file mode 100644<br>
index 8ccd06fb721b8..0000000000000<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-generated-internal-utils.h<br>
+++ /dev/null<br>
@@ -1,289 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-//     pump.py gmock-generated-internal-utils.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2007, Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-//     * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-//     * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-//     * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Google Mock - a framework for writing C++ mock classes.<br>
-//<br>
-// This file contains template meta-programming utility classes needed<br>
-// for implementing Google Mock.<br>
-<br>
-// GOOGLETEST_CM0002 DO NOT DELETE<br>
-<br>
-// IWYU pragma: private, include "gmock/gmock.h<br>
-<br>
-#ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
-#define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
-<br>
-#include "gmock/internal/gmock-port.h"<br>
-<br>
-namespace testing {<br>
-<br>
-template <typename T><br>
-class Matcher;<br>
-<br>
-namespace internal {<br>
-<br>
-// An IgnoredValue object can be implicitly constructed from ANY value.<br>
-// This is used in implementing the IgnoreResult(a) action.<br>
-class IgnoredValue {<br>
- public:<br>
-  // This constructor template allows any value to be implicitly<br>
-  // converted to IgnoredValue.  The object has no data member and<br>
-  // doesn't try to remember anything about the argument.  We<br>
-  // deliberately omit the 'explicit' keyword in order to allow the<br>
-  // conversion to be implicit.<br>
-  template <typename T><br>
-  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)<br>
-};<br>
-<br>
-// MatcherTuple<T>::type is a tuple type where each field is a Matcher<br>
-// for the corresponding field in tuple type T.<br>
-template <typename Tuple><br>
-struct MatcherTuple;<br>
-<br>
-template <><br>
-struct MatcherTuple< ::testing::tuple<> > {<br>
-  typedef ::testing::tuple< > type;<br>
-};<br>
-<br>
-template <typename A1><br>
-struct MatcherTuple< ::testing::tuple<A1> > {<br>
-  typedef ::testing::tuple<Matcher<A1> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2><br>
-struct MatcherTuple< ::testing::tuple<A1, A2> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-    typename A6><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5>, Matcher<A6> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-    typename A6, typename A7><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5>, Matcher<A6>, Matcher<A7> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-    typename A6, typename A7, typename A8><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-    typename A6, typename A7, typename A8, typename A9><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,<br>
-                           Matcher<A9> ><br>
-      type;<br>
-};<br>
-<br>
-template <typename A1, typename A2, typename A3, typename A4, typename A5,<br>
-    typename A6, typename A7, typename A8, typename A9, typename A10><br>
-struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
-    A10> > {<br>
-  typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>,<br>
-                           Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>,<br>
-                           Matcher<A9>, Matcher<A10> ><br>
-      type;<br>
-};<br>
-<br>
-// Template struct Function<F>, where F must be a function type, contains<br>
-// the following typedefs:<br>
-//<br>
-//   Result:               the function's return type.<br>
-//   ArgumentN:            the type of the N-th argument, where N starts with 1.<br>
-//   ArgumentTuple:        the tuple type consisting of all parameters of F.<br>
-//   ArgumentMatcherTuple: the tuple type consisting of Matchers for all<br>
-//                         parameters of F.<br>
-//   MakeResultVoid:       the function type obtained by substituting void<br>
-//                         for the return type of F.<br>
-//   MakeResultIgnoredValue:<br>
-//                         the function type obtained by substituting Something<br>
-//                         for the return type of F.<br>
-template <typename F><br>
-struct Function;<br>
-<br>
-template <typename R><br>
-struct Function<R()> {<br>
-  typedef R Result;<br>
-  typedef ::testing::tuple<> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid();<br>
-  typedef IgnoredValue MakeResultIgnoredValue();<br>
-};<br>
-<br>
-template <typename R, typename A1><br>
-struct Function<R(A1)><br>
-    : Function<R()> {<br>
-  typedef A1 Argument1;<br>
-  typedef ::testing::tuple<A1> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2><br>
-struct Function<R(A1, A2)><br>
-    : Function<R(A1)> {<br>
-  typedef A2 Argument2;<br>
-  typedef ::testing::tuple<A1, A2> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3><br>
-struct Function<R(A1, A2, A3)><br>
-    : Function<R(A1, A2)> {<br>
-  typedef A3 Argument3;<br>
-  typedef ::testing::tuple<A1, A2, A3> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4><br>
-struct Function<R(A1, A2, A3, A4)><br>
-    : Function<R(A1, A2, A3)> {<br>
-  typedef A4 Argument4;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5><br>
-struct Function<R(A1, A2, A3, A4, A5)><br>
-    : Function<R(A1, A2, A3, A4)> {<br>
-  typedef A5 Argument5;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6><br>
-struct Function<R(A1, A2, A3, A4, A5, A6)><br>
-    : Function<R(A1, A2, A3, A4, A5)> {<br>
-  typedef A6 Argument6;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7)><br>
-    : Function<R(A1, A2, A3, A4, A5, A6)> {<br>
-  typedef A7 Argument7;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)><br>
-    : Function<R(A1, A2, A3, A4, A5, A6, A7)> {<br>
-  typedef A8 Argument8;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)><br>
-    : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> {<br>
-  typedef A9 Argument9;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,<br>
-      A9);<br>
-};<br>
-<br>
-template <typename R, typename A1, typename A2, typename A3, typename A4,<br>
-    typename A5, typename A6, typename A7, typename A8, typename A9,<br>
-    typename A10><br>
-struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)><br>
-    : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> {<br>
-  typedef A10 Argument10;<br>
-  typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9,<br>
-      A10> ArgumentTuple;<br>
-  typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple;<br>
-  typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);<br>
-  typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8,<br>
-      A9, A10);<br>
-};<br>
-<br>
-}  // namespace internal<br>
-<br>
-}  // namespace testing<br>
-<br>
-#endif  // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
index ceda2e8044d31..b9533508ef757 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-internal-utils.h<br>
@@ -44,11 +44,15 @@<br>
 #include <stdio.h><br>
 #include <ostream>  // NOLINT<br>
 #include <string><br>
-#include "gmock/internal/gmock-generated-internal-utils.h"<br>
+#include <type_traits><br>
 #include "gmock/internal/gmock-port.h"<br>
 #include "gtest/gtest.h"<br>
<br>
 namespace testing {<br>
+<br>
+template <typename><br>
+class Matcher;<br>
+<br>
 namespace internal {<br>
<br>
 // Silence MSVC C4100 (unreferenced formal parameter) and<br>
@@ -94,46 +98,16 @@ inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {<br>
 template <typename Element><br>
 inline Element* GetRawPointer(Element* p) { return p; }<br>
<br>
-// This comparator allows linked_ptr to be stored in sets.<br>
-template <typename T><br>
-struct LinkedPtrLessThan {<br>
-  bool operator()(const ::testing::internal::linked_ptr<T>& lhs,<br>
-                  const ::testing::internal::linked_ptr<T>& rhs) const {<br>
-    return lhs.get() < rhs.get();<br>
-  }<br>
-};<br>
-<br>
-// Symbian compilation can be done with wchar_t being either a native<br>
-// type or a typedef.  Using Google Mock with OpenC without wchar_t<br>
-// should require the definition of _STLP_NO_WCHAR_T.<br>
-//<br>
 // MSVC treats wchar_t as a native type usually, but treats it as the<br>
 // same as unsigned short when the compiler option /Zc:wchar_t- is<br>
 // specified.  It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t<br>
 // is a native type.<br>
-#if (GTEST_OS_SYMBIAN && defined(_STLP_NO_WCHAR_T)) || \<br>
-    (defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED))<br>
+#if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED)<br>
 // wchar_t is a typedef.<br>
 #else<br>
 # define GMOCK_WCHAR_T_IS_NATIVE_ 1<br>
 #endif<br>
<br>
-// signed wchar_t and unsigned wchar_t are NOT in the C++ standard.<br>
-// Using them is a bad practice and not portable.  So DON'T use them.<br>
-//<br>
-// Still, Google Mock is designed to work even if the user uses signed<br>
-// wchar_t or unsigned wchar_t (obviously, assuming the compiler<br>
-// supports them).<br>
-//<br>
-// To gcc,<br>
-//   wchar_t == signed wchar_t != unsigned wchar_t == unsigned int<br>
-#ifdef __GNUC__<br>
-#if !defined(__WCHAR_UNSIGNED__)<br>
-// signed/unsigned wchar_t are valid types.<br>
-# define GMOCK_HAS_SIGNED_WCHAR_T_ 1<br>
-#endif<br>
-#endif<br>
-<br>
 // In what follows, we use the term "kind" to indicate whether a type<br>
 // is bool, an integer type (excluding bool), a floating-point type,<br>
 // or none of them.  This categorization is useful for determining<br>
@@ -185,11 +159,11 @@ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);<br>
   static_cast< ::testing::internal::TypeKind>( \<br>
       ::testing::internal::KindOf<type>::value)<br>
<br>
-// Evaluates to true iff integer type T is signed.<br>
+// Evaluates to true if and only if integer type T is signed.<br>
 #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0)<br>
<br>
 // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value<br>
-// is true iff arithmetic type From can be losslessly converted to<br>
+// is true if and only if arithmetic type From can be losslessly converted to<br>
 // arithmetic type To.<br>
 //<br>
 // It's the user's responsibility to ensure that both From and To are<br>
@@ -198,30 +172,30 @@ GMOCK_DECLARE_KIND_(long double, kFloatingPoint);<br>
 // From, and kToKind is the kind of To; the value is<br>
 // implementation-defined when the above pre-condition is violated.<br>
 template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To><br>
-struct LosslessArithmeticConvertibleImpl : public false_type {};<br>
+struct LosslessArithmeticConvertibleImpl : public std::false_type {};<br>
<br>
 // Converting bool to bool is lossless.<br>
 template <><br>
 struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool><br>
-    : public true_type {};  // NOLINT<br>
+    : public std::true_type {};<br>
<br>
 // Converting bool to any integer type is lossless.<br>
 template <typename To><br>
 struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To><br>
-    : public true_type {};  // NOLINT<br>
+    : public std::true_type {};<br>
<br>
 // Converting bool to any floating-point type is lossless.<br>
 template <typename To><br>
 struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To><br>
-    : public true_type {};  // NOLINT<br>
+    : public std::true_type {};<br>
<br>
 // Converting an integer to bool is lossy.<br>
 template <typename From><br>
 struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool><br>
-    : public false_type {};  // NOLINT<br>
+    : public std::false_type {};<br>
<br>
-// Converting an integer to another non-bool integer is lossless iff<br>
-// the target type's range encloses the source type's range.<br>
+// Converting an integer to another non-bool integer is lossless<br>
+// if and only if the target type's range encloses the source type's range.<br>
 template <typename From, typename To><br>
 struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To><br>
     : public bool_constant<<br>
@@ -239,27 +213,27 @@ struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To><br>
 // the format of a floating-point number is implementation-defined.<br>
 template <typename From, typename To><br>
 struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To><br>
-    : public false_type {};  // NOLINT<br>
+    : public std::false_type {};<br>
<br>
 // Converting a floating-point to bool is lossy.<br>
 template <typename From><br>
 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool><br>
-    : public false_type {};  // NOLINT<br>
+    : public std::false_type {};<br>
<br>
 // Converting a floating-point to an integer is lossy.<br>
 template <typename From, typename To><br>
 struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To><br>
-    : public false_type {};  // NOLINT<br>
+    : public std::false_type {};<br>
<br>
 // Converting a floating-point to another floating-point is lossless<br>
-// iff the target type is at least as big as the source type.<br>
+// if and only if the target type is at least as big as the source type.<br>
 template <typename From, typename To><br>
 struct LosslessArithmeticConvertibleImpl<<br>
   kFloatingPoint, From, kFloatingPoint, To><br>
     : public bool_constant<sizeof(From) <= sizeof(To)> {};  // NOLINT<br>
<br>
-// LosslessArithmeticConvertible<From, To>::value is true iff arithmetic<br>
-// type From can be losslessly converted to arithmetic type To.<br>
+// LosslessArithmeticConvertible<From, To>::value is true if and only if<br>
+// arithmetic type From can be losslessly converted to arithmetic type To.<br>
 //<br>
 // It's the user's responsibility to ensure that both From and To are<br>
 // raw (i.e. has no CV modifier, is not a pointer, and is not a<br>
@@ -333,11 +307,11 @@ const char kWarningVerbosity[] = "warning";<br>
 // No logs are printed.<br>
 const char kErrorVerbosity[] = "error";<br>
<br>
-// Returns true iff a log with the given severity is visible according<br>
-// to the --gmock_verbose flag.<br>
+// Returns true if and only if a log with the given severity is visible<br>
+// according to the --gmock_verbose flag.<br>
 GTEST_API_ bool LogIsVisible(LogSeverity severity);<br>
<br>
-// Prints the given message to stdout iff 'severity' >= the level<br>
+// Prints the given message to stdout if and only if 'severity' >= the level<br>
 // specified by the --gmock_verbose flag.  If stack_frames_to_skip >=<br>
 // 0, also prints the stack trace excluding the top<br>
 // stack_frames_to_skip frames.  In opt mode, any positive<br>
@@ -362,35 +336,8 @@ class WithoutMatchers {<br>
 // Internal use only: access the singleton instance of WithoutMatchers.<br>
 GTEST_API_ WithoutMatchers GetWithoutMatchers();<br>
<br>
-// FIXME: group all type utilities together.<br>
-<br>
 // Type traits.<br>
<br>
-// is_reference<T>::value is non-zero iff T is a reference type.<br>
-template <typename T> struct is_reference : public false_type {};<br>
-template <typename T> struct is_reference<T&> : public true_type {};<br>
-<br>
-// type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type.<br>
-template <typename T1, typename T2> struct type_equals : public false_type {};<br>
-template <typename T> struct type_equals<T, T> : public true_type {};<br>
-<br>
-// remove_reference<T>::type removes the reference from type T, if any.<br>
-template <typename T> struct remove_reference { typedef T type; };  // NOLINT<br>
-template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT<br>
-<br>
-// DecayArray<T>::type turns an array type U[N] to const U* and preserves<br>
-// other types.  Useful for saving a copy of a function argument.<br>
-template <typename T> struct DecayArray { typedef T type; };  // NOLINT<br>
-template <typename T, size_t N> struct DecayArray<T[N]> {<br>
-  typedef const T* type;<br>
-};<br>
-// Sometimes people use arrays whose size is not available at the use site<br>
-// (e.g. extern const char kNamePrefix[]).  This specialization covers that<br>
-// case.<br>
-template <typename T> struct DecayArray<T[]> {<br>
-  typedef const T* type;<br>
-};<br>
-<br>
 // Disable MSVC warnings for infinite recursion, since in this case the<br>
 // the recursion is unreachable.<br>
 #ifdef _MSC_VER<br>
@@ -439,9 +386,8 @@ class StlContainerView {<br>
   typedef const type& const_reference;<br>
<br>
   static const_reference ConstReference(const RawContainer& container) {<br>
-    // Ensures that RawContainer is not a const type.<br>
-    testing::StaticAssertTypeEq<RawContainer,<br>
-        GTEST_REMOVE_CONST_(RawContainer)>();<br>
+    static_assert(!std::is_const<RawContainer>::value,<br>
+                  "RawContainer type must not be const");<br>
     return container;<br>
   }<br>
   static type Copy(const RawContainer& container) { return container; }<br>
@@ -451,7 +397,7 @@ class StlContainerView {<br>
 template <typename Element, size_t N><br>
 class StlContainerView<Element[N]> {<br>
  public:<br>
-  typedef GTEST_REMOVE_CONST_(Element) RawElement;<br>
+  typedef typename std::remove_const<Element>::type RawElement;<br>
   typedef internal::NativeArray<RawElement> type;<br>
   // NativeArray<T> can represent a native array either by value or by<br>
   // reference (selected by a constructor argument), so 'const type'<br>
@@ -461,53 +407,32 @@ class StlContainerView<Element[N]> {<br>
   typedef const type const_reference;<br>
<br>
   static const_reference ConstReference(const Element (&array)[N]) {<br>
-    // Ensures that Element is not a const type.<br>
-    testing::StaticAssertTypeEq<Element, RawElement>();<br>
-#if GTEST_OS_SYMBIAN<br>
-    // The Nokia Symbian compiler confuses itself in template instantiation<br>
-    // for this call without the cast to Element*:<br>
-    // function call '[testing::internal::NativeArray<char *>].NativeArray(<br>
-    //     {lval} const char *[4], long, testing::internal::RelationToSource)'<br>
-    //     does not match<br>
-    // 'testing::internal::NativeArray<char *>::NativeArray(<br>
-    //     char *const *, unsigned int, testing::internal::RelationToSource)'<br>
-    // (instantiating: 'testing::internal::ContainsMatcherImpl<br>
-    //     <const char * (&)[4]>::Matches(const char * (&)[4]) const')<br>
-    // (instantiating: 'testing::internal::StlContainerView<char *[4]>::<br>
-    //     ConstReference(const char * (&)[4])')<br>
-    // (and though the N parameter type is mismatched in the above explicit<br>
-    // conversion of it doesn't help - only the conversion of the array).<br>
-    return type(const_cast<Element*>(&array[0]), N,<br>
-                RelationToSourceReference());<br>
-#else<br>
+    static_assert(std::is_same<Element, RawElement>::value,<br>
+                  "Element type must not be const");<br>
     return type(array, N, RelationToSourceReference());<br>
-#endif  // GTEST_OS_SYMBIAN<br>
   }<br>
   static type Copy(const Element (&array)[N]) {<br>
-#if GTEST_OS_SYMBIAN<br>
-    return type(const_cast<Element*>(&array[0]), N, RelationToSourceCopy());<br>
-#else<br>
     return type(array, N, RelationToSourceCopy());<br>
-#endif  // GTEST_OS_SYMBIAN<br>
   }<br>
 };<br>
<br>
 // This specialization is used when RawContainer is a native array<br>
 // represented as a (pointer, size) tuple.<br>
 template <typename ElementPointer, typename Size><br>
-class StlContainerView< ::testing::tuple<ElementPointer, Size> > {<br>
+class StlContainerView< ::std::tuple<ElementPointer, Size> > {<br>
  public:<br>
-  typedef GTEST_REMOVE_CONST_(<br>
-      typename internal::PointeeOf<ElementPointer>::type) RawElement;<br>
+  typedef typename std::remove_const<<br>
+      typename internal::PointeeOf<ElementPointer>::type>::type RawElement;<br>
   typedef internal::NativeArray<RawElement> type;<br>
   typedef const type const_reference;<br>
<br>
   static const_reference ConstReference(<br>
-      const ::testing::tuple<ElementPointer, Size>& array) {<br>
-    return type(get<0>(array), get<1>(array), RelationToSourceReference());<br>
+      const ::std::tuple<ElementPointer, Size>& array) {<br>
+    return type(std::get<0>(array), std::get<1>(array),<br>
+                RelationToSourceReference());<br>
   }<br>
-  static type Copy(const ::testing::tuple<ElementPointer, Size>& array) {<br>
-    return type(get<0>(array), get<1>(array), RelationToSourceCopy());<br>
+  static type Copy(const ::std::tuple<ElementPointer, Size>& array) {<br>
+    return type(std::get<0>(array), std::get<1>(array), RelationToSourceCopy());<br>
   }<br>
 };<br>
<br>
@@ -529,29 +454,12 @@ struct RemoveConstFromKey<std::pair<const K, V> > {<br>
   typedef std::pair<K, V> type;<br>
 };<br>
<br>
-// Mapping from booleans to types. Similar to boost::bool_<kValue> and<br>
-// std::integral_constant<bool, kValue>.<br>
-template <bool kValue><br>
-struct BooleanConstant {};<br>
-<br>
 // Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to<br>
 // reduce code size.<br>
 GTEST_API_ void IllegalDoDefault(const char* file, int line);<br>
<br>
-#if GTEST_LANG_CXX11<br>
-// Helper types for Apply() below.<br>
-template <size_t... Is> struct int_pack { typedef int_pack type; };<br>
-<br>
-template <class Pack, size_t I> struct append;<br>
-template <size_t... Is, size_t I><br>
-struct append<int_pack<Is...>, I> : int_pack<Is..., I> {};<br>
-<br>
-template <size_t C><br>
-struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {};<br>
-template <> struct make_int_pack<0> : int_pack<> {};<br>
-<br>
 template <typename F, typename Tuple, size_t... Idx><br>
-auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(<br>
+auto ApplyImpl(F&& f, Tuple&& args, IndexSequence<Idx...>) -> decltype(<br>
     std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) {<br>
   return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...);<br>
 }<br>
@@ -560,12 +468,42 @@ auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype(<br>
 template <typename F, typename Tuple><br>
 auto Apply(F&& f, Tuple&& args)<br>
     -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),<br>
-                          make_int_pack<std::tuple_size<Tuple>::value>())) {<br>
+                          MakeIndexSequence<std::tuple_size<Tuple>::value>())) {<br>
   return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args),<br>
-                   make_int_pack<std::tuple_size<Tuple>::value>());<br>
+                   MakeIndexSequence<std::tuple_size<Tuple>::value>());<br>
 }<br>
-#endif<br>
<br>
+// Template struct Function<F>, where F must be a function type, contains<br>
+// the following typedefs:<br>
+//<br>
+//   Result:               the function's return type.<br>
+//   Arg<N>:               the type of the N-th argument, where N starts with 0.<br>
+//   ArgumentTuple:        the tuple type consisting of all parameters of F.<br>
+//   ArgumentMatcherTuple: the tuple type consisting of Matchers for all<br>
+//                         parameters of F.<br>
+//   MakeResultVoid:       the function type obtained by substituting void<br>
+//                         for the return type of F.<br>
+//   MakeResultIgnoredValue:<br>
+//                         the function type obtained by substituting Something<br>
+//                         for the return type of F.<br>
+template <typename T><br>
+struct Function;<br>
+<br>
+template <typename R, typename... Args><br>
+struct Function<R(Args...)> {<br>
+  using Result = R;<br>
+  static constexpr size_t ArgumentCount = sizeof...(Args);<br>
+  template <size_t I><br>
+  using Arg = ElemFromList<I, typename MakeIndexSequence<sizeof...(Args)>::type,<br>
+                           Args...>;<br>
+  using ArgumentTuple = std::tuple<Args...>;<br>
+  using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>;<br>
+  using MakeResultVoid = void(Args...);<br>
+  using MakeResultIgnoredValue = IgnoredValue(Args...);<br>
+};<br>
+<br>
+template <typename R, typename... Args><br>
+constexpr size_t Function<R(Args...)>::ArgumentCount;<br>
<br>
 #ifdef _MSC_VER<br>
 # pragma warning(pop)<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
index 0ee6abc80fcd4..27e4c0caf2bcc 100644<br>
--- a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-port.h<br>
@@ -54,14 +54,13 @@<br>
 // here, as Google Mock depends on Google Test.  Only add a utility<br>
 // here if it's truly specific to Google Mock.<br>
<br>
-#include "gtest/internal/gtest-linked_ptr.h"<br>
 #include "gtest/internal/gtest-port.h"<br>
 #include "gmock/internal/custom/gmock-port.h"<br>
<br>
-// For MS Visual C++, check the compiler version. At least VS 2003 is<br>
+// For MS Visual C++, check the compiler version. At least VS 2015 is<br>
 // required to compile Google Mock.<br>
-#if defined(_MSC_VER) && _MSC_VER < 1310<br>
-# error "At least Visual C++ 2003 (7.1) is required to compile Google Mock."<br>
+#if defined(_MSC_VER) && _MSC_VER < 1900<br>
+# error "At least Visual C++ 2015 (14.0) is required to compile Google Mock."<br>
 #endif<br>
<br>
 // Macro for referencing flags.  This is public as we want the user to<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
new file mode 100644<br>
index 0000000000000..1ab80e1cdbee6<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googlemock/include/gmock/internal/gmock-pp.h<br>
@@ -0,0 +1,317 @@<br>
+#ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_PP_H_<br>
+#define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_PP_H_<br>
+<br>
+#undef GMOCK_PP_INTERNAL_USE_MSVC<br>
+#if defined(__clang__)<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 0<br>
+#elif defined(_MSC_VER)<br>
+// TODO(iserna): Also verify tradional versus comformant preprocessor.<br>
+static_assert(<br>
+    _MSC_VER >= 1900,<br>
+    "MSVC version not supported. There is support for MSVC 14.0 and above.");<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 1<br>
+#else<br>
+#define GMOCK_PP_INTERNAL_USE_MSVC 0<br>
+#endif<br>
+<br>
+// Expands and concatenates the arguments. Constructed macros reevaluate.<br>
+#define GMOCK_PP_CAT(_1, _2) GMOCK_PP_INTERNAL_CAT(_1, _2)<br>
+<br>
+// Expands and stringifies the only argument.<br>
+#define GMOCK_PP_STRINGIZE(...) GMOCK_PP_INTERNAL_STRINGIZE(__VA_ARGS__)<br>
+<br>
+// Returns empty. Given a variadic number of arguments.<br>
+#define GMOCK_PP_EMPTY(...)<br>
+<br>
+// Returns a comma. Given a variadic number of arguments.<br>
+#define GMOCK_PP_COMMA(...) ,<br>
+<br>
+// Returns the only argument.<br>
+#define GMOCK_PP_IDENTITY(_1) _1<br>
+<br>
+// MSVC preprocessor collapses __VA_ARGS__ in a single argument, we use a<br>
+// CAT-like directive to force correct evaluation. Each macro has its own.<br>
+#if GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+// Evaluates to the number of arguments after expansion.<br>
+//<br>
+//   #define PAIR x, y<br>
+//<br>
+//   GMOCK_PP_NARG() => 1<br>
+//   GMOCK_PP_NARG(x) => 1<br>
+//   GMOCK_PP_NARG(x, y) => 2<br>
+//   GMOCK_PP_NARG(PAIR) => 2<br>
+//<br>
+// Requires: the number of arguments after expansion is at most 15.<br>
+#define GMOCK_PP_NARG(...)                                                    \<br>
+  GMOCK_PP_INTERNAL_NARG_CAT(                                                 \<br>
+      GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, \<br>
+                                      8, 7, 6, 5, 4, 3, 2, 1), )<br>
+<br>
+// Returns 1 if the expansion of arguments has an unprotected comma. Otherwise<br>
+// returns 0. Requires no more than 15 unprotected commas.<br>
+#define GMOCK_PP_HAS_COMMA(...)                                               \<br>
+  GMOCK_PP_INTERNAL_HAS_COMMA_CAT(                                            \<br>
+      GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, \<br>
+                                      1, 1, 1, 1, 1, 0), )<br>
+// Returns the first argument.<br>
+#define GMOCK_PP_HEAD(...) \<br>
+  GMOCK_PP_INTERNAL_HEAD_CAT(GMOCK_PP_INTERNAL_HEAD(__VA_ARGS__), )<br>
+<br>
+// Returns the tail. A variadic list of all arguments minus the first. Requires<br>
+// at least one argument.<br>
+#define GMOCK_PP_TAIL(...) \<br>
+  GMOCK_PP_INTERNAL_TAIL_CAT(GMOCK_PP_INTERNAL_TAIL(__VA_ARGS__), )<br>
+<br>
+// Calls CAT(_Macro, NARG(__VA_ARGS__))(__VA_ARGS__)<br>
+#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \<br>
+  GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT(      \<br>
+      GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__), )<br>
+<br>
+#else  // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+#define GMOCK_PP_NARG(...)                                                   \<br>
+  GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 15, 14, 13, 12, 11, 10, 9, 8, \<br>
+                                  7, 6, 5, 4, 3, 2, 1)<br>
+#define GMOCK_PP_HAS_COMMA(...)                                              \<br>
+  GMOCK_PP_INTERNAL_INTERNAL_16TH(__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \<br>
+                                  1, 1, 1, 1, 0)<br>
+#define GMOCK_PP_HEAD(...) GMOCK_PP_INTERNAL_HEAD(__VA_ARGS__)<br>
+#define GMOCK_PP_TAIL(...) GMOCK_PP_INTERNAL_TAIL(__VA_ARGS__)<br>
+#define GMOCK_PP_VARIADIC_CALL(_Macro, ...) \<br>
+  GMOCK_PP_CAT(_Macro, GMOCK_PP_NARG(__VA_ARGS__))(__VA_ARGS__)<br>
+<br>
+#endif  // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+// If the arguments after expansion have no tokens, evaluates to `1`. Otherwise<br>
+// evaluates to `0`.<br>
+//<br>
+// Requires: * the number of arguments after expansion is at most 15.<br>
+//           * If the argument is a macro, it must be able to be called with one<br>
+//             argument.<br>
+//<br>
+// Implementation details:<br>
+//<br>
+// There is one case when it generates a compile error: if the argument is macro<br>
+// that cannot be called with one argument.<br>
+//<br>
+//   #define M(a, b)  // it doesn't matter what it expands to<br>
+//<br>
+//   // Expected: expands to `0`.<br>
+//   // Actual: compile error.<br>
+//   GMOCK_PP_IS_EMPTY(M)<br>
+//<br>
+// There are 4 cases tested:<br>
+//<br>
+// * __VA_ARGS__ possible expansion has no unparen'd commas. Expected 0.<br>
+// * __VA_ARGS__ possible expansion is not enclosed in parenthesis. Expected 0.<br>
+// * __VA_ARGS__ possible expansion is not a macro that ()-evaluates to a comma.<br>
+//   Expected 0<br>
+// * __VA_ARGS__ is empty, or has unparen'd commas, or is enclosed in<br>
+//   parenthesis, or is a macro that ()-evaluates to comma. Expected 1.<br>
+//<br>
+// We trigger detection on '0001', i.e. on empty.<br>
+#define GMOCK_PP_IS_EMPTY(...)                                               \<br>
+  GMOCK_PP_INTERNAL_IS_EMPTY(GMOCK_PP_HAS_COMMA(__VA_ARGS__),                \<br>
+                             GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__), \<br>
+                             GMOCK_PP_HAS_COMMA(__VA_ARGS__()),              \<br>
+                             GMOCK_PP_HAS_COMMA(GMOCK_PP_COMMA __VA_ARGS__()))<br>
+<br>
+// Evaluates to _Then if _Cond is 1 and _Else if _Cond is 0.<br>
+#define GMOCK_PP_IF(_Cond, _Then, _Else) \<br>
+  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IF_, _Cond)(_Then, _Else)<br>
+<br>
+// Evaluates to the number of arguments after expansion. Identifies 'empty' as<br>
+// 0.<br>
+//<br>
+//   #define PAIR x, y<br>
+//<br>
+//   GMOCK_PP_NARG0() => 0<br>
+//   GMOCK_PP_NARG0(x) => 1<br>
+//   GMOCK_PP_NARG0(x, y) => 2<br>
+//   GMOCK_PP_NARG0(PAIR) => 2<br>
+//<br>
+// Requires: * the number of arguments after expansion is at most 15.<br>
+//           * If the argument is a macro, it must be able to be called with one<br>
+//             argument.<br>
+#define GMOCK_PP_NARG0(...) \<br>
+  GMOCK_PP_IF(GMOCK_PP_IS_EMPTY(__VA_ARGS__), 0, GMOCK_PP_NARG(__VA_ARGS__))<br>
+<br>
+// Expands to 1 if the first argument starts with something in parentheses,<br>
+// otherwise to 0.<br>
+#define GMOCK_PP_IS_BEGIN_PARENS(...)                    \<br>
+  GMOCK_PP_INTERNAL_ALTERNATE_HEAD(                      \<br>
+      GMOCK_PP_CAT(GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_, \<br>
+                   GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C __VA_ARGS__))<br>
+<br>
+// Expands to 1 is there is only one argument and it is enclosed in parentheses.<br>
+#define GMOCK_PP_IS_ENCLOSED_PARENS(...)             \<br>
+  GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(__VA_ARGS__), \<br>
+              GMOCK_PP_IS_EMPTY(GMOCK_PP_EMPTY __VA_ARGS__), 0)<br>
+<br>
+// Remove the parens, requires GMOCK_PP_IS_ENCLOSED_PARENS(args) => 1.<br>
+#define GMOCK_PP_REMOVE_PARENS(...) GMOCK_PP_INTERNAL_REMOVE_PARENS __VA_ARGS__<br>
+<br>
+// Expands to _Macro(0, _Data, e1) _Macro(1, _Data, e2) ... _Macro(K -1, _Data,<br>
+// eK) as many of GMOCK_INTERNAL_NARG0 _Tuple.<br>
+// Requires: * |_Macro| can be called with 3 arguments.<br>
+//           * |_Tuple| expansion has no more than 15 elements.<br>
+#define GMOCK_PP_FOR_EACH(_Macro, _Data, _Tuple)                        \<br>
+  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, GMOCK_PP_NARG0 _Tuple) \<br>
+  (0, _Macro, _Data, _Tuple)<br>
+<br>
+// Expands to _Macro(0, _Data, ) _Macro(1, _Data, ) ... _Macro(K - 1, _Data, )<br>
+// Empty if _K = 0.<br>
+// Requires: * |_Macro| can be called with 3 arguments.<br>
+//           * |_K| literal between 0 and 15<br>
+#define GMOCK_PP_REPEAT(_Macro, _Data, _N)           \<br>
+  GMOCK_PP_CAT(GMOCK_PP_INTERNAL_FOR_EACH_IMPL_, _N) \<br>
+  (0, _Macro, _Data, GMOCK_PP_INTENRAL_EMPTY_TUPLE)<br>
+<br>
+// Increments the argument, requires the argument to be between 0 and 15.<br>
+#define GMOCK_PP_INC(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_INC_, _i)<br>
+<br>
+// Returns comma if _i != 0. Requires _i to be between 0 and 15.<br>
+#define GMOCK_PP_COMMA_IF(_i) GMOCK_PP_CAT(GMOCK_PP_INTERNAL_COMMA_IF_, _i)<br>
+<br>
+// Internal details follow. Do not use any of these symbols outside of this<br>
+// file or we will break your code.<br>
+#define GMOCK_PP_INTENRAL_EMPTY_TUPLE (, , , , , , , , , , , , , , , )<br>
+#define GMOCK_PP_INTERNAL_CAT(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_STRINGIZE(...) #__VA_ARGS__<br>
+#define GMOCK_PP_INTERNAL_INTERNAL_16TH(_1, _2, _3, _4, _5, _6, _7, _8, _9, \<br>
+                                        _10, _11, _12, _13, _14, _15, _16,  \<br>
+                                        ...)                                \<br>
+  _16<br>
+#define GMOCK_PP_INTERNAL_CAT_5(_1, _2, _3, _4, _5) _1##_2##_3##_4##_5<br>
+#define GMOCK_PP_INTERNAL_IS_EMPTY(_1, _2, _3, _4)                             \<br>
+  GMOCK_PP_HAS_COMMA(GMOCK_PP_INTERNAL_CAT_5(GMOCK_PP_INTERNAL_IS_EMPTY_CASE_, \<br>
+                                             _1, _2, _3, _4))<br>
+#define GMOCK_PP_INTERNAL_IS_EMPTY_CASE_0001 ,<br>
+#define GMOCK_PP_INTERNAL_IF_1(_Then, _Else) _Then<br>
+#define GMOCK_PP_INTERNAL_IF_0(_Then, _Else) _Else<br>
+#define GMOCK_PP_INTERNAL_HEAD(_1, ...) _1<br>
+#define GMOCK_PP_INTERNAL_TAIL(_1, ...) __VA_ARGS__<br>
+<br>
+#if GMOCK_PP_INTERNAL_USE_MSVC<br>
+#define GMOCK_PP_INTERNAL_NARG_CAT(_1, _2) GMOCK_PP_INTERNAL_NARG_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_HEAD_CAT(_1, _2) GMOCK_PP_INTERNAL_HEAD_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_HAS_COMMA_CAT(_1, _2) \<br>
+  GMOCK_PP_INTERNAL_HAS_COMMA_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_TAIL_CAT(_1, _2) GMOCK_PP_INTERNAL_TAIL_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT(_1, _2) \<br>
+  GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_NARG_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_HEAD_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_HAS_COMMA_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_TAIL_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_VARIADIC_CALL_CAT_I(_1, _2) _1##_2<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD(...) \<br>
+  GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT(GMOCK_PP_HEAD(__VA_ARGS__), )<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT(_1, _2) \<br>
+  GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT_I(_1, _2)<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD_CAT_I(_1, _2) _1##_2<br>
+#else  // GMOCK_PP_INTERNAL_USE_MSVC<br>
+#define GMOCK_PP_INTERNAL_ALTERNATE_HEAD(...) GMOCK_PP_HEAD(__VA_ARGS__)<br>
+#endif  // GMOCK_PP_INTERNAL_USE_MSVC<br>
+<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C(...) 1 _<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_1 1,<br>
+#define GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_R_GMOCK_PP_INTERNAL_IBP_IS_VARIADIC_C \<br>
+  0,<br>
+#define GMOCK_PP_INTERNAL_REMOVE_PARENS(...) __VA_ARGS__<br>
+#define GMOCK_PP_INTERNAL_INC_0 1<br>
+#define GMOCK_PP_INTERNAL_INC_1 2<br>
+#define GMOCK_PP_INTERNAL_INC_2 3<br>
+#define GMOCK_PP_INTERNAL_INC_3 4<br>
+#define GMOCK_PP_INTERNAL_INC_4 5<br>
+#define GMOCK_PP_INTERNAL_INC_5 6<br>
+#define GMOCK_PP_INTERNAL_INC_6 7<br>
+#define GMOCK_PP_INTERNAL_INC_7 8<br>
+#define GMOCK_PP_INTERNAL_INC_8 9<br>
+#define GMOCK_PP_INTERNAL_INC_9 10<br>
+#define GMOCK_PP_INTERNAL_INC_10 11<br>
+#define GMOCK_PP_INTERNAL_INC_11 12<br>
+#define GMOCK_PP_INTERNAL_INC_12 13<br>
+#define GMOCK_PP_INTERNAL_INC_13 14<br>
+#define GMOCK_PP_INTERNAL_INC_14 15<br>
+#define GMOCK_PP_INTERNAL_INC_15 16<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_0<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_1 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_2 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_3 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_4 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_5 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_6 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_7 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_8 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_9 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_10 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_11 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_12 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_13 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_14 ,<br>
+#define GMOCK_PP_INTERNAL_COMMA_IF_15 ,<br>
+#define GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, _element) \<br>
+  _Macro(_i, _Data, _element)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_0(_i, _Macro, _Data, _Tuple)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(_i, _Macro, _Data, _Tuple) \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple)<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_1(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_2(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_3(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_4(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_5(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_6(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_7(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(_i, _Macro, _Data, _Tuple)    \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_8(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_9(GMOCK_PP_INC(_i), _Macro, _Data,    \<br>
+                                    (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_10(GMOCK_PP_INC(_i), _Macro, _Data,   \<br>
+                                     (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_11(GMOCK_PP_INC(_i), _Macro, _Data,   \<br>
+                                     (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_12(GMOCK_PP_INC(_i), _Macro, _Data,   \<br>
+                                     (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_13(GMOCK_PP_INC(_i), _Macro, _Data,   \<br>
+                                     (GMOCK_PP_TAIL _Tuple))<br>
+#define GMOCK_PP_INTERNAL_FOR_EACH_IMPL_15(_i, _Macro, _Data, _Tuple)   \<br>
+  GMOCK_PP_INTERNAL_CALL_MACRO(_Macro, _i, _Data, GMOCK_PP_HEAD _Tuple) \<br>
+  GMOCK_PP_INTERNAL_FOR_EACH_IMPL_14(GMOCK_PP_INC(_i), _Macro, _Data,   \<br>
+                                     (GMOCK_PP_TAIL _Tuple))<br>
+<br>
+#endif  // THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PP_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc b/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
index 0549f7276d78c..7463f4383233c 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-cardinalities.cc<br>
@@ -70,18 +70,18 @@ class BetweenCardinalityImpl : public CardinalityInterface {<br>
<br>
   // Conservative estimate on the lower/upper bound of the number of<br>
   // calls allowed.<br>
-  virtual int ConservativeLowerBound() const { return min_; }<br>
-  virtual int ConservativeUpperBound() const { return max_; }<br>
+  int ConservativeLowerBound() const override { return min_; }<br>
+  int ConservativeUpperBound() const override { return max_; }<br>
<br>
-  virtual bool IsSatisfiedByCallCount(int call_count) const {<br>
+  bool IsSatisfiedByCallCount(int call_count) const override {<br>
     return min_ <= call_count && call_count <= max_;<br>
   }<br>
<br>
-  virtual bool IsSaturatedByCallCount(int call_count) const {<br>
+  bool IsSaturatedByCallCount(int call_count) const override {<br>
     return call_count >= max_;<br>
   }<br>
<br>
-  virtual void DescribeTo(::std::ostream* os) const;<br>
+  void DescribeTo(::std::ostream* os) const override;<br>
<br>
  private:<br>
   const int min_;<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc b/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
index e3a674859a85d..e5b547981d14d 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-internal-utils.cc<br>
@@ -93,8 +93,8 @@ GTEST_API_ std::string ConvertIdentifierNameToWords(const char* id_name) {<br>
 // use Google Mock with a testing framework other than Google Test.<br>
 class GoogleTestFailureReporter : public FailureReporterInterface {<br>
  public:<br>
-  virtual void ReportFailure(FailureType type, const char* file, int line,<br>
-                             const std::string& message) {<br>
+  void ReportFailure(FailureType type, const char* file, int line,<br>
+                     const std::string& message) override {<br>
     AssertHelper(type == kFatal ?<br>
                  TestPartResult::kFatalFailure :<br>
                  TestPartResult::kNonFatalFailure,<br>
@@ -123,8 +123,8 @@ GTEST_API_ FailureReporterInterface* GetFailureReporter() {<br>
 // Protects global resources (stdout in particular) used by Log().<br>
 static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex);<br>
<br>
-// Returns true iff a log with the given severity is visible according<br>
-// to the --gmock_verbose flag.<br>
+// Returns true if and only if a log with the given severity is visible<br>
+// according to the --gmock_verbose flag.<br>
 GTEST_API_ bool LogIsVisible(LogSeverity severity) {<br>
   if (GMOCK_FLAG(verbose) == kInfoVerbosity) {<br>
     // Always show the log if --gmock_verbose=info.<br>
@@ -139,7 +139,7 @@ GTEST_API_ bool LogIsVisible(LogSeverity severity) {<br>
   }<br>
 }<br>
<br>
-// Prints the given message to stdout iff 'severity' >= the level<br>
+// Prints the given message to stdout if and only if 'severity' >= the level<br>
 // specified by the --gmock_verbose flag.  If stack_frames_to_skip >=<br>
 // 0, also prints the stack trace excluding the top<br>
 // stack_frames_to_skip frames.  In opt mode, any positive<br>
@@ -154,9 +154,6 @@ GTEST_API_ void Log(LogSeverity severity, const std::string& message,<br>
   // Ensures that logs from <br>
diff erent threads don't interleave.<br>
   MutexLock l(&g_log_mutex);<br>
<br>
-  // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is a<br>
-  // macro.<br>
-<br>
   if (severity == kWarning) {<br>
     // Prints a GMOCK WARNING marker to make the warnings easily searchable.<br>
     std::cout << "\nGMOCK WARNING:";<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/src/gmock-matchers.cc b/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
index f8ddff15b5c05..4a3f7af2351de 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-matchers.cc<br>
@@ -42,116 +42,6 @@<br>
 #include <string><br>
<br>
 namespace testing {<br>
-<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const ::string& s) {<br>
-  *this = Eq(static_cast<std::string>(s));<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a const std::string& whose value is<br>
-// equal to s.<br>
-Matcher<const std::string&>::Matcher(const char* s) {<br>
-  *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const ::string& s) {<br>
-  *this = Eq(static_cast<std::string>(s));<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a std::string whose value is equal to<br>
-// s.<br>
-Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const std::string& s) {<br>
-  *this = Eq(static_cast<::string>(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-<br>
-// Constructs a matcher that matches a const ::string& whose value is<br>
-// equal to s.<br>
-Matcher<const ::string&>::Matcher(const char* s) { *this = Eq(::string(s)); }<br>
-<br>
-// Constructs a matcher that matches a ::string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const std::string& s) {<br>
-  *this = Eq(static_cast<::string>(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a ::string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-<br>
-// Constructs a matcher that matches a string whose value is equal to s.<br>
-Matcher<::string>::Matcher(const char* s) { *this = Eq(::string(s)); }<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_ABSL<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const std::string& s) {<br>
-  *this = Eq(s);<br>
-}<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(const char* s) {<br>
-  *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a const absl::string_view& whose value is<br>
-// equal to s.<br>
-Matcher<const absl::string_view&>::Matcher(absl::string_view s) {<br>
-  *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }<br>
-<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const ::string& s) { *this = Eq(s); }<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(const char* s) {<br>
-  *this = Eq(std::string(s));<br>
-}<br>
-<br>
-// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
-// s.<br>
-Matcher<absl::string_view>::Matcher(absl::string_view s) {<br>
-  *this = Eq(std::string(s));<br>
-}<br>
-#endif  // GTEST_HAS_ABSL<br>
-<br>
 namespace internal {<br>
<br>
 // Returns the description for a matcher defined using the MATCHER*()<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc b/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
index b93f4e0ef6b50..f9d3434560b40 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock-spec-builders.cc<br>
@@ -38,6 +38,7 @@<br>
 #include <stdlib.h><br>
 #include <iostream>  // NOLINT<br>
 #include <map><br>
+#include <memory><br>
 #include <set><br>
 #include <string><br>
 #include <vector><br>
@@ -49,9 +50,9 @@<br>
 #endif<br>
<br>
 // Silence C4800 (C4800: 'int *const ': forcing value<br>
-// to bool 'true' or 'false') for MSVC 14,15<br>
+// to bool 'true' or 'false') for MSVC 15<br>
 #ifdef _MSC_VER<br>
-#if _MSC_VER <= 1900<br>
+#if _MSC_VER == 1900<br>
 #  pragma warning(push)<br>
 #  pragma warning(disable:4800)<br>
 #endif<br>
@@ -125,8 +126,8 @@ void ExpectationBase::RetireAllPreRequisites()<br>
   }<br>
 }<br>
<br>
-// Returns true iff all pre-requisites of this expectation have been<br>
-// satisfied.<br>
+// Returns true if and only if all pre-requisites of this expectation<br>
+// have been satisfied.<br>
 bool ExpectationBase::AllPrerequisitesAreSatisfied() const<br>
     GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {<br>
   g_gmock_mutex.AssertHeld();<br>
@@ -291,17 +292,17 @@ void ReportUninterestingCall(CallReaction reaction, const std::string& msg) {<br>
               "an EXPECT_CALL() if you don't mean to enforce the call.  "<br>
               "See "<br>
               "<a href="https://github.com/google/googletest/blob/master/googlemock/" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googlemock/</a>"<br>
-              "docs/CookBook.md#"<br>
+              "docs/cook_book.md#"<br>
               "knowing-when-to-expect for details.\n",<br>
           stack_frames_to_skip);<br>
       break;<br>
     default:  // FAIL<br>
-      Expect(false, NULL, -1, msg);<br>
+      Expect(false, nullptr, -1, msg);<br>
   }<br>
 }<br>
<br>
 UntypedFunctionMockerBase::UntypedFunctionMockerBase()<br>
-    : mock_obj_(NULL), name_("") {}<br>
+    : mock_obj_(nullptr), name_("") {}<br>
<br>
 UntypedFunctionMockerBase::~UntypedFunctionMockerBase() {}<br>
<br>
@@ -340,7 +341,7 @@ const void* UntypedFunctionMockerBase::MockObject() const<br>
     // We protect mock_obj_ under g_gmock_mutex in case this mock<br>
     // function is called from two threads concurrently.<br>
     MutexLock l(&g_gmock_mutex);<br>
-    Assert(mock_obj_ != NULL, __FILE__, __LINE__,<br>
+    Assert(mock_obj_ != nullptr, __FILE__, __LINE__,<br>
            "MockObject() must not be called before RegisterOwner() or "<br>
            "SetOwnerAndName() has been called.");<br>
     mock_obj = mock_obj_;<br>
@@ -357,7 +358,7 @@ const char* UntypedFunctionMockerBase::Name() const<br>
     // We protect name_ under g_gmock_mutex in case this mock<br>
     // function is called from two threads concurrently.<br>
     MutexLock l(&g_gmock_mutex);<br>
-    Assert(name_ != NULL, __FILE__, __LINE__,<br>
+    Assert(name_ != nullptr, __FILE__, __LINE__,<br>
            "Name() must not be called before SetOwnerAndName() has "<br>
            "been called.");<br>
     name = name_;<br>
@@ -383,7 +384,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
     const CallReaction reaction =<br>
         Mock::GetReactionOnUninterestingCalls(MockObject());<br>
<br>
-    // True iff we need to print this call's arguments and return<br>
+    // True if and only if we need to print this call's arguments and return<br>
     // value.  This definition must be kept in sync with<br>
     // the behavior of ReportUninterestingCall().<br>
     const bool need_to_report_uninteresting_call =<br>
@@ -414,8 +415,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
         this->UntypedPerformDefaultAction(untyped_args, ss.str());<br>
<br>
     // Prints the function result.<br>
-    if (result != NULL)<br>
-      result->PrintAsActionResult(&ss);<br>
+    if (result != nullptr) result->PrintAsActionResult(&ss);<br>
<br>
     ReportUninterestingCall(reaction, ss.str());<br>
     return result;<br>
@@ -425,7 +425,7 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
   ::std::stringstream ss;<br>
   ::std::stringstream why;<br>
   ::std::stringstream loc;<br>
-  const void* untyped_action = NULL;<br>
+  const void* untyped_action = nullptr;<br>
<br>
   // The UntypedFindMatchingExpectation() function acquires and<br>
   // releases g_gmock_mutex.<br>
@@ -433,19 +433,19 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
       this->UntypedFindMatchingExpectation(<br>
           untyped_args, &untyped_action, &is_excessive,<br>
           &ss, &why);<br>
-  const bool found = untyped_expectation != NULL;<br>
+  const bool found = untyped_expectation != nullptr;<br>
<br>
-  // True iff we need to print the call's arguments and return value.<br>
+  // True if and only if we need to print the call's arguments<br>
+  // and return value.<br>
   // This definition must be kept in sync with the uses of Expect()<br>
   // and Log() in this function.<br>
   const bool need_to_report_call =<br>
       !found || is_excessive || LogIsVisible(kInfo);<br>
   if (!need_to_report_call) {<br>
     // Perform the action without printing the call information.<br>
-    return<br>
-        untyped_action == NULL ?<br>
-        this->UntypedPerformDefaultAction(untyped_args, "") :<br>
-        this->UntypedPerformAction(untyped_action, untyped_args);<br>
+    return untyped_action == nullptr<br>
+               ? this->UntypedPerformDefaultAction(untyped_args, "")<br>
+               : this->UntypedPerformAction(untyped_action, untyped_args);<br>
   }<br>
<br>
   ss << "    Function call: " << Name();<br>
@@ -458,16 +458,15 @@ UntypedActionResultHolderBase* UntypedFunctionMockerBase::UntypedInvokeWith(<br>
   }<br>
<br>
   UntypedActionResultHolderBase* const result =<br>
-      untyped_action == NULL ?<br>
-      this->UntypedPerformDefaultAction(untyped_args, ss.str()) :<br>
-      this->UntypedPerformAction(untyped_action, untyped_args);<br>
-  if (result != NULL)<br>
-    result->PrintAsActionResult(&ss);<br>
+      untyped_action == nullptr<br>
+          ? this->UntypedPerformDefaultAction(untyped_args, ss.str())<br>
+          : this->UntypedPerformAction(untyped_action, untyped_args);<br>
+  if (result != nullptr) result->PrintAsActionResult(&ss);<br>
   ss << "\n" << why.str();<br>
<br>
   if (!found) {<br>
     // No expectation matches this call - reports a failure.<br>
-    Expect(false, NULL, -1, ss.str());<br>
+    Expect(false, nullptr, -1, ss.str());<br>
   } else if (is_excessive) {<br>
     // We had an upper-bound violation and the failure message is in ss.<br>
     Expect(false, untyped_expectation->file(),<br>
@@ -568,15 +567,15 @@ typedef std::set<internal::UntypedFunctionMockerBase*> FunctionMockers;<br>
 // expectations.<br>
 struct MockObjectState {<br>
   MockObjectState()<br>
-      : first_used_file(NULL), first_used_line(-1), leakable(false) {}<br>
+      : first_used_file(nullptr), first_used_line(-1), leakable(false) {}<br>
<br>
   // Where in the source file an ON_CALL or EXPECT_CALL is first<br>
   // invoked on this mock object.<br>
   const char* first_used_file;<br>
   int first_used_line;<br>
-  ::std::string first_used_test_case;<br>
+  ::std::string first_used_test_suite;<br>
   ::std::string first_used_test;<br>
-  bool leakable;  // true iff it's OK to leak the object.<br>
+  bool leakable;  // true if and only if it's OK to leak the object.<br>
   FunctionMockers function_mockers;  // All registered methods of the object.<br>
 };<br>
<br>
@@ -594,9 +593,6 @@ class MockObjectRegistry {<br>
   // object alive.  Therefore we report any living object as test<br>
   // failure, unless the user explicitly asked us to ignore it.<br>
   ~MockObjectRegistry() {<br>
-    // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is<br>
-    // a macro.<br>
-<br>
     if (!GMOCK_FLAG(catch_leaked_mocks))<br>
       return;<br>
<br>
@@ -614,8 +610,8 @@ class MockObjectRegistry {<br>
                                                 state.first_used_line);<br>
       std::cout << " ERROR: this mock object";<br>
       if (state.first_used_test != "") {<br>
-        std::cout << " (used in test " << state.first_used_test_case << "."<br>
-             << state.first_used_test << ")";<br>
+        std::cout << " (used in test " << state.first_used_test_suite << "."<br>
+                  << state.first_used_test << ")";<br>
       }<br>
       std::cout << " should be deleted but never is. Its address is @"<br>
            << it->first << ".";<br>
@@ -723,7 +719,7 @@ bool Mock::VerifyAndClearExpectations(void* mock_obj)<br>
 }<br>
<br>
 // Verifies all expectations on the given mock object and clears its<br>
-// default actions and expectations.  Returns true iff the<br>
+// default actions and expectations.  Returns true if and only if the<br>
 // verification was successful.<br>
 bool Mock::VerifyAndClear(void* mock_obj)<br>
     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
@@ -760,6 +756,19 @@ bool Mock::VerifyAndClearExpectationsLocked(void* mock_obj)<br>
   return expectations_met;<br>
 }<br>
<br>
+bool Mock::IsNaggy(void* mock_obj)<br>
+    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kWarn;<br>
+}<br>
+bool Mock::IsNice(void* mock_obj)<br>
+    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kAllow;<br>
+}<br>
+bool Mock::IsStrict(void* mock_obj)<br>
+    GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
+  return Mock::GetReactionOnUninterestingCalls(mock_obj) == internal::kFail;<br>
+}<br>
+<br>
 // Registers a mock object and a mock method it owns.<br>
 void Mock::Register(const void* mock_obj,<br>
                     internal::UntypedFunctionMockerBase* mocker)<br>
@@ -776,16 +785,13 @@ void Mock::RegisterUseByOnCallOrExpectCall(const void* mock_obj,<br>
     GTEST_LOCK_EXCLUDED_(internal::g_gmock_mutex) {<br>
   internal::MutexLock l(&internal::g_gmock_mutex);<br>
   MockObjectState& state = g_mock_object_registry.states()[mock_obj];<br>
-  if (state.first_used_file == NULL) {<br>
+  if (state.first_used_file == nullptr) {<br>
     state.first_used_file = file;<br>
     state.first_used_line = line;<br>
     const TestInfo* const test_info =<br>
         UnitTest::GetInstance()->current_test_info();<br>
-    if (test_info != NULL) {<br>
-      // FIXME: record the test case name when the<br>
-      // ON_CALL or EXPECT_CALL is invoked from SetUpTestCase() or<br>
-      // TearDownTestCase().<br>
-      state.first_used_test_case = test_info->test_case_name();<br>
+    if (test_info != nullptr) {<br>
+      state.first_used_test_suite = test_info->test_suite_name();<br>
       state.first_used_test = test_info->name();<br>
     }<br>
   }<br>
@@ -838,7 +844,7 @@ void Mock::ClearDefaultActionsLocked(void* mock_obj)<br>
 Expectation::Expectation() {}<br>
<br>
 Expectation::Expectation(<br>
-    const internal::linked_ptr<internal::ExpectationBase>& an_expectation_base)<br>
+    const std::shared_ptr<internal::ExpectationBase>& an_expectation_base)<br>
     : expectation_base_(an_expectation_base) {}<br>
<br>
 Expectation::~Expectation() {}<br>
@@ -846,7 +852,7 @@ Expectation::~Expectation() {}<br>
 // Adds an expectation to a sequence.<br>
 void Sequence::AddExpectation(const Expectation& expectation) const {<br>
   if (*last_expectation_ != expectation) {<br>
-    if (last_expectation_->expectation_base() != NULL) {<br>
+    if (last_expectation_->expectation_base() != nullptr) {<br>
       expectation.expectation_base()->immediate_prerequisites_<br>
           += *last_expectation_;<br>
     }<br>
@@ -856,7 +862,7 @@ void Sequence::AddExpectation(const Expectation& expectation) const {<br>
<br>
 // Creates the implicit sequence if there isn't one.<br>
 InSequence::InSequence() {<br>
-  if (internal::g_gmock_implicit_sequence.get() == NULL) {<br>
+  if (internal::g_gmock_implicit_sequence.get() == nullptr) {<br>
     internal::g_gmock_implicit_sequence.set(new Sequence);<br>
     sequence_created_ = true;<br>
   } else {<br>
@@ -869,14 +875,14 @@ InSequence::InSequence() {<br>
 InSequence::~InSequence() {<br>
   if (sequence_created_) {<br>
     delete internal::g_gmock_implicit_sequence.get();<br>
-    internal::g_gmock_implicit_sequence.set(NULL);<br>
+    internal::g_gmock_implicit_sequence.set(nullptr);<br>
   }<br>
 }<br>
<br>
 }  // namespace testing<br>
<br>
 #ifdef _MSC_VER<br>
-#if _MSC_VER <= 1900<br>
+#if _MSC_VER == 1900<br>
 #  pragma warning(pop)<br>
 #endif<br>
 #endif<br>
<br>
diff  --git a/llvm/utils/unittest/googlemock/src/gmock.cc b/llvm/utils/unittest/googlemock/src/gmock.cc<br>
index 36356c9334ee2..32b2a7394fd08 100644<br>
--- a/llvm/utils/unittest/googlemock/src/gmock.cc<br>
+++ b/llvm/utils/unittest/googlemock/src/gmock.cc<br>
@@ -33,12 +33,9 @@<br>
<br>
 namespace testing {<br>
<br>
-// FIXME: support using environment variables to<br>
-// control the flag values, like what Google Test does.<br>
-<br>
 GMOCK_DEFINE_bool_(catch_leaked_mocks, true,<br>
-                   "true iff Google Mock should report leaked mock objects "<br>
-                   "as failures.");<br>
+                   "true if and only if Google Mock should report leaked "<br>
+                   "mock objects as failures.");<br>
<br>
 GMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity,<br>
                      "Controls how verbose Google Mock's output is."<br>
@@ -65,12 +62,12 @@ static const char* ParseGoogleMockFlagValue(const char* str,<br>
                                             const char* flag,<br>
                                             bool def_optional) {<br>
   // str and flag must not be NULL.<br>
-  if (str == NULL || flag == NULL) return NULL;<br>
+  if (str == nullptr || flag == nullptr) return nullptr;<br>
<br>
   // The flag must start with "--gmock_".<br>
   const std::string flag_str = std::string("--gmock_") + flag;<br>
   const size_t flag_len = flag_str.length();<br>
-  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;<br>
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;<br>
<br>
   // Skips the flag name.<br>
   const char* flag_end = str + flag_len;<br>
@@ -83,7 +80,7 @@ static const char* ParseGoogleMockFlagValue(const char* str,<br>
   // If def_optional is true and there are more characters after the<br>
   // flag name, or if def_optional is false, there must be a '=' after<br>
   // the flag name.<br>
-  if (flag_end[0] != '=') return NULL;<br>
+  if (flag_end[0] != '=') return nullptr;<br>
<br>
   // Returns the string after "=".<br>
   return flag_end + 1;<br>
@@ -100,7 +97,7 @@ static bool ParseGoogleMockBoolFlag(const char* str, const char* flag,<br>
   const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Converts the string value to a bool.<br>
   *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');<br>
@@ -119,7 +116,7 @@ static bool ParseGoogleMockStringFlag(const char* str, const char* flag,<br>
   const char* const value_str = ParseGoogleMockFlagValue(str, flag, false);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Sets *value to the value of the flag.<br>
   *value = value_str;<br>
@@ -132,7 +129,7 @@ static bool ParseGoogleMockIntFlag(const char* str, const char* flag,<br>
   const char* const value_str = ParseGoogleMockFlagValue(str, flag, true);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Sets *value to the value of the flag.<br>
   return ParseInt32(Message() << "The value of flag --" << flag,<br>
@@ -201,4 +198,16 @@ GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) {<br>
   internal::InitGoogleMockImpl(argc, argv);<br>
 }<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleMock() {<br>
+  // Since Arduino doesn't have a command line, fake out the argc/argv arguments<br>
+  int argc = 1;<br>
+  const auto arg0 = "dummy";<br>
+  char* argv0 = const_cast<char*>(arg0);<br>
+  char** argv = &argv0;<br>
+<br>
+  internal::InitGoogleMockImpl(&argc, argv);<br>
+}<br>
+<br>
 }  // namespace testing<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
index 20c54d869519f..dc878ffbb3ae5 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-death-test.h<br>
@@ -161,7 +161,6 @@ GTEST_API_ bool InDeathTestChild();<br>
 //   is rarely a problem as people usually don't put the test binary<br>
 //   directory in PATH.<br>
 //<br>
-// FIXME: make thread-safe death tests search the PATH.<br>
<br>
 // Asserts that a given statement causes the program to exit, with an<br>
 // integer exit status that satisfies predicate, and emitting error output<br>
@@ -170,7 +169,7 @@ GTEST_API_ bool InDeathTestChild();<br>
     GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_)<br>
<br>
 // Like ASSERT_EXIT, but continues on to successive tests in the<br>
-// test case, if any:<br>
+// test suite, if any:<br>
 # define EXPECT_EXIT(statement, predicate, regex) \<br>
     GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_)<br>
<br>
@@ -181,7 +180,7 @@ GTEST_API_ bool InDeathTestChild();<br>
     ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)<br>
<br>
 // Like ASSERT_DEATH, but continues on to successive tests in the<br>
-// test case, if any:<br>
+// test suite, if any:<br>
 # define EXPECT_DEATH(statement, regex) \<br>
     EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex)<br>
<br>
@@ -228,7 +227,7 @@ class GTEST_API_ KilledBySignal {<br>
 //   return 12;<br>
 // }<br>
 //<br>
-// TEST(TestCase, TestDieOr12WorksInDgbAndOpt) {<br>
+// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) {<br>
 //   int sideeffect = 0;<br>
 //   // Only asserts in dbg.<br>
 //   EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death");<br>
@@ -277,20 +276,20 @@ class GTEST_API_ KilledBySignal {<br>
 // This macro is used for implementing macros such as<br>
 // EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where<br>
 // death tests are not supported. Those macros must compile on such systems<br>
-// iff EXPECT_DEATH and ASSERT_DEATH compile with the same parameters on<br>
-// systems that support death tests. This allows one to write such a macro<br>
-// on a system that does not support death tests and be sure that it will<br>
-// compile on a death-test supporting system. It is exposed publicly so that<br>
-// systems that have death-tests with stricter requirements than<br>
-// GTEST_HAS_DEATH_TEST can write their own equivalent of<br>
-// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED.<br>
+// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters<br>
+// on systems that support death tests. This allows one to write such a macro on<br>
+// a system that does not support death tests and be sure that it will compile<br>
+// on a death-test supporting system. It is exposed publicly so that systems<br>
+// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST<br>
+// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and<br>
+// ASSERT_DEATH_IF_SUPPORTED.<br>
 //<br>
 // Parameters:<br>
 //   statement -  A statement that a macro such as EXPECT_DEATH would test<br>
 //                for program termination. This macro has to make sure this<br>
 //                statement is compiled but not executed, to ensure that<br>
 //                EXPECT_DEATH_IF_SUPPORTED compiles with a certain<br>
-//                parameter iff EXPECT_DEATH compiles with it.<br>
+//                parameter if and only if EXPECT_DEATH compiles with it.<br>
 //   regex     -  A regex that a macro such as EXPECT_DEATH would use to test<br>
 //                the output of statement.  This parameter has to be<br>
 //                compiled but not evaluated by this macro, to ensure that<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h b/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
new file mode 100644<br>
index 0000000000000..9de6c2e10a20d<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-matchers.h<br>
@@ -0,0 +1,750 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+//     * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+//     * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+//     * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// The Google C++ Testing and Mocking Framework (Google Test)<br>
+//<br>
+// This file implements just enough of the matcher interface to allow<br>
+// EXPECT_DEATH and friends to accept a matcher argument.<br>
+<br>
+// IWYU pragma: private, include "testing/base/public/gunit.h"<br>
+// IWYU pragma: friend third_party/googletest/googlemock/.*<br>
+// IWYU pragma: friend third_party/googletest/googletest/.*<br>
+<br>
+#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
+#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
+<br>
+#include <memory><br>
+#include <ostream><br>
+#include <string><br>
+#include <type_traits><br>
+<br>
+#include "gtest/gtest-printers.h"<br>
+#include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
+<br>
+// MSVC warning C5046 is new as of VS2017 version 15.8.<br>
+#if defined(_MSC_VER) && _MSC_VER >= 1915<br>
+#define GTEST_MAYBE_5046_ 5046<br>
+#else<br>
+#define GTEST_MAYBE_5046_<br>
+#endif<br>
+<br>
+GTEST_DISABLE_MSC_WARNINGS_PUSH_(<br>
+    4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by<br>
+                              clients of class B */<br>
+    /* Symbol involving type with internal linkage not defined */)<br>
+<br>
+namespace testing {<br>
+<br>
+// To implement a matcher Foo for type T, define:<br>
+//   1. a class FooMatcherImpl that implements the<br>
+//      MatcherInterface<T> interface, and<br>
+//   2. a factory function that creates a Matcher<T> object from a<br>
+//      FooMatcherImpl*.<br>
+//<br>
+// The two-level delegation design makes it possible to allow a user<br>
+// to write "v" instead of "Eq(v)" where a Matcher is expected, which<br>
+// is impossible if we pass matchers by pointers.  It also eases<br>
+// ownership management as Matcher objects can now be copied like<br>
+// plain values.<br>
+<br>
+// MatchResultListener is an abstract class.  Its << operator can be<br>
+// used by a matcher to explain why a value matches or doesn't match.<br>
+//<br>
+class MatchResultListener {<br>
+ public:<br>
+  // Creates a listener object with the given underlying ostream.  The<br>
+  // listener does not own the ostream, and does not dereference it<br>
+  // in the constructor or destructor.<br>
+  explicit MatchResultListener(::std::ostream* os) : stream_(os) {}<br>
+  virtual ~MatchResultListener() = 0;  // Makes this class abstract.<br>
+<br>
+  // Streams x to the underlying ostream; does nothing if the ostream<br>
+  // is NULL.<br>
+  template <typename T><br>
+  MatchResultListener& operator<<(const T& x) {<br>
+    if (stream_ != nullptr) *stream_ << x;<br>
+    return *this;<br>
+  }<br>
+<br>
+  // Returns the underlying ostream.<br>
+  ::std::ostream* stream() { return stream_; }<br>
+<br>
+  // Returns true if and only if the listener is interested in an explanation<br>
+  // of the match result.  A matcher's MatchAndExplain() method can use<br>
+  // this information to avoid generating the explanation when no one<br>
+  // intends to hear it.<br>
+  bool IsInterested() const { return stream_ != nullptr; }<br>
+<br>
+ private:<br>
+  ::std::ostream* const stream_;<br>
+<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener);<br>
+};<br>
+<br>
+inline MatchResultListener::~MatchResultListener() {<br>
+}<br>
+<br>
+// An instance of a subclass of this knows how to describe itself as a<br>
+// matcher.<br>
+class MatcherDescriberInterface {<br>
+ public:<br>
+  virtual ~MatcherDescriberInterface() {}<br>
+<br>
+  // Describes this matcher to an ostream.  The function should print<br>
+  // a verb phrase that describes the property a value matching this<br>
+  // matcher should have.  The subject of the verb phrase is the value<br>
+  // being matched.  For example, the DescribeTo() method of the Gt(7)<br>
+  // matcher prints "is greater than 7".<br>
+  virtual void DescribeTo(::std::ostream* os) const = 0;<br>
+<br>
+  // Describes the negation of this matcher to an ostream.  For<br>
+  // example, if the description of this matcher is "is greater than<br>
+  // 7", the negated description could be "is not greater than 7".<br>
+  // You are not required to override this when implementing<br>
+  // MatcherInterface, but it is highly advised so that your matcher<br>
+  // can produce good error messages.<br>
+  virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+    *os << "not (";<br>
+    DescribeTo(os);<br>
+    *os << ")";<br>
+  }<br>
+};<br>
+<br>
+// The implementation of a matcher.<br>
+template <typename T><br>
+class MatcherInterface : public MatcherDescriberInterface {<br>
+ public:<br>
+  // Returns true if and only if the matcher matches x; also explains the<br>
+  // match result to 'listener' if necessary (see the next paragraph), in<br>
+  // the form of a non-restrictive relative clause ("which ...",<br>
+  // "whose ...", etc) that describes x.  For example, the<br>
+  // MatchAndExplain() method of the Pointee(...) matcher should<br>
+  // generate an explanation like "which points to ...".<br>
+  //<br>
+  // Implementations of MatchAndExplain() should add an explanation of<br>
+  // the match result *if and only if* they can provide additional<br>
+  // information that's not already present (or not obvious) in the<br>
+  // print-out of x and the matcher's description.  Whether the match<br>
+  // succeeds is not a factor in deciding whether an explanation is<br>
+  // needed, as sometimes the caller needs to print a failure message<br>
+  // when the match succeeds (e.g. when the matcher is used inside<br>
+  // Not()).<br>
+  //<br>
+  // For example, a "has at least 10 elements" matcher should explain<br>
+  // what the actual element count is, regardless of the match result,<br>
+  // as it is useful information to the reader; on the other hand, an<br>
+  // "is empty" matcher probably only needs to explain what the actual<br>
+  // size is when the match fails, as it's redundant to say that the<br>
+  // size is 0 when the value is already known to be empty.<br>
+  //<br>
+  // You should override this method when defining a new matcher.<br>
+  //<br>
+  // It's the responsibility of the caller (Google Test) to guarantee<br>
+  // that 'listener' is not NULL.  This helps to simplify a matcher's<br>
+  // implementation when it doesn't care about the performance, as it<br>
+  // can talk to 'listener' without checking its validity first.<br>
+  // However, in order to implement dummy listeners efficiently,<br>
+  // listener->stream() may be NULL.<br>
+  virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0;<br>
+<br>
+  // Inherits these methods from MatcherDescriberInterface:<br>
+  //   virtual void DescribeTo(::std::ostream* os) const = 0;<br>
+  //   virtual void DescribeNegationTo(::std::ostream* os) const;<br>
+};<br>
+<br>
+namespace internal {<br>
+<br>
+// Converts a MatcherInterface<T> to a MatcherInterface<const T&>.<br>
+template <typename T><br>
+class MatcherInterfaceAdapter : public MatcherInterface<const T&> {<br>
+ public:<br>
+  explicit MatcherInterfaceAdapter(const MatcherInterface<T>* impl)<br>
+      : impl_(impl) {}<br>
+  ~MatcherInterfaceAdapter() override { delete impl_; }<br>
+<br>
+  void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); }<br>
+<br>
+  void DescribeNegationTo(::std::ostream* os) const override {<br>
+    impl_->DescribeNegationTo(os);<br>
+  }<br>
+<br>
+  bool MatchAndExplain(const T& x,<br>
+                       MatchResultListener* listener) const override {<br>
+    return impl_->MatchAndExplain(x, listener);<br>
+  }<br>
+<br>
+ private:<br>
+  const MatcherInterface<T>* const impl_;<br>
+<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter);<br>
+};<br>
+<br>
+struct AnyEq {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a == b; }<br>
+};<br>
+struct AnyNe {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a != b; }<br>
+};<br>
+struct AnyLt {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a < b; }<br>
+};<br>
+struct AnyGt {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a > b; }<br>
+};<br>
+struct AnyLe {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a <= b; }<br>
+};<br>
+struct AnyGe {<br>
+  template <typename A, typename B><br>
+  bool operator()(const A& a, const B& b) const { return a >= b; }<br>
+};<br>
+<br>
+// A match result listener that ignores the explanation.<br>
+class DummyMatchResultListener : public MatchResultListener {<br>
+ public:<br>
+  DummyMatchResultListener() : MatchResultListener(nullptr) {}<br>
+<br>
+ private:<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener);<br>
+};<br>
+<br>
+// A match result listener that forwards the explanation to a given<br>
+// ostream.  The <br>
diff erence between this and MatchResultListener is<br>
+// that the former is concrete.<br>
+class StreamMatchResultListener : public MatchResultListener {<br>
+ public:<br>
+  explicit StreamMatchResultListener(::std::ostream* os)<br>
+      : MatchResultListener(os) {}<br>
+<br>
+ private:<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener);<br>
+};<br>
+<br>
+// An internal class for implementing Matcher<T>, which will derive<br>
+// from it.  We put functionalities common to all Matcher<T><br>
+// specializations here to avoid code duplication.<br>
+template <typename T><br>
+class MatcherBase {<br>
+ public:<br>
+  // Returns true if and only if the matcher matches x; also explains the<br>
+  // match result to 'listener'.<br>
+  bool MatchAndExplain(const T& x, MatchResultListener* listener) const {<br>
+    return impl_->MatchAndExplain(x, listener);<br>
+  }<br>
+<br>
+  // Returns true if and only if this matcher matches x.<br>
+  bool Matches(const T& x) const {<br>
+    DummyMatchResultListener dummy;<br>
+    return MatchAndExplain(x, &dummy);<br>
+  }<br>
+<br>
+  // Describes this matcher to an ostream.<br>
+  void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); }<br>
+<br>
+  // Describes the negation of this matcher to an ostream.<br>
+  void DescribeNegationTo(::std::ostream* os) const {<br>
+    impl_->DescribeNegationTo(os);<br>
+  }<br>
+<br>
+  // Explains why x matches, or doesn't match, the matcher.<br>
+  void ExplainMatchResultTo(const T& x, ::std::ostream* os) const {<br>
+    StreamMatchResultListener listener(os);<br>
+    MatchAndExplain(x, &listener);<br>
+  }<br>
+<br>
+  // Returns the describer for this matcher object; retains ownership<br>
+  // of the describer, which is only guaranteed to be alive when<br>
+  // this matcher object is alive.<br>
+  const MatcherDescriberInterface* GetDescriber() const {<br>
+    return impl_.get();<br>
+  }<br>
+<br>
+ protected:<br>
+  MatcherBase() {}<br>
+<br>
+  // Constructs a matcher from its implementation.<br>
+  explicit MatcherBase(const MatcherInterface<const T&>* impl) : impl_(impl) {}<br>
+<br>
+  template <typename U><br>
+  explicit MatcherBase(<br>
+      const MatcherInterface<U>* impl,<br>
+      typename std::enable_if<!std::is_same<U, const U&>::value>::type* =<br>
+          nullptr)<br>
+      : impl_(new internal::MatcherInterfaceAdapter<U>(impl)) {}<br>
+<br>
+  MatcherBase(const MatcherBase&) = default;<br>
+  MatcherBase& operator=(const MatcherBase&) = default;<br>
+  MatcherBase(MatcherBase&&) = default;<br>
+  MatcherBase& operator=(MatcherBase&&) = default;<br>
+<br>
+  virtual ~MatcherBase() {}<br>
+<br>
+ private:<br>
+  std::shared_ptr<const MatcherInterface<const T&>> impl_;<br>
+};<br>
+<br>
+}  // namespace internal<br>
+<br>
+// A Matcher<T> is a copyable and IMMUTABLE (except by assignment)<br>
+// object that can check whether a value of type T matches.  The<br>
+// implementation of Matcher<T> is just a std::shared_ptr to const<br>
+// MatcherInterface<T>.  Don't inherit from Matcher!<br>
+template <typename T><br>
+class Matcher : public internal::MatcherBase<T> {<br>
+ public:<br>
+  // Constructs a null matcher.  Needed for storing Matcher objects in STL<br>
+  // containers.  A default-constructed matcher is not yet initialized.  You<br>
+  // cannot use it until a valid value has been assigned to it.<br>
+  explicit Matcher() {}  // NOLINT<br>
+<br>
+  // Constructs a matcher from its implementation.<br>
+  explicit Matcher(const MatcherInterface<const T&>* impl)<br>
+      : internal::MatcherBase<T>(impl) {}<br>
+<br>
+  template <typename U><br>
+  explicit Matcher(<br>
+      const MatcherInterface<U>* impl,<br>
+      typename std::enable_if<!std::is_same<U, const U&>::value>::type* =<br>
+          nullptr)<br>
+      : internal::MatcherBase<T>(impl) {}<br>
+<br>
+  // Implicit constructor here allows people to write<br>
+  // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes<br>
+  Matcher(T value);  // NOLINT<br>
+};<br>
+<br>
+// The following two specializations allow the user to write str<br>
+// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string<br>
+// matcher is expected.<br>
+template <><br>
+class GTEST_API_ Matcher<const std::string&><br>
+    : public internal::MatcherBase<const std::string&> {<br>
+ public:<br>
+  Matcher() {}<br>
+<br>
+  explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
+      : internal::MatcherBase<const std::string&>(impl) {}<br>
+<br>
+  // Allows the user to write str instead of Eq(str) sometimes, where<br>
+  // str is a std::string object.<br>
+  Matcher(const std::string& s);  // NOLINT<br>
+<br>
+  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+  Matcher(const char* s);  // NOLINT<br>
+};<br>
+<br>
+template <><br>
+class GTEST_API_ Matcher<std::string><br>
+    : public internal::MatcherBase<std::string> {<br>
+ public:<br>
+  Matcher() {}<br>
+<br>
+  explicit Matcher(const MatcherInterface<const std::string&>* impl)<br>
+      : internal::MatcherBase<std::string>(impl) {}<br>
+  explicit Matcher(const MatcherInterface<std::string>* impl)<br>
+      : internal::MatcherBase<std::string>(impl) {}<br>
+<br>
+  // Allows the user to write str instead of Eq(str) sometimes, where<br>
+  // str is a string object.<br>
+  Matcher(const std::string& s);  // NOLINT<br>
+<br>
+  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+  Matcher(const char* s);  // NOLINT<br>
+};<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+// The following two specializations allow the user to write str<br>
+// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view<br>
+// matcher is expected.<br>
+template <><br>
+class GTEST_API_ Matcher<const absl::string_view&><br>
+    : public internal::MatcherBase<const absl::string_view&> {<br>
+ public:<br>
+  Matcher() {}<br>
+<br>
+  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
+      : internal::MatcherBase<const absl::string_view&>(impl) {}<br>
+<br>
+  // Allows the user to write str instead of Eq(str) sometimes, where<br>
+  // str is a std::string object.<br>
+  Matcher(const std::string& s);  // NOLINT<br>
+<br>
+  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+  Matcher(const char* s);  // NOLINT<br>
+<br>
+  // Allows the user to pass absl::string_views directly.<br>
+  Matcher(absl::string_view s);  // NOLINT<br>
+};<br>
+<br>
+template <><br>
+class GTEST_API_ Matcher<absl::string_view><br>
+    : public internal::MatcherBase<absl::string_view> {<br>
+ public:<br>
+  Matcher() {}<br>
+<br>
+  explicit Matcher(const MatcherInterface<const absl::string_view&>* impl)<br>
+      : internal::MatcherBase<absl::string_view>(impl) {}<br>
+  explicit Matcher(const MatcherInterface<absl::string_view>* impl)<br>
+      : internal::MatcherBase<absl::string_view>(impl) {}<br>
+<br>
+  // Allows the user to write str instead of Eq(str) sometimes, where<br>
+  // str is a std::string object.<br>
+  Matcher(const std::string& s);  // NOLINT<br>
+<br>
+  // Allows the user to write "foo" instead of Eq("foo") sometimes.<br>
+  Matcher(const char* s);  // NOLINT<br>
+<br>
+  // Allows the user to pass absl::string_views directly.<br>
+  Matcher(absl::string_view s);  // NOLINT<br>
+};<br>
+#endif  // GTEST_HAS_ABSL<br>
+<br>
+// Prints a matcher in a human-readable format.<br>
+template <typename T><br>
+std::ostream& operator<<(std::ostream& os, const Matcher<T>& matcher) {<br>
+  matcher.DescribeTo(&os);<br>
+  return os;<br>
+}<br>
+<br>
+// The PolymorphicMatcher class template makes it easy to implement a<br>
+// polymorphic matcher (i.e. a matcher that can match values of more<br>
+// than one type, e.g. Eq(n) and NotNull()).<br>
+//<br>
+// To define a polymorphic matcher, a user should provide an Impl<br>
+// class that has a DescribeTo() method and a DescribeNegationTo()<br>
+// method, and define a member function (or member function template)<br>
+//<br>
+//   bool MatchAndExplain(const Value& value,<br>
+//                        MatchResultListener* listener) const;<br>
+//<br>
+// See the definition of NotNull() for a complete example.<br>
+template <class Impl><br>
+class PolymorphicMatcher {<br>
+ public:<br>
+  explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {}<br>
+<br>
+  // Returns a mutable reference to the underlying matcher<br>
+  // implementation object.<br>
+  Impl& mutable_impl() { return impl_; }<br>
+<br>
+  // Returns an immutable reference to the underlying matcher<br>
+  // implementation object.<br>
+  const Impl& impl() const { return impl_; }<br>
+<br>
+  template <typename T><br>
+  operator Matcher<T>() const {<br>
+    return Matcher<T>(new MonomorphicImpl<const T&>(impl_));<br>
+  }<br>
+<br>
+ private:<br>
+  template <typename T><br>
+  class MonomorphicImpl : public MatcherInterface<T> {<br>
+   public:<br>
+    explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {}<br>
+<br>
+    virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); }<br>
+<br>
+    virtual void DescribeNegationTo(::std::ostream* os) const {<br>
+      impl_.DescribeNegationTo(os);<br>
+    }<br>
+<br>
+    virtual bool MatchAndExplain(T x, MatchResultListener* listener) const {<br>
+      return impl_.MatchAndExplain(x, listener);<br>
+    }<br>
+<br>
+   private:<br>
+    const Impl impl_;<br>
+  };<br>
+<br>
+  Impl impl_;<br>
+};<br>
+<br>
+// Creates a matcher from its implementation.<br>
+// DEPRECATED: Especially in the generic code, prefer:<br>
+//   Matcher<T>(new MyMatcherImpl<const T&>(...));<br>
+//<br>
+// MakeMatcher may create a Matcher that accepts its argument by value, which<br>
+// leads to unnecessary copies & lack of support for non-copyable types.<br>
+template <typename T><br>
+inline Matcher<T> MakeMatcher(const MatcherInterface<T>* impl) {<br>
+  return Matcher<T>(impl);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher from its implementation.  This is<br>
+// easier to use than the PolymorphicMatcher<Impl> constructor as it<br>
+// doesn't require you to explicitly write the template argument, e.g.<br>
+//<br>
+//   MakePolymorphicMatcher(foo);<br>
+// vs<br>
+//   PolymorphicMatcher<TypeOfFoo>(foo);<br>
+template <class Impl><br>
+inline PolymorphicMatcher<Impl> MakePolymorphicMatcher(const Impl& impl) {<br>
+  return PolymorphicMatcher<Impl>(impl);<br>
+}<br>
+<br>
+namespace internal {<br>
+// Implements a matcher that compares a given value with a<br>
+// pre-supplied value using one of the ==, <=, <, etc, operators.  The<br>
+// two values being compared don't have to have the same type.<br>
+//<br>
+// The matcher defined here is polymorphic (for example, Eq(5) can be<br>
+// used to match an int, a short, a double, etc).  Therefore we use<br>
+// a template type conversion operator in the implementation.<br>
+//<br>
+// The following template definition assumes that the Rhs parameter is<br>
+// a "bare" type (i.e. neither 'const T' nor 'T&').<br>
+template <typename D, typename Rhs, typename Op><br>
+class ComparisonBase {<br>
+ public:<br>
+  explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {}<br>
+  template <typename Lhs><br>
+  operator Matcher<Lhs>() const {<br>
+    return Matcher<Lhs>(new Impl<const Lhs&>(rhs_));<br>
+  }<br>
+<br>
+ private:<br>
+  template <typename T><br>
+  static const T& Unwrap(const T& v) { return v; }<br>
+  template <typename T><br>
+  static const T& Unwrap(std::reference_wrapper<T> v) { return v; }<br>
+<br>
+  template <typename Lhs, typename = Rhs><br>
+  class Impl : public MatcherInterface<Lhs> {<br>
+   public:<br>
+    explicit Impl(const Rhs& rhs) : rhs_(rhs) {}<br>
+    bool MatchAndExplain(Lhs lhs,<br>
+                         MatchResultListener* /* listener */) const override {<br>
+      return Op()(lhs, Unwrap(rhs_));<br>
+    }<br>
+    void DescribeTo(::std::ostream* os) const override {<br>
+      *os << D::Desc() << " ";<br>
+      UniversalPrint(Unwrap(rhs_), os);<br>
+    }<br>
+    void DescribeNegationTo(::std::ostream* os) const override {<br>
+      *os << D::NegatedDesc() <<  " ";<br>
+      UniversalPrint(Unwrap(rhs_), os);<br>
+    }<br>
+<br>
+   private:<br>
+    Rhs rhs_;<br>
+  };<br>
+  Rhs rhs_;<br>
+};<br>
+<br>
+template <typename Rhs><br>
+class EqMatcher : public ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq> {<br>
+ public:<br>
+  explicit EqMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<EqMatcher<Rhs>, Rhs, AnyEq>(rhs) { }<br>
+  static const char* Desc() { return "is equal to"; }<br>
+  static const char* NegatedDesc() { return "isn't equal to"; }<br>
+};<br>
+template <typename Rhs><br>
+class NeMatcher : public ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe> {<br>
+ public:<br>
+  explicit NeMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<NeMatcher<Rhs>, Rhs, AnyNe>(rhs) { }<br>
+  static const char* Desc() { return "isn't equal to"; }<br>
+  static const char* NegatedDesc() { return "is equal to"; }<br>
+};<br>
+template <typename Rhs><br>
+class LtMatcher : public ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt> {<br>
+ public:<br>
+  explicit LtMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<LtMatcher<Rhs>, Rhs, AnyLt>(rhs) { }<br>
+  static const char* Desc() { return "is <"; }<br>
+  static const char* NegatedDesc() { return "isn't <"; }<br>
+};<br>
+template <typename Rhs><br>
+class GtMatcher : public ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt> {<br>
+ public:<br>
+  explicit GtMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<GtMatcher<Rhs>, Rhs, AnyGt>(rhs) { }<br>
+  static const char* Desc() { return "is >"; }<br>
+  static const char* NegatedDesc() { return "isn't >"; }<br>
+};<br>
+template <typename Rhs><br>
+class LeMatcher : public ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe> {<br>
+ public:<br>
+  explicit LeMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<LeMatcher<Rhs>, Rhs, AnyLe>(rhs) { }<br>
+  static const char* Desc() { return "is <="; }<br>
+  static const char* NegatedDesc() { return "isn't <="; }<br>
+};<br>
+template <typename Rhs><br>
+class GeMatcher : public ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe> {<br>
+ public:<br>
+  explicit GeMatcher(const Rhs& rhs)<br>
+      : ComparisonBase<GeMatcher<Rhs>, Rhs, AnyGe>(rhs) { }<br>
+  static const char* Desc() { return "is >="; }<br>
+  static const char* NegatedDesc() { return "isn't >="; }<br>
+};<br>
+<br>
+// Implements polymorphic matchers MatchesRegex(regex) and<br>
+// ContainsRegex(regex), which can be used as a Matcher<T> as long as<br>
+// T can be converted to a string.<br>
+class MatchesRegexMatcher {<br>
+ public:<br>
+  MatchesRegexMatcher(const RE* regex, bool full_match)<br>
+      : regex_(regex), full_match_(full_match) {}<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+  bool MatchAndExplain(const absl::string_view& s,<br>
+                       MatchResultListener* listener) const {<br>
+    return MatchAndExplain(std::string(s), listener);<br>
+  }<br>
+#endif  // GTEST_HAS_ABSL<br>
+<br>
+  // Accepts pointer types, particularly:<br>
+  //   const char*<br>
+  //   char*<br>
+  //   const wchar_t*<br>
+  //   wchar_t*<br>
+  template <typename CharType><br>
+  bool MatchAndExplain(CharType* s, MatchResultListener* listener) const {<br>
+    return s != nullptr && MatchAndExplain(std::string(s), listener);<br>
+  }<br>
+<br>
+  // Matches anything that can convert to std::string.<br>
+  //<br>
+  // This is a template, not just a plain function with const std::string&,<br>
+  // because absl::string_view has some interfering non-explicit constructors.<br>
+  template <class MatcheeStringType><br>
+  bool MatchAndExplain(const MatcheeStringType& s,<br>
+                       MatchResultListener* /* listener */) const {<br>
+    const std::string& s2(s);<br>
+    return full_match_ ? RE::FullMatch(s2, *regex_)<br>
+                       : RE::PartialMatch(s2, *regex_);<br>
+  }<br>
+<br>
+  void DescribeTo(::std::ostream* os) const {<br>
+    *os << (full_match_ ? "matches" : "contains") << " regular expression ";<br>
+    UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
+  }<br>
+<br>
+  void DescribeNegationTo(::std::ostream* os) const {<br>
+    *os << "doesn't " << (full_match_ ? "match" : "contain")<br>
+        << " regular expression ";<br>
+    UniversalPrinter<std::string>::Print(regex_->pattern(), os);<br>
+  }<br>
+<br>
+ private:<br>
+  const std::shared_ptr<const RE> regex_;<br>
+  const bool full_match_;<br>
+};<br>
+}  // namespace internal<br>
+<br>
+// Matches a string that fully matches regular expression 'regex'.<br>
+// The matcher takes ownership of 'regex'.<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
+    const internal::RE* regex) {<br>
+  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true));<br>
+}<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> MatchesRegex(<br>
+    const std::string& regex) {<br>
+  return MatchesRegex(new internal::RE(regex));<br>
+}<br>
+<br>
+// Matches a string that contains regular expression 'regex'.<br>
+// The matcher takes ownership of 'regex'.<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
+    const internal::RE* regex) {<br>
+  return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false));<br>
+}<br>
+inline PolymorphicMatcher<internal::MatchesRegexMatcher> ContainsRegex(<br>
+    const std::string& regex) {<br>
+  return ContainsRegex(new internal::RE(regex));<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything equal to x.<br>
+// Note: if the parameter of Eq() were declared as const T&, Eq("foo")<br>
+// wouldn't compile.<br>
+template <typename T><br>
+inline internal::EqMatcher<T> Eq(T x) { return internal::EqMatcher<T>(x); }<br>
+<br>
+// Constructs a Matcher<T> from a 'value' of type T.  The constructed<br>
+// matcher matches any value that's equal to 'value'.<br>
+template <typename T><br>
+Matcher<T>::Matcher(T value) { *this = Eq(value); }<br>
+<br>
+// Creates a monomorphic matcher that matches anything with type Lhs<br>
+// and equal to rhs.  A user may need to use this instead of Eq(...)<br>
+// in order to resolve an overloading ambiguity.<br>
+//<br>
+// TypedEq<T>(x) is just a convenient short-hand for Matcher<T>(Eq(x))<br>
+// or Matcher<T>(x), but more readable than the latter.<br>
+//<br>
+// We could define similar monomorphic matchers for other comparison<br>
+// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do<br>
+// it yet as those are used much less than Eq() in practice.  A user<br>
+// can always write Matcher<T>(Lt(5)) to be explicit about the type,<br>
+// for example.<br>
+template <typename Lhs, typename Rhs><br>
+inline Matcher<Lhs> TypedEq(const Rhs& rhs) { return Eq(rhs); }<br>
+<br>
+// Creates a polymorphic matcher that matches anything >= x.<br>
+template <typename Rhs><br>
+inline internal::GeMatcher<Rhs> Ge(Rhs x) {<br>
+  return internal::GeMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything > x.<br>
+template <typename Rhs><br>
+inline internal::GtMatcher<Rhs> Gt(Rhs x) {<br>
+  return internal::GtMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything <= x.<br>
+template <typename Rhs><br>
+inline internal::LeMatcher<Rhs> Le(Rhs x) {<br>
+  return internal::LeMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything < x.<br>
+template <typename Rhs><br>
+inline internal::LtMatcher<Rhs> Lt(Rhs x) {<br>
+  return internal::LtMatcher<Rhs>(x);<br>
+}<br>
+<br>
+// Creates a polymorphic matcher that matches anything != x.<br>
+template <typename Rhs><br>
+inline internal::NeMatcher<Rhs> Ne(Rhs x) {<br>
+  return internal::NeMatcher<Rhs>(x);<br>
+}<br>
+}  // namespace testing<br>
+<br>
+GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251 5046<br>
+<br>
+#endif  // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-message.h b/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
index 892e086466ad5..cbabe5defd77d 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-message.h<br>
@@ -48,6 +48,7 @@<br>
 #define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_<br>
<br>
 #include <limits><br>
+#include <memory><br>
<br>
 #include "gtest/internal/gtest-port.h"<br>
 #include "gtest/internal/custom/raw-ostream.h"<br>
@@ -107,14 +108,6 @@ class GTEST_API_ Message {<br>
     *ss_ << str;<br>
   }<br>
<br>
-#if GTEST_OS_SYMBIAN<br>
-  // Streams a value (either a pointer or not) to this object.<br>
-  template <typename T><br>
-  inline Message& operator <<(const T& value) {<br>
-    StreamHelper(typename internal::is_pointer<T>::type(), value);<br>
-    return *this;<br>
-  }<br>
-#else<br>
   // Streams a non-pointer value to this object.<br>
   template <typename T><br>
   inline Message& operator <<(const T& val) {<br>
@@ -152,14 +145,13 @@ class GTEST_API_ Message {<br>
   // as "(null)".<br>
   template <typename T><br>
   inline Message& operator <<(T* const& pointer) {  // NOLINT<br>
-    if (pointer == NULL) {<br>
+    if (pointer == nullptr) {<br>
       *ss_ << "(null)";<br>
     } else {<br>
       *ss_ << llvm_gtest::printable(pointer);<br>
     }<br>
     return *this;<br>
   }<br>
-#endif  // GTEST_OS_SYMBIAN<br>
<br>
   // Since the basic IO manipulators are overloaded for both narrow<br>
   // and wide streams, we have to provide this specialized definition<br>
@@ -188,12 +180,6 @@ class GTEST_API_ Message {<br>
   Message& operator <<(const ::std::wstring& wstr);<br>
 #endif  // GTEST_HAS_STD_WSTRING<br>
<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-  // Converts the given wide string to a narrow string using the UTF-8<br>
-  // encoding, and streams the result to this Message object.<br>
-  Message& operator <<(const ::wstring& wstr);<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
   // Gets the text streamed to this object so far as an std::string.<br>
   // Each '\0' character in the buffer is replaced with "\\0".<br>
   //<br>
@@ -201,31 +187,8 @@ class GTEST_API_ Message {<br>
   std::string GetString() const;<br>
<br>
  private:<br>
-#if GTEST_OS_SYMBIAN<br>
-  // These are needed as the Nokia Symbian Compiler cannot decide between<br>
-  // const T& and const T* in a function template. The Nokia compiler _can_<br>
-  // decide between class template specializations for T and T*, so a<br>
-  // tr1::type_traits-like is_pointer works, and we can overload on that.<br>
-  template <typename T><br>
-  inline void StreamHelper(internal::true_type /*is_pointer*/, T* pointer) {<br>
-    if (pointer == NULL) {<br>
-      *ss_ << "(null)";<br>
-    } else {<br>
-      *ss_ << pointer;<br>
-    }<br>
-  }<br>
-  template <typename T><br>
-  inline void StreamHelper(internal::false_type /*is_pointer*/,<br>
-                           const T& value) {<br>
-    // See the comments in Message& operator <<(const T&) above for why<br>
-    // we need this using statement.<br>
-    using ::operator <<;<br>
-    *ss_ << value;<br>
-  }<br>
-#endif  // GTEST_OS_SYMBIAN<br>
-<br>
   // We'll hold the text streamed to this object here.<br>
-  const internal::scoped_ptr< ::std::stringstream> ss_;<br>
+  const std::unique_ptr< ::std::stringstream> ss_;<br>
<br>
   // We declare (but don't implement) this to prevent the compiler<br>
   // from implementing the assignment operator.<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
index 3e95e4390e00e..c2e6eae3d8326 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-param-test.h<br>
@@ -1,7 +1,3 @@<br>
-// This file was GENERATED by command:<br>
-//     pump.py gtest-param-test.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
 // Copyright 2008, Google Inc.<br>
 // All rights reserved.<br>
 //<br>
@@ -75,7 +71,7 @@ TEST_P(FooTest, HasBlahBlah) {<br>
   ...<br>
 }<br>
<br>
-// Finally, you can use INSTANTIATE_TEST_CASE_P to instantiate the test<br>
+// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test<br>
 // case with any set of parameters you want. Google Test defines a number<br>
 // of functions for generating test parameters. They return what we call<br>
 // (surprise!) parameter generators. Here is a summary of them, which<br>
@@ -96,17 +92,17 @@ TEST_P(FooTest, HasBlahBlah) {<br>
 // For more details, see comments at the definitions of these functions below<br>
 // in this file.<br>
 //<br>
-// The following statement will instantiate tests from the FooTest test case<br>
+// The following statement will instantiate tests from the FooTest test suite<br>
 // each with parameter values "meeny", "miny", and "moe".<br>
<br>
-INSTANTIATE_TEST_CASE_P(InstantiationName,<br>
-                        FooTest,<br>
-                        Values("meeny", "miny", "moe"));<br>
+INSTANTIATE_TEST_SUITE_P(InstantiationName,<br>
+                         FooTest,<br>
+                         Values("meeny", "miny", "moe"));<br>
<br>
 // To distinguish <br>
diff erent instances of the pattern, (yes, you<br>
-// can instantiate it more then once) the first argument to the<br>
-// INSTANTIATE_TEST_CASE_P macro is a prefix that will be added to the<br>
-// actual test case name. Remember to pick unique prefixes for <br>
diff erent<br>
+// can instantiate it more than once) the first argument to the<br>
+// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the<br>
+// actual test suite name. Remember to pick unique prefixes for <br>
diff erent<br>
 // instantiations. The tests from the instantiation above will have<br>
 // these names:<br>
 //<br>
@@ -123,7 +119,7 @@ INSTANTIATE_TEST_CASE_P(InstantiationName,<br>
 // with parameter values "cat" and "dog":<br>
<br>
 const char* pets[] = {"cat", "dog"};<br>
-INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
+INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
<br>
 // The tests from the instantiation above will have these names:<br>
 //<br>
@@ -132,9 +128,9 @@ INSTANTIATE_TEST_CASE_P(AnotherInstantiationName, FooTest, ValuesIn(pets));<br>
 //    * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat"<br>
 //    * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog"<br>
 //<br>
-// Please note that INSTANTIATE_TEST_CASE_P will instantiate all tests<br>
-// in the given test case, whether their definitions come before or<br>
-// AFTER the INSTANTIATE_TEST_CASE_P statement.<br>
+// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests<br>
+// in the given test suite, whether their definitions come before or<br>
+// AFTER the INSTANTIATE_TEST_SUITE_P statement.<br>
 //<br>
 // Please also note that generator expressions (including parameters to the<br>
 // generators) are evaluated in InitGoogleTest(), after main() has started.<br>
@@ -178,26 +174,23 @@ TEST_P(DerivedTest, DoesBlah) {<br>
<br>
 #endif  // 0<br>
<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-#if !GTEST_OS_SYMBIAN<br>
-# include <utility><br>
-#endif<br>
+#include <iterator><br>
+#include <utility><br>
<br>
 #include "gtest/internal/gtest-internal.h"<br>
 #include "gtest/internal/gtest-param-util.h"<br>
-#include "gtest/internal/gtest-param-util-generated.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
<br>
 namespace testing {<br>
<br>
 // Functions producing parameter generators.<br>
 //<br>
 // Google Test uses these generators to produce parameters for value-<br>
-// parameterized tests. When a parameterized test case is instantiated<br>
+// parameterized tests. When a parameterized test suite is instantiated<br>
 // with a particular generator, Google Test creates and runs tests<br>
 // for each element in the sequence produced by the generator.<br>
 //<br>
-// In the following sample, tests from test case FooTest are instantiated<br>
+// In the following sample, tests from test suite FooTest are instantiated<br>
 // each three times with parameter values 3, 5, and 8:<br>
 //<br>
 // class FooTest : public TestWithParam<int> { ... };<br>
@@ -206,7 +199,7 @@ namespace testing {<br>
 // }<br>
 // TEST_P(FooTest, TestThat) {<br>
 // }<br>
-// INSTANTIATE_TEST_CASE_P(TestSequence, FooTest, Values(3, 5, 8));<br>
+// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8));<br>
 //<br>
<br>
 // Range() returns generators providing sequences of values in a range.<br>
@@ -263,13 +256,13 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
 //<br>
 // Examples:<br>
 //<br>
-// This instantiates tests from test case StringTest<br>
+// This instantiates tests from test suite StringTest<br>
 // each with C-string values of "foo", "bar", and "baz":<br>
 //<br>
 // const char* strings[] = {"foo", "bar", "baz"};<br>
-// INSTANTIATE_TEST_CASE_P(StringSequence, StringTest, ValuesIn(strings));<br>
+// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings));<br>
 //<br>
-// This instantiates tests from test case StlStringTest<br>
+// This instantiates tests from test suite StlStringTest<br>
 // each with STL strings with values "a" and "b":<br>
 //<br>
 // ::std::vector< ::std::string> GetParameterStrings() {<br>
@@ -279,9 +272,9 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
 //   return v;<br>
 // }<br>
 //<br>
-// INSTANTIATE_TEST_CASE_P(CharSequence,<br>
-//                         StlStringTest,<br>
-//                         ValuesIn(GetParameterStrings()));<br>
+// INSTANTIATE_TEST_SUITE_P(CharSequence,<br>
+//                          StlStringTest,<br>
+//                          ValuesIn(GetParameterStrings()));<br>
 //<br>
 //<br>
 // This will also instantiate tests from CharTest<br>
@@ -294,16 +287,15 @@ internal::ParamGenerator<T> Range(T start, T end) {<br>
 //   return list;<br>
 // }<br>
 // ::std::list<char> l = GetParameterChars();<br>
-// INSTANTIATE_TEST_CASE_P(CharSequence2,<br>
-//                         CharTest,<br>
-//                         ValuesIn(l.begin(), l.end()));<br>
+// INSTANTIATE_TEST_SUITE_P(CharSequence2,<br>
+//                          CharTest,<br>
+//                          ValuesIn(l.begin(), l.end()));<br>
 //<br>
 template <typename ForwardIterator><br>
 internal::ParamGenerator<<br>
-  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type><br>
+    typename std::iterator_traits<ForwardIterator>::value_type><br>
 ValuesIn(ForwardIterator begin, ForwardIterator end) {<br>
-  typedef typename ::testing::internal::IteratorTraits<ForwardIterator><br>
-      ::value_type ParamType;<br>
+  typedef typename std::iterator_traits<ForwardIterator>::value_type ParamType;<br>
   return internal::ParamGenerator<ParamType>(<br>
       new internal::ValuesInIteratorRangeGenerator<ParamType>(begin, end));<br>
 }<br>
@@ -326,869 +318,22 @@ internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
 // Values(T v1, T v2, ..., T vN)<br>
 //   - returns a generator producing sequences with elements v1, v2, ..., vN.<br>
 //<br>
-// For example, this instantiates tests from test case BarTest each<br>
+// For example, this instantiates tests from test suite BarTest each<br>
 // with values "one", "two", and "three":<br>
 //<br>
-// INSTANTIATE_TEST_CASE_P(NumSequence, BarTest, Values("one", "two", "three"));<br>
+// INSTANTIATE_TEST_SUITE_P(NumSequence,<br>
+//                          BarTest,<br>
+//                          Values("one", "two", "three"));<br>
 //<br>
-// This instantiates tests from test case BazTest each with values 1, 2, 3.5.<br>
+// This instantiates tests from test suite BazTest each with values 1, 2, 3.5.<br>
 // The exact type of values will depend on the type of parameter in BazTest.<br>
 //<br>
-// INSTANTIATE_TEST_CASE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));<br>
+// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5));<br>
 //<br>
-// Currently, Values() supports from 1 to 50 parameters.<br>
 //<br>
-template <typename T1><br>
-internal::ValueArray1<T1> Values(T1 v1) {<br>
-  return internal::ValueArray1<T1>(v1);<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-internal::ValueArray2<T1, T2> Values(T1 v1, T2 v2) {<br>
-  return internal::ValueArray2<T1, T2>(v1, v2);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-internal::ValueArray3<T1, T2, T3> Values(T1 v1, T2 v2, T3 v3) {<br>
-  return internal::ValueArray3<T1, T2, T3>(v1, v2, v3);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-internal::ValueArray4<T1, T2, T3, T4> Values(T1 v1, T2 v2, T3 v3, T4 v4) {<br>
-  return internal::ValueArray4<T1, T2, T3, T4>(v1, v2, v3, v4);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-internal::ValueArray5<T1, T2, T3, T4, T5> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5) {<br>
-  return internal::ValueArray5<T1, T2, T3, T4, T5>(v1, v2, v3, v4, v5);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6><br>
-internal::ValueArray6<T1, T2, T3, T4, T5, T6> Values(T1 v1, T2 v2, T3 v3,<br>
-    T4 v4, T5 v5, T6 v6) {<br>
-  return internal::ValueArray6<T1, T2, T3, T4, T5, T6>(v1, v2, v3, v4, v5, v6);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7><br>
-internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7> Values(T1 v1, T2 v2, T3 v3,<br>
-    T4 v4, T5 v5, T6 v6, T7 v7) {<br>
-  return internal::ValueArray7<T1, T2, T3, T4, T5, T6, T7>(v1, v2, v3, v4, v5,<br>
-      v6, v7);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8><br>
-internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8) {<br>
-  return internal::ValueArray8<T1, T2, T3, T4, T5, T6, T7, T8>(v1, v2, v3, v4,<br>
-      v5, v6, v7, v8);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9><br>
-internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9) {<br>
-  return internal::ValueArray9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(v1, v2, v3,<br>
-      v4, v5, v6, v7, v8, v9);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10><br>
-internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> Values(T1 v1,<br>
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10) {<br>
-  return internal::ValueArray10<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(v1,<br>
-      v2, v3, v4, v5, v6, v7, v8, v9, v10);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11><br>
-internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,<br>
-    T11> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11) {<br>
-  return internal::ValueArray11<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,<br>
-      T11>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12><br>
-internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-    T12> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12) {<br>
-  return internal::ValueArray12<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13><br>
-internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12,<br>
-    T13> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13) {<br>
-  return internal::ValueArray13<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14><br>
-internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) {<br>
-  return internal::ValueArray14<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
-      v14);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15><br>
-internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) {<br>
-  return internal::ValueArray15<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
-      v13, v14, v15);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16><br>
-internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16) {<br>
-  return internal::ValueArray16<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
-      v12, v13, v14, v15, v16);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17><br>
-internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17) {<br>
-  return internal::ValueArray17<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
-      v11, v12, v13, v14, v15, v16, v17);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18><br>
-internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18) {<br>
-  return internal::ValueArray18<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
-      v10, v11, v12, v13, v14, v15, v16, v17, v18);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19><br>
-internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19) {<br>
-  return internal::ValueArray19<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20><br>
-internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20) {<br>
-  return internal::ValueArray20<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20>(v1, v2, v3, v4, v5, v6, v7,<br>
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21><br>
-internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21) {<br>
-  return internal::ValueArray21<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21>(v1, v2, v3, v4, v5, v6,<br>
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22><br>
-internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22> Values(T1 v1, T2 v2, T3 v3,<br>
-    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22) {<br>
-  return internal::ValueArray22<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22>(v1, v2, v3, v4,<br>
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
-      v20, v21, v22);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23><br>
-internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22, T23 v23) {<br>
-  return internal::ValueArray23<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23>(v1, v2, v3,<br>
-      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
-      v20, v21, v22, v23);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24><br>
-internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22, T23 v23, T24 v24) {<br>
-  return internal::ValueArray24<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24>(v1, v2,<br>
-      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,<br>
-      v19, v20, v21, v22, v23, v24);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25><br>
-internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25> Values(T1 v1,<br>
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,<br>
-    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,<br>
-    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25) {<br>
-  return internal::ValueArray25<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25>(v1,<br>
-      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,<br>
-      v18, v19, v20, v21, v22, v23, v24, v25);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26><br>
-internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-    T26> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26) {<br>
-  return internal::ValueArray26<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,<br>
-      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27><br>
-internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26,<br>
-    T27> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27) {<br>
-  return internal::ValueArray27<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,<br>
-      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28><br>
-internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27,<br>
-    T28> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28) {<br>
-  return internal::ValueArray28<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
-      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,<br>
-      v28);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29><br>
-internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28, T29 v29) {<br>
-  return internal::ValueArray29<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
-      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,<br>
-      v27, v28, v29);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30><br>
-internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
-    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
-    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) {<br>
-  return internal::ValueArray30<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
-      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,<br>
-      v26, v27, v28, v29, v30);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31><br>
-internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) {<br>
-  return internal::ValueArray31<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
-      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,<br>
-      v25, v26, v27, v28, v29, v30, v31);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32><br>
-internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
-    T32 v32) {<br>
-  return internal::ValueArray32<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
-      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
-      v24, v25, v26, v27, v28, v29, v30, v31, v32);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33><br>
-internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
-    T32 v32, T33 v33) {<br>
-  return internal::ValueArray33<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34><br>
-internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,<br>
-    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,<br>
-    T31 v31, T32 v32, T33 v33, T34 v34) {<br>
-  return internal::ValueArray34<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34>(v1, v2, v3, v4, v5, v6, v7,<br>
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,<br>
-      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35><br>
-internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35) {<br>
-  return internal::ValueArray35<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35>(v1, v2, v3, v4, v5, v6,<br>
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,<br>
-      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36><br>
-internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36) {<br>
-  return internal::ValueArray36<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36>(v1, v2, v3, v4,<br>
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
-      v34, v35, v36);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37><br>
-internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37> Values(T1 v1, T2 v2, T3 v3,<br>
-    T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
-    T37 v37) {<br>
-  return internal::ValueArray37<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37>(v1, v2, v3,<br>
-      v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
-      v34, v35, v36, v37);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38><br>
-internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
-    T37 v37, T38 v38) {<br>
-  return internal::ValueArray38<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38>(v1, v2,<br>
-      v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18,<br>
-      v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32,<br>
-      v33, v34, v35, v36, v37, v38);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39><br>
-internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39> Values(T1 v1, T2 v2,<br>
-    T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12,<br>
-    T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20,<br>
-    T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28,<br>
-    T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36,<br>
-    T37 v37, T38 v38, T39 v39) {<br>
-  return internal::ValueArray39<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39>(v1,<br>
-      v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17,<br>
-      v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31,<br>
-      v32, v33, v34, v35, v36, v37, v38, v39);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40><br>
-internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40> Values(T1 v1,<br>
-    T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11,<br>
-    T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19,<br>
-    T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27,<br>
-    T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35,<br>
-    T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) {<br>
-  return internal::ValueArray40<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15,<br>
-      v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28, v29,<br>
-      v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41><br>
-internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40,<br>
-    T41> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41) {<br>
-  return internal::ValueArray41<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13, v14,<br>
-      v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27, v28,<br>
-      v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42><br>
-internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41,<br>
-    T42> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-    T42 v42) {<br>
-  return internal::ValueArray42<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12, v13,<br>
-      v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26, v27,<br>
-      v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40, v41,<br>
-      v42);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43><br>
-internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42,<br>
-    T43> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-    T42 v42, T43 v43) {<br>
-  return internal::ValueArray43<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11, v12,<br>
-      v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25, v26,<br>
-      v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39, v40,<br>
-      v41, v42, v43);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44><br>
-internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-    T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-    T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-    T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-    T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-    T42 v42, T43 v43, T44 v44) {<br>
-  return internal::ValueArray44<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10, v11,<br>
-      v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24, v25,<br>
-      v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38, v39,<br>
-      v40, v41, v42, v43, v44);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45><br>
-internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
-    T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
-    T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
-    T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,<br>
-    T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,<br>
-    T41 v41, T42 v42, T43 v43, T44 v44, T45 v45) {<br>
-  return internal::ValueArray45<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45>(v1, v2, v3, v4, v5, v6, v7, v8, v9, v10,<br>
-      v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23, v24,<br>
-      v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37, v38,<br>
-      v39, v40, v41, v42, v43, v44, v45);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46><br>
-internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45, T46> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) {<br>
-  return internal::ValueArray46<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45, T46>(v1, v2, v3, v4, v5, v6, v7, v8, v9,<br>
-      v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,<br>
-      v38, v39, v40, v41, v42, v43, v44, v45, v46);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47><br>
-internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45, T46, T47> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-    T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) {<br>
-  return internal::ValueArray47<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45, T46, T47>(v1, v2, v3, v4, v5, v6, v7, v8,<br>
-      v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22, v23,<br>
-      v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36, v37,<br>
-      v38, v39, v40, v41, v42, v43, v44, v45, v46, v47);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48><br>
-internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45, T46, T47, T48> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6,<br>
-    T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15,<br>
-    T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23,<br>
-    T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31,<br>
-    T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39,<br>
-    T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47,<br>
-    T48 v48) {<br>
-  return internal::ValueArray48<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45, T46, T47, T48>(v1, v2, v3, v4, v5, v6, v7,<br>
-      v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21, v22,<br>
-      v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35, v36,<br>
-      v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48, typename T49><br>
-internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45, T46, T47, T48, T49> Values(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5,<br>
-    T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13, T14 v14,<br>
-    T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21, T22 v22,<br>
-    T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29, T30 v30,<br>
-    T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37, T38 v38,<br>
-    T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45, T46 v46,<br>
-    T47 v47, T48 v48, T49 v49) {<br>
-  return internal::ValueArray49<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49>(v1, v2, v3, v4, v5, v6,<br>
-      v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19, v20, v21,<br>
-      v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33, v34, v35,<br>
-      v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47, v48, v49);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48, typename T49, typename T50><br>
-internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
-    T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25, T26, T27, T28,<br>
-    T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T40, T41, T42, T43,<br>
-    T44, T45, T46, T47, T48, T49, T50> Values(T1 v1, T2 v2, T3 v3, T4 v4,<br>
-    T5 v5, T6 v6, T7 v7, T8 v8, T9 v9, T10 v10, T11 v11, T12 v12, T13 v13,<br>
-    T14 v14, T15 v15, T16 v16, T17 v17, T18 v18, T19 v19, T20 v20, T21 v21,<br>
-    T22 v22, T23 v23, T24 v24, T25 v25, T26 v26, T27 v27, T28 v28, T29 v29,<br>
-    T30 v30, T31 v31, T32 v32, T33 v33, T34 v34, T35 v35, T36 v36, T37 v37,<br>
-    T38 v38, T39 v39, T40 v40, T41 v41, T42 v42, T43 v43, T44 v44, T45 v45,<br>
-    T46 v46, T47 v47, T48 v48, T49 v49, T50 v50) {<br>
-  return internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11,<br>
-      T12, T13, T14, T15, T16, T17, T18, T19, T20, T21, T22, T23, T24, T25,<br>
-      T26, T27, T28, T29, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39,<br>
-      T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T50>(v1, v2, v3, v4,<br>
-      v5, v6, v7, v8, v9, v10, v11, v12, v13, v14, v15, v16, v17, v18, v19,<br>
-      v20, v21, v22, v23, v24, v25, v26, v27, v28, v29, v30, v31, v32, v33,<br>
-      v34, v35, v36, v37, v38, v39, v40, v41, v42, v43, v44, v45, v46, v47,<br>
-      v48, v49, v50);<br>
+template <typename... T><br>
+internal::ValueArray<T...> Values(T... v) {<br>
+  return internal::ValueArray<T...>(std::move(v)...);<br>
 }<br>
<br>
 // Bool() allows generating tests with parameters in a set of (false, true).<br>
@@ -1201,7 +346,7 @@ internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
 // of multiple flags can be tested when several Bool()'s are combined using<br>
 // Combine() function.<br>
 //<br>
-// In the following example all tests in the test case FlagDependentTest<br>
+// In the following example all tests in the test suite FlagDependentTest<br>
 // will be instantiated twice with parameters false and true.<br>
 //<br>
 // class FlagDependentTest : public testing::TestWithParam<bool> {<br>
@@ -1209,13 +354,12 @@ internal::ValueArray50<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13,<br>
 //     external_flag = GetParam();<br>
 //   }<br>
 // }<br>
-// INSTANTIATE_TEST_CASE_P(BoolSequence, FlagDependentTest, Bool());<br>
+// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool());<br>
 //<br>
 inline internal::ParamGenerator<bool> Bool() {<br>
   return Values(false, true);<br>
 }<br>
<br>
-# if GTEST_HAS_COMBINE<br>
 // Combine() allows the user to combine two or more sequences to produce<br>
 // values of a Cartesian product of those sequences' elements.<br>
 //<br>
@@ -1224,184 +368,83 @@ inline internal::ParamGenerator<bool> Bool() {<br>
 //   - returns a generator producing sequences with elements coming from<br>
 //     the Cartesian product of elements from the sequences generated by<br>
 //     gen1, gen2, ..., genN. The sequence elements will have a type of<br>
-//     tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types<br>
+//     std::tuple<T1, T2, ..., TN> where T1, T2, ..., TN are the types<br>
 //     of elements from sequences produces by gen1, gen2, ..., genN.<br>
 //<br>
-// Combine can have up to 10 arguments. This number is currently limited<br>
-// by the maximum number of elements in the tuple implementation used by Google<br>
-// Test.<br>
+// Combine can have up to 10 arguments.<br>
 //<br>
 // Example:<br>
 //<br>
-// This will instantiate tests in test case AnimalTest each one with<br>
+// This will instantiate tests in test suite AnimalTest each one with<br>
 // the parameter values tuple("cat", BLACK), tuple("cat", WHITE),<br>
 // tuple("dog", BLACK), and tuple("dog", WHITE):<br>
 //<br>
 // enum Color { BLACK, GRAY, WHITE };<br>
 // class AnimalTest<br>
-//     : public testing::TestWithParam<tuple<const char*, Color> > {...};<br>
+//     : public testing::TestWithParam<std::tuple<const char*, Color> > {...};<br>
 //<br>
 // TEST_P(AnimalTest, AnimalLooksNice) {...}<br>
 //<br>
-// INSTANTIATE_TEST_CASE_P(AnimalVariations, AnimalTest,<br>
-//                         Combine(Values("cat", "dog"),<br>
-//                                 Values(BLACK, WHITE)));<br>
+// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest,<br>
+//                          Combine(Values("cat", "dog"),<br>
+//                                  Values(BLACK, WHITE)));<br>
 //<br>
 // This will instantiate tests in FlagDependentTest with all variations of two<br>
 // Boolean flags:<br>
 //<br>
 // class FlagDependentTest<br>
-//     : public testing::TestWithParam<tuple<bool, bool> > {<br>
+//     : public testing::TestWithParam<std::tuple<bool, bool> > {<br>
 //   virtual void SetUp() {<br>
 //     // Assigns external_flag_1 and external_flag_2 values from the tuple.<br>
-//     tie(external_flag_1, external_flag_2) = GetParam();<br>
+//     std::tie(external_flag_1, external_flag_2) = GetParam();<br>
 //   }<br>
 // };<br>
 //<br>
 // TEST_P(FlagDependentTest, TestFeature1) {<br>
 //   // Test your code using external_flag_1 and external_flag_2 here.<br>
 // }<br>
-// INSTANTIATE_TEST_CASE_P(TwoBoolSequence, FlagDependentTest,<br>
-//                         Combine(Bool(), Bool()));<br>
-//<br>
-template <typename Generator1, typename Generator2><br>
-internal::CartesianProductHolder2<Generator1, Generator2> Combine(<br>
-    const Generator1& g1, const Generator2& g2) {<br>
-  return internal::CartesianProductHolder2<Generator1, Generator2>(<br>
-      g1, g2);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3><br>
-internal::CartesianProductHolder3<Generator1, Generator2, Generator3> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3) {<br>
-  return internal::CartesianProductHolder3<Generator1, Generator2, Generator3>(<br>
-      g1, g2, g3);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4><br>
-internal::CartesianProductHolder4<Generator1, Generator2, Generator3,<br>
-    Generator4> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4) {<br>
-  return internal::CartesianProductHolder4<Generator1, Generator2, Generator3,<br>
-      Generator4>(<br>
-      g1, g2, g3, g4);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5><br>
-internal::CartesianProductHolder5<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5) {<br>
-  return internal::CartesianProductHolder5<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5>(<br>
-      g1, g2, g3, g4, g5);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5, typename Generator6><br>
-internal::CartesianProductHolder6<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5, Generator6> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5, const Generator6& g6) {<br>
-  return internal::CartesianProductHolder6<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5, Generator6>(<br>
-      g1, g2, g3, g4, g5, g6);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5, typename Generator6,<br>
-    typename Generator7><br>
-internal::CartesianProductHolder7<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5, Generator6, Generator7> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
-        const Generator7& g7) {<br>
-  return internal::CartesianProductHolder7<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5, Generator6, Generator7>(<br>
-      g1, g2, g3, g4, g5, g6, g7);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5, typename Generator6,<br>
-    typename Generator7, typename Generator8><br>
-internal::CartesianProductHolder8<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5, Generator6, Generator7, Generator8> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
-        const Generator7& g7, const Generator8& g8) {<br>
-  return internal::CartesianProductHolder8<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5, Generator6, Generator7, Generator8>(<br>
-      g1, g2, g3, g4, g5, g6, g7, g8);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5, typename Generator6,<br>
-    typename Generator7, typename Generator8, typename Generator9><br>
-internal::CartesianProductHolder9<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5, Generator6, Generator7, Generator8,<br>
-    Generator9> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
-        const Generator7& g7, const Generator8& g8, const Generator9& g9) {<br>
-  return internal::CartesianProductHolder9<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9>(<br>
-      g1, g2, g3, g4, g5, g6, g7, g8, g9);<br>
-}<br>
-<br>
-template <typename Generator1, typename Generator2, typename Generator3,<br>
-    typename Generator4, typename Generator5, typename Generator6,<br>
-    typename Generator7, typename Generator8, typename Generator9,<br>
-    typename Generator10><br>
-internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
-    Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,<br>
-    Generator10> Combine(<br>
-    const Generator1& g1, const Generator2& g2, const Generator3& g3,<br>
-        const Generator4& g4, const Generator5& g5, const Generator6& g6,<br>
-        const Generator7& g7, const Generator8& g8, const Generator9& g9,<br>
-        const Generator10& g10) {<br>
-  return internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
-      Generator4, Generator5, Generator6, Generator7, Generator8, Generator9,<br>
-      Generator10>(<br>
-      g1, g2, g3, g4, g5, g6, g7, g8, g9, g10);<br>
-}<br>
-# endif  // GTEST_HAS_COMBINE<br>
-<br>
-# define TEST_P(test_case_name, test_name) \<br>
-  class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \<br>
-      : public test_case_name { \<br>
-   public: \<br>
-    GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {} \<br>
-    virtual void TestBody(); \<br>
-   private: \<br>
-    static int AddToRegistry() { \<br>
-      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \<br>
-          GetTestCasePatternHolder<test_case_name>(\<br>
-              #test_case_name, \<br>
-              ::testing::internal::CodeLocation(\<br>
-                  __FILE__, __LINE__))->AddTestPattern(\<br>
-                      GTEST_STRINGIFY_(test_case_name), \<br>
-                      GTEST_STRINGIFY_(test_name), \<br>
-                      new ::testing::internal::TestMetaFactory< \<br>
-                          GTEST_TEST_CLASS_NAME_(\<br>
-                              test_case_name, test_name)>()); \<br>
-      return 0; \<br>
-    } \<br>
-    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \<br>
-    GTEST_DISALLOW_COPY_AND_ASSIGN_(\<br>
-        GTEST_TEST_CLASS_NAME_(test_case_name, test_name)); \<br>
-  }; \<br>
-  int GTEST_TEST_CLASS_NAME_(test_case_name, \<br>
-                             test_name)::gtest_registering_dummy_ = \<br>
-      GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::AddToRegistry(); \<br>
-  void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()<br>
-<br>
-// The optional last argument to INSTANTIATE_TEST_CASE_P allows the user<br>
-// to specify a function or functor that generates custom test name suffixes<br>
-// based on the test parameters. The function should accept one argument of<br>
-// type testing::TestParamInfo<class ParamType>, and return std::string.<br>
+// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest,<br>
+//                          Combine(Bool(), Bool()));<br>
+//<br>
+template <typename... Generator><br>
+internal::CartesianProductHolder<Generator...> Combine(const Generator&... g) {<br>
+  return internal::CartesianProductHolder<Generator...>(g...);<br>
+}<br>
+<br>
+#define TEST_P(test_suite_name, test_name)                                     \<br>
+  class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                     \<br>
+      : public test_suite_name {                                               \<br>
+   public:                                                                     \<br>
+    GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}                    \<br>
+    virtual void TestBody();                                                   \<br>
+                                                                               \<br>
+   private:                                                                    \<br>
+    static int AddToRegistry() {                                               \<br>
+      ::testing::UnitTest::GetInstance()                                       \<br>
+          ->parameterized_test_registry()                                      \<br>
+          .GetTestSuitePatternHolder<test_suite_name>(                         \<br>
+              #test_suite_name,                                                \<br>
+              ::testing::internal::CodeLocation(__FILE__, __LINE__))           \<br>
+          ->AddTestPattern(                                                    \<br>
+              GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name),  \<br>
+              new ::testing::internal::TestMetaFactory<GTEST_TEST_CLASS_NAME_( \<br>
+                  test_suite_name, test_name)>());                             \<br>
+      return 0;                                                                \<br>
+    }                                                                          \<br>
+    static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_;               \<br>
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,    \<br>
+                                                           test_name));        \<br>
+  };                                                                           \<br>
+  int GTEST_TEST_CLASS_NAME_(test_suite_name,                                  \<br>
+                             test_name)::gtest_registering_dummy_ =            \<br>
+      GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry();     \<br>
+  void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()<br>
+<br>
+// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify<br>
+// generator and an optional function or functor that generates custom test name<br>
+// suffixes based on the test parameters. Such a function or functor should<br>
+// accept one argument of type testing::TestParamInfo<class ParamType>, and<br>
+// return std::string.<br>
 //<br>
 // testing::PrintToStringParamName is a builtin test suffix generator that<br>
 // returns the value of testing::PrintToString(GetParam()).<br>
@@ -1410,24 +453,50 @@ internal::CartesianProductHolder10<Generator1, Generator2, Generator3,<br>
 // alphanumeric characters or underscore. Because PrintToString adds quotes<br>
 // to std::string and C strings, it won't work for these types.<br>
<br>
-# define INSTANTIATE_TEST_CASE_P(prefix, test_case_name, generator, ...) \<br>
-  static ::testing::internal::ParamGenerator<test_case_name::ParamType> \<br>
-      gtest_##prefix##test_case_name##_EvalGenerator_() { return generator; } \<br>
-  static ::std::string gtest_##prefix##test_case_name##_EvalGenerateName_( \<br>
-      const ::testing::TestParamInfo<test_case_name::ParamType>& info) { \<br>
-    return ::testing::internal::GetParamNameGen<test_case_name::ParamType> \<br>
-        (__VA_ARGS__)(info); \<br>
-  } \<br>
-  static int gtest_##prefix##test_case_name##_dummy_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
-      ::testing::UnitTest::GetInstance()->parameterized_test_registry(). \<br>
-          GetTestCasePatternHolder<test_case_name>(\<br>
-              #test_case_name, \<br>
-              ::testing::internal::CodeLocation(\<br>
-                  __FILE__, __LINE__))->AddTestCaseInstantiation(\<br>
-                      #prefix, \<br>
-                      &gtest_##prefix##test_case_name##_EvalGenerator_, \<br>
-                      &gtest_##prefix##test_case_name##_EvalGenerateName_, \<br>
-                      __FILE__, __LINE__)<br>
+#define GTEST_EXPAND_(arg) arg<br>
+#define GTEST_GET_FIRST_(first, ...) first<br>
+#define GTEST_GET_SECOND_(first, second, ...) second<br>
+<br>
+#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...)                \<br>
+  static ::testing::internal::ParamGenerator<test_suite_name::ParamType>      \<br>
+      gtest_##prefix##test_suite_name##_EvalGenerator_() {                    \<br>
+    return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_));        \<br>
+  }                                                                           \<br>
+  static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_(   \<br>
+      const ::testing::TestParamInfo<test_suite_name::ParamType>& info) {     \<br>
+    if (::testing::internal::AlwaysFalse()) {                                 \<br>
+      ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_(      \<br>
+          __VA_ARGS__,                                                        \<br>
+          ::testing::internal::DefaultParamName<test_suite_name::ParamType>,  \<br>
+          DUMMY_PARAM_)));                                                    \<br>
+      auto t = std::make_tuple(__VA_ARGS__);                                  \<br>
+      static_assert(std::tuple_size<decltype(t)>::value <= 2,                 \<br>
+                    "Too Many Args!");                                        \<br>
+    }                                                                         \<br>
+    return ((GTEST_EXPAND_(GTEST_GET_SECOND_(                                 \<br>
+        __VA_ARGS__,                                                          \<br>
+        ::testing::internal::DefaultParamName<test_suite_name::ParamType>,    \<br>
+        DUMMY_PARAM_))))(info);                                               \<br>
+  }                                                                           \<br>
+  static int gtest_##prefix##test_suite_name##_dummy_                         \<br>
+      GTEST_ATTRIBUTE_UNUSED_ =                                               \<br>
+          ::testing::UnitTest::GetInstance()                                  \<br>
+              ->parameterized_test_registry()                                 \<br>
+              .GetTestSuitePatternHolder<test_suite_name>(                    \<br>
+                  #test_suite_name,                                           \<br>
+                  ::testing::internal::CodeLocation(__FILE__, __LINE__))      \<br>
+              ->AddTestSuiteInstantiation(                                    \<br>
+                  #prefix, &gtest_##prefix##test_suite_name##_EvalGenerator_, \<br>
+                  &gtest_##prefix##test_suite_name##_EvalGenerateName_,       \<br>
+                  __FILE__, __LINE__)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define INSTANTIATE_TEST_CASE_P                                            \<br>
+  static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \<br>
+                "");                                                       \<br>
+  INSTANTIATE_TEST_SUITE_P<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 }  // namespace testing<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h b/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
index c4b3de950c2b6..956f07910484a 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-printers.h<br>
@@ -100,19 +100,18 @@<br>
 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_<br>
 #define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_<br>
<br>
+#include <functional><br>
 #include <ostream>  // NOLINT<br>
 #include <sstream><br>
 #include <string><br>
+#include <tuple><br>
+#include <type_traits><br>
 #include <utility><br>
 #include <vector><br>
-#include "gtest/internal/gtest-port.h"<br>
 #include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
 #include "gtest/internal/custom/raw-ostream.h"<br>
<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-# include <tuple><br>
-#endif<br>
-<br>
 #if GTEST_HAS_ABSL<br>
 #include "absl/strings/string_view.h"<br>
 #include "absl/types/optional.h"<br>
@@ -153,9 +152,10 @@ class TypeWithoutFormatter {<br>
  public:<br>
   // This default version is called when kTypeKind is kOtherType.<br>
   static void PrintValue(const T& value, ::std::ostream* os) {<br>
-    PrintBytesInObjectTo(static_cast<const unsigned char*>(<br>
-                             reinterpret_cast<const void*>(&value)),<br>
-                         sizeof(value), os);<br>
+    PrintBytesInObjectTo(<br>
+        static_cast<const unsigned char*>(<br>
+            reinterpret_cast<const void*>(std::addressof(value))),<br>
+        sizeof(value), os);<br>
   }<br>
 };<br>
<br>
@@ -234,12 +234,12 @@ ::std::basic_ostream<Char, CharTraits>& operator<<(<br>
     ::std::basic_ostream<Char, CharTraits>& os, const T& x) {<br>
   TypeWithoutFormatter<T, (internal::IsAProtocolMessage<T>::value<br>
                                ? kProtobuf<br>
-                               : internal::ImplicitlyConvertible<<br>
+                               : std::is_convertible<<br>
                                      const T&, internal::BiggestInt>::value<br>
                                      ? kConvertibleToInteger<br>
                                      :<br>
 #if GTEST_HAS_ABSL<br>
-                                     internal::ImplicitlyConvertible<<br>
+                                     std::is_convertible<<br>
                                          const T&, absl::string_view>::value<br>
                                          ? kConvertibleToStringView<br>
                                          :<br>
@@ -359,16 +359,6 @@ GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t);<br>
 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string);<br>
 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string);<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::string);<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::string);<br>
-#endif<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::wstring);<br>
-GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::wstring);<br>
-#endif<br>
-<br>
 #if GTEST_HAS_STD_WSTRING<br>
 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring);<br>
 GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring);<br>
@@ -449,7 +439,7 @@ void DefaultPrintTo(WrapPrinterType<kPrintContainer> /* dummy */,<br>
 template <typename T><br>
 void DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */,<br>
                     T* p, ::std::ostream* os) {<br>
-  if (p == NULL) {<br>
+  if (p == nullptr) {<br>
     *os << "NULL";<br>
   } else {<br>
     // T is not a function type.  We just call << to print p,<br>
@@ -461,7 +451,7 @@ void DefaultPrintTo(WrapPrinterType<kPrintPointer> /* dummy */,<br>
 template <typename T><br>
 void DefaultPrintTo(WrapPrinterType<kPrintFunctionPointer> /* dummy */,<br>
                     T* p, ::std::ostream* os) {<br>
-  if (p == NULL) {<br>
+  if (p == nullptr) {<br>
     *os << "NULL";<br>
   } else {<br>
     // T is a function type, so '*os << p' doesn't do what we want<br>
@@ -516,13 +506,9 @@ void PrintTo(const T& value, ::std::ostream* os) {<br>
                   (sizeof(IsContainerTest<T>(0)) == sizeof(IsContainer)) &&<br>
               !IsRecursiveContainer<T>::value<br>
           ? kPrintContainer<br>
-          : !is_pointer<T>::value<br>
+          : !std::is_pointer<T>::value<br>
                 ? kPrintOther<br>
-#if GTEST_LANG_CXX11<br>
                 : std::is_function<typename std::remove_pointer<T>::type>::value<br>
-#else<br>
-                : !internal::ImplicitlyConvertible<T, const void*>::value<br>
-#endif<br>
                       ? kPrintFunctionPointer<br>
                       : kPrintPointer > (),<br>
       value, os);<br>
@@ -604,27 +590,13 @@ void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) {<br>
   }<br>
 }<br>
<br>
-// Overloads for ::string and ::std::string.<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-GTEST_API_ void PrintStringTo(const ::string&s, ::std::ostream* os);<br>
-inline void PrintTo(const ::string& s, ::std::ostream* os) {<br>
-  PrintStringTo(s, os);<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
+// Overloads for ::std::string.<br>
 GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os);<br>
 inline void PrintTo(const ::std::string& s, ::std::ostream* os) {<br>
   PrintStringTo(s, os);<br>
 }<br>
<br>
-// Overloads for ::wstring and ::std::wstring.<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-GTEST_API_ void PrintWideStringTo(const ::wstring&s, ::std::ostream* os);<br>
-inline void PrintTo(const ::wstring& s, ::std::ostream* os) {<br>
-  PrintWideStringTo(s, os);<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
+// Overloads for ::std::wstring.<br>
 #if GTEST_HAS_STD_WSTRING<br>
 GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os);<br>
 inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) {<br>
@@ -639,99 +611,38 @@ inline void PrintTo(absl::string_view sp, ::std::ostream* os) {<br>
 }<br>
 #endif  // GTEST_HAS_ABSL<br>
<br>
-#if GTEST_LANG_CXX11<br>
 inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; }<br>
-#endif  // GTEST_LANG_CXX11<br>
<br>
-#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-// Helper function for printing a tuple.  T must be instantiated with<br>
-// a tuple type.<br>
 template <typename T><br>
-void PrintTupleTo(const T& t, ::std::ostream* os);<br>
-#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-// Overload for ::std::tr1::tuple.  Needed for printing function arguments,<br>
-// which are packed as tuples.<br>
-<br>
-// Overloaded PrintTo() for tuples of various arities.  We support<br>
-// tuples of up-to 10 fields.  The following implementation works<br>
-// regardless of whether tr1::tuple is implemented using the<br>
-// non-standard variadic template feature or not.<br>
-<br>
-inline void PrintTo(const ::std::tr1::tuple<>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1><br>
-void PrintTo(const ::std::tr1::tuple<T1>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5>& t,<br>
-             ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-          typename T6><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6>& t,<br>
-             ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-          typename T6, typename T7><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7>& t,<br>
-             ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-          typename T6, typename T7, typename T8><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8>& t,<br>
-             ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
+void PrintTo(std::reference_wrapper<T> ref, ::std::ostream* os) {<br>
+  UniversalPrinter<T&>::Print(ref.get(), os);<br>
 }<br>
<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-          typename T6, typename T7, typename T8, typename T9><br>
-void PrintTo(const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9>& t,<br>
-             ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
-}<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-          typename T6, typename T7, typename T8, typename T9, typename T10><br>
-void PrintTo(<br>
-    const ::std::tr1::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>& t,<br>
-    ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
+// Helper function for printing a tuple.  T must be instantiated with<br>
+// a tuple type.<br>
+template <typename T><br>
+void PrintTupleTo(const T&, std::integral_constant<size_t, 0>,<br>
+                  ::std::ostream*) {}<br>
+<br>
+template <typename T, size_t I><br>
+void PrintTupleTo(const T& t, std::integral_constant<size_t, I>,<br>
+                  ::std::ostream* os) {<br>
+  PrintTupleTo(t, std::integral_constant<size_t, I - 1>(), os);<br>
+  GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
+  if (I > 1) {<br>
+    GTEST_INTENTIONAL_CONST_COND_POP_()<br>
+    *os << ", ";<br>
+  }<br>
+  UniversalPrinter<typename std::tuple_element<I - 1, T>::type>::Print(<br>
+      std::get<I - 1>(t), os);<br>
 }<br>
-#endif  // GTEST_HAS_TR1_TUPLE<br>
<br>
-#if GTEST_HAS_STD_TUPLE_<br>
 template <typename... Types><br>
 void PrintTo(const ::std::tuple<Types...>& t, ::std::ostream* os) {<br>
-  PrintTupleTo(t, os);<br>
+  *os << "(";<br>
+  PrintTupleTo(t, std::integral_constant<size_t, sizeof...(Types)>(), os);<br>
+  *os << ")";<br>
 }<br>
-#endif  // GTEST_HAS_STD_TUPLE_<br>
<br>
 // Overload for std::pair.<br>
 template <typename T1, typename T2><br>
@@ -827,7 +738,6 @@ void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) {<br>
     // If the array has more than kThreshold elements, we'll have to<br>
     // omit some details by printing only the first and the last<br>
     // kChunkSize elements.<br>
-    // FIXME: let the user control the threshold using a flag.<br>
     if (len <= kThreshold) {<br>
       PrintRawArrayTo(begin, len, os);<br>
     } else {<br>
@@ -906,7 +816,7 @@ template <><br>
 class UniversalTersePrinter<const char*> {<br>
  public:<br>
   static void Print(const char* str, ::std::ostream* os) {<br>
-    if (str == NULL) {<br>
+    if (str == nullptr) {<br>
       *os << "NULL";<br>
     } else {<br>
       UniversalPrint(std::string(str), os);<br>
@@ -926,7 +836,7 @@ template <><br>
 class UniversalTersePrinter<const wchar_t*> {<br>
  public:<br>
   static void Print(const wchar_t* str, ::std::ostream* os) {<br>
-    if (str == NULL) {<br>
+    if (str == nullptr) {<br>
       *os << "NULL";<br>
     } else {<br>
       UniversalPrint(::std::wstring(str), os);<br>
@@ -962,109 +872,20 @@ void UniversalPrint(const T& value, ::std::ostream* os) {<br>
<br>
 typedef ::std::vector< ::std::string> Strings;<br>
<br>
-// TuplePolicy<TupleT> must provide:<br>
-// - tuple_size<br>
-//     size of tuple TupleT.<br>
-// - get<size_t I>(const TupleT& t)<br>
-//     static function extracting element I of tuple TupleT.<br>
-// - tuple_element<size_t I>::type<br>
-//     type of element I of tuple TupleT.<br>
-template <typename TupleT><br>
-struct TuplePolicy;<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-template <typename TupleT><br>
-struct TuplePolicy {<br>
-  typedef TupleT Tuple;<br>
-  static const size_t tuple_size = ::std::tr1::tuple_size<Tuple>::value;<br>
-<br>
-  template <size_t I><br>
-  struct tuple_element : ::std::tr1::tuple_element<static_cast<int>(I), Tuple> {<br>
-  };<br>
-<br>
-  template <size_t I><br>
-  static typename AddReference<const typename ::std::tr1::tuple_element<<br>
-      static_cast<int>(I), Tuple>::type>::type<br>
-  get(const Tuple& tuple) {<br>
-    return ::std::tr1::get<I>(tuple);<br>
-  }<br>
-};<br>
-template <typename TupleT><br>
-const size_t TuplePolicy<TupleT>::tuple_size;<br>
-#endif  // GTEST_HAS_TR1_TUPLE<br>
-<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-template <typename... Types><br>
-struct TuplePolicy< ::std::tuple<Types...> > {<br>
-  typedef ::std::tuple<Types...> Tuple;<br>
-  static const size_t tuple_size = ::std::tuple_size<Tuple>::value;<br>
-<br>
-  template <size_t I><br>
-  struct tuple_element : ::std::tuple_element<I, Tuple> {};<br>
-<br>
-  template <size_t I><br>
-  static const typename ::std::tuple_element<I, Tuple>::type& get(<br>
-      const Tuple& tuple) {<br>
-    return ::std::get<I>(tuple);<br>
-  }<br>
-};<br>
-template <typename... Types><br>
-const size_t TuplePolicy< ::std::tuple<Types...> >::tuple_size;<br>
-#endif  // GTEST_HAS_STD_TUPLE_<br>
-<br>
-#if GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
-// This helper template allows PrintTo() for tuples and<br>
-// UniversalTersePrintTupleFieldsToStrings() to be defined by<br>
-// induction on the number of tuple fields.  The idea is that<br>
-// TuplePrefixPrinter<N>::PrintPrefixTo(t, os) prints the first N<br>
-// fields in tuple t, and can be defined in terms of<br>
-// TuplePrefixPrinter<N - 1>.<br>
-//<br>
-// The inductive case.<br>
-template <size_t N><br>
-struct TuplePrefixPrinter {<br>
-  // Prints the first N fields of a tuple.<br>
-  template <typename Tuple><br>
-  static void PrintPrefixTo(const Tuple& t, ::std::ostream* os) {<br>
-    TuplePrefixPrinter<N - 1>::PrintPrefixTo(t, os);<br>
-    GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
-    if (N > 1) {<br>
-    GTEST_INTENTIONAL_CONST_COND_POP_()<br>
-      *os << ", ";<br>
-    }<br>
-    UniversalPrinter<<br>
-        typename TuplePolicy<Tuple>::template tuple_element<N - 1>::type><br>
-        ::Print(TuplePolicy<Tuple>::template get<N - 1>(t), os);<br>
-  }<br>
-<br>
   // Tersely prints the first N fields of a tuple to a string vector,<br>
   // one element for each field.<br>
-  template <typename Tuple><br>
-  static void TersePrintPrefixToStrings(const Tuple& t, Strings* strings) {<br>
-    TuplePrefixPrinter<N - 1>::TersePrintPrefixToStrings(t, strings);<br>
-    ::std::stringstream ss;<br>
-    UniversalTersePrint(TuplePolicy<Tuple>::template get<N - 1>(t), &ss);<br>
-    strings->push_back(ss.str());<br>
-  }<br>
-};<br>
-<br>
-// Base case.<br>
-template <><br>
-struct TuplePrefixPrinter<0> {<br>
-  template <typename Tuple><br>
-  static void PrintPrefixTo(const Tuple&, ::std::ostream*) {}<br>
-<br>
-  template <typename Tuple><br>
-  static void TersePrintPrefixToStrings(const Tuple&, Strings*) {}<br>
-};<br>
-<br>
-// Helper function for printing a tuple.<br>
-// Tuple must be either std::tr1::tuple or std::tuple type.<br>
 template <typename Tuple><br>
-void PrintTupleTo(const Tuple& t, ::std::ostream* os) {<br>
-  *os << "(";<br>
-  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::PrintPrefixTo(t, os);<br>
-  *os << ")";<br>
+void TersePrintPrefixToStrings(const Tuple&, std::integral_constant<size_t, 0>,<br>
+                               Strings*) {}<br>
+template <typename Tuple, size_t I><br>
+void TersePrintPrefixToStrings(const Tuple& t,<br>
+                               std::integral_constant<size_t, I>,<br>
+                               Strings* strings) {<br>
+  TersePrintPrefixToStrings(t, std::integral_constant<size_t, I - 1>(),<br>
+                            strings);<br>
+  ::std::stringstream ss;<br>
+  UniversalTersePrint(std::get<I - 1>(t), &ss);<br>
+  strings->push_back(ss.str());<br>
 }<br>
<br>
 // Prints the fields of a tuple tersely to a string vector, one<br>
@@ -1073,11 +894,11 @@ void PrintTupleTo(const Tuple& t, ::std::ostream* os) {<br>
 template <typename Tuple><br>
 Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) {<br>
   Strings result;<br>
-  TuplePrefixPrinter<TuplePolicy<Tuple>::tuple_size>::<br>
-      TersePrintPrefixToStrings(value, &result);<br>
+  TersePrintPrefixToStrings(<br>
+      value, std::integral_constant<size_t, std::tuple_size<Tuple>::value>(),<br>
+      &result);<br>
   return result;<br>
 }<br>
-#endif  // GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_<br>
<br>
 }  // namespace internal<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h b/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
index 1e8983938ea27..aa38870e8e1c9 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-spi.h<br>
@@ -72,14 +72,15 @@ class GTEST_API_ ScopedFakeTestPartResultReporter<br>
                                    TestPartResultArray* result);<br>
<br>
   // The d'tor restores the previous test part result reporter.<br>
-  virtual ~ScopedFakeTestPartResultReporter();<br>
+  ~ScopedFakeTestPartResultReporter() override;<br>
<br>
   // Appends the TestPartResult object to the TestPartResultArray<br>
   // received in the constructor.<br>
   //<br>
   // This method is from the TestPartResultReporterInterface<br>
   // interface.<br>
-  virtual void ReportTestPartResult(const TestPartResult& result);<br>
+  void ReportTestPartResult(const TestPartResult& result) override;<br>
+<br>
  private:<br>
   void Init();<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h b/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
index 1c7b89e08796d..05a79853586a9 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-test-part.h<br>
@@ -53,22 +53,20 @@ class GTEST_API_ TestPartResult {<br>
   enum Type {<br>
     kSuccess,          // Succeeded.<br>
     kNonFatalFailure,  // Failed but the test can continue.<br>
-    kFatalFailure      // Failed and the test should be terminated.<br>
+    kFatalFailure,     // Failed and the test should be terminated.<br>
+    kSkip              // Skipped.<br>
   };<br>
<br>
   // C'tor.  TestPartResult does NOT have a default constructor.<br>
   // Always use this constructor (with parameters) to create a<br>
   // TestPartResult object.<br>
-  TestPartResult(Type a_type,<br>
-                 const char* a_file_name,<br>
-                 int a_line_number,<br>
+  TestPartResult(Type a_type, const char* a_file_name, int a_line_number,<br>
                  const char* a_message)<br>
       : type_(a_type),<br>
-        file_name_(a_file_name == NULL ? "" : a_file_name),<br>
+        file_name_(a_file_name == nullptr ? "" : a_file_name),<br>
         line_number_(a_line_number),<br>
         summary_(ExtractSummary(a_message)),<br>
-        message_(a_message) {<br>
-  }<br>
+        message_(a_message) {}<br>
<br>
   // Gets the outcome of the test part.<br>
   Type type() const { return type_; }<br>
@@ -76,7 +74,7 @@ class GTEST_API_ TestPartResult {<br>
   // Gets the name of the source file where the test part took place, or<br>
   // NULL if it's unknown.<br>
   const char* file_name() const {<br>
-    return file_name_.empty() ? NULL : file_name_.c_str();<br>
+    return file_name_.empty() ? nullptr : file_name_.c_str();<br>
   }<br>
<br>
   // Gets the line in the source file where the test part took place,<br>
@@ -89,18 +87,21 @@ class GTEST_API_ TestPartResult {<br>
   // Gets the message associated with the test part.<br>
   const char* message() const { return message_.c_str(); }<br>
<br>
-  // Returns true iff the test part passed.<br>
-  bool passed() const { return type_ == kSuccess; }<br>
+  // Returns true if and only if the test part was skipped.<br>
+  bool skipped() const { return type_ == kSkip; }<br>
<br>
-  // Returns true iff the test part failed.<br>
-  bool failed() const { return type_ != kSuccess; }<br>
+  // Returns true if and only if the test part passed.<br>
+  bool passed() const { return type_ == kSuccess; }<br>
<br>
-  // Returns true iff the test part non-fatally failed.<br>
+  // Returns true if and only if the test part non-fatally failed.<br>
   bool nonfatally_failed() const { return type_ == kNonFatalFailure; }<br>
<br>
-  // Returns true iff the test part fatally failed.<br>
+  // Returns true if and only if the test part fatally failed.<br>
   bool fatally_failed() const { return type_ == kFatalFailure; }<br>
<br>
+  // Returns true if and only if the test part failed.<br>
+  bool failed() const { return fatally_failed() || nonfatally_failed(); }<br>
+<br>
  private:<br>
   Type type_;<br>
<br>
@@ -164,8 +165,8 @@ class GTEST_API_ HasNewFatalFailureHelper<br>
     : public TestPartResultReporterInterface {<br>
  public:<br>
   HasNewFatalFailureHelper();<br>
-  virtual ~HasNewFatalFailureHelper();<br>
-  virtual void ReportTestPartResult(const TestPartResult& result);<br>
+  ~HasNewFatalFailureHelper() override;<br>
+  void ReportTestPartResult(const TestPartResult& result) override;<br>
   bool has_new_fatal_failure() const { return has_new_fatal_failure_; }<br>
  private:<br>
   bool has_new_fatal_failure_;<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h b/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
index 74bce46bdc50f..095ce058022f8 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest-typed-test.h<br>
@@ -52,22 +52,22 @@ class FooTest : public testing::Test {<br>
   T value_;<br>
 };<br>
<br>
-// Next, associate a list of types with the test case, which will be<br>
+// Next, associate a list of types with the test suite, which will be<br>
 // repeated for each type in the list.  The typedef is necessary for<br>
 // the macro to parse correctly.<br>
 typedef testing::Types<char, int, unsigned int> MyTypes;<br>
-TYPED_TEST_CASE(FooTest, MyTypes);<br>
+TYPED_TEST_SUITE(FooTest, MyTypes);<br>
<br>
 // If the type list contains only one type, you can write that type<br>
 // directly without Types<...>:<br>
-//   TYPED_TEST_CASE(FooTest, int);<br>
+//   TYPED_TEST_SUITE(FooTest, int);<br>
<br>
 // Then, use TYPED_TEST() instead of TEST_F() to define as many typed<br>
-// tests for this test case as you want.<br>
+// tests for this test suite as you want.<br>
 TYPED_TEST(FooTest, DoesBlah) {<br>
-  // Inside a test, refer to TypeParam to get the type parameter.<br>
-  // Since we are inside a derived class template, C++ requires use to<br>
-  // visit the members of FooTest via 'this'.<br>
+  // Inside a test, refer to the special name TypeParam to get the type<br>
+  // parameter.  Since we are inside a derived class template, C++ requires<br>
+  // us to visit the members of FooTest via 'this'.<br>
   TypeParam n = this->value_;<br>
<br>
   // To visit static members of the fixture, add the TestFixture::<br>
@@ -83,7 +83,7 @@ TYPED_TEST(FooTest, DoesBlah) {<br>
<br>
 TYPED_TEST(FooTest, HasPropertyA) { ... }<br>
<br>
-// TYPED_TEST_CASE takes an optional third argument which allows to specify a<br>
+// TYPED_TEST_SUITE takes an optional third argument which allows to specify a<br>
 // class that generates custom test name suffixes based on the type. This should<br>
 // be a class which has a static template function GetName(int index) returning<br>
 // a string for each type. The provided integer index equals the index of the<br>
@@ -99,7 +99,7 @@ TYPED_TEST(FooTest, HasPropertyA) { ... }<br>
 //       if (std::is_same<T, unsigned int>()) return "unsignedInt";<br>
 //     }<br>
 //   };<br>
-//   TYPED_TEST_CASE(FooTest, MyTypes, MyTypeNames);<br>
+//   TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames);<br>
<br>
 #endif  // 0<br>
<br>
@@ -126,13 +126,13 @@ class FooTest : public testing::Test {<br>
   ...<br>
 };<br>
<br>
-// Next, declare that you will define a type-parameterized test case<br>
+// Next, declare that you will define a type-parameterized test suite<br>
 // (the _P suffix is for "parameterized" or "pattern", whichever you<br>
 // prefer):<br>
-TYPED_TEST_CASE_P(FooTest);<br>
+TYPED_TEST_SUITE_P(FooTest);<br>
<br>
 // Then, use TYPED_TEST_P() to define as many type-parameterized tests<br>
-// for this type-parameterized test case as you want.<br>
+// for this type-parameterized test suite as you want.<br>
 TYPED_TEST_P(FooTest, DoesBlah) {<br>
   // Inside a test, refer to TypeParam to get the type parameter.<br>
   TypeParam n = 0;<br>
@@ -143,10 +143,10 @@ TYPED_TEST_P(FooTest, HasPropertyA) { ... }<br>
<br>
 // Now the tricky part: you need to register all test patterns before<br>
 // you can instantiate them.  The first argument of the macro is the<br>
-// test case name; the rest are the names of the tests in this test<br>
+// test suite name; the rest are the names of the tests in this test<br>
 // case.<br>
-REGISTER_TYPED_TEST_CASE_P(FooTest,<br>
-                           DoesBlah, HasPropertyA);<br>
+REGISTER_TYPED_TEST_SUITE_P(FooTest,<br>
+                            DoesBlah, HasPropertyA);<br>
<br>
 // Finally, you are free to instantiate the pattern with the types you<br>
 // want.  If you put the above code in a header file, you can #include<br>
@@ -154,19 +154,19 @@ REGISTER_TYPED_TEST_CASE_P(FooTest,<br>
 //<br>
 // To distinguish <br>
diff erent instances of the pattern, the first<br>
 // argument to the INSTANTIATE_* macro is a prefix that will be added<br>
-// to the actual test case name.  Remember to pick unique prefixes for<br>
+// to the actual test suite name.  Remember to pick unique prefixes for<br>
 // <br>
diff erent instances.<br>
 typedef testing::Types<char, int, unsigned int> MyTypes;<br>
-INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
+INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes);<br>
<br>
 // If the type list contains only one type, you can write that type<br>
 // directly without Types<...>:<br>
-//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, int);<br>
+//   INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int);<br>
 //<br>
-// Similar to the optional argument of TYPED_TEST_CASE above,<br>
-// INSTANTIATE_TEST_CASE_P takes an optional fourth argument which allows to<br>
+// Similar to the optional argument of TYPED_TEST_SUITE above,<br>
+// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to<br>
 // generate custom names.<br>
-//   INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes, MyTypeNames);<br>
+//   INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames);<br>
<br>
 #endif  // 0<br>
<br>
@@ -180,21 +180,18 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
 // Expands to the name of the typedef for the type parameters of the<br>
-// given test case.<br>
-# define GTEST_TYPE_PARAMS_(TestCaseName) gtest_type_params_##TestCaseName##_<br>
+// given test suite.<br>
+#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_<br>
<br>
 // Expands to the name of the typedef for the NameGenerator, responsible for<br>
 // creating the suffixes of the name.<br>
-#define GTEST_NAME_GENERATOR_(TestCaseName) \<br>
-  gtest_type_params_##TestCaseName##_NameGenerator<br>
-<br>
-// The 'Types' template argument below must have spaces around it<br>
-// since some compilers may choke on '>>' when passing a template<br>
-// instance (e.g. Types<int>)<br>
-# define TYPED_TEST_CASE(CaseName, Types, ...)                             \<br>
-  typedef ::testing::internal::TypeList< Types >::type GTEST_TYPE_PARAMS_( \<br>
-      CaseName);                                                           \<br>
-  typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type    \<br>
+#define GTEST_NAME_GENERATOR_(TestSuiteName) \<br>
+  gtest_type_params_##TestSuiteName##_NameGenerator<br>
+<br>
+#define TYPED_TEST_SUITE(CaseName, Types, ...)                           \<br>
+  typedef ::testing::internal::TypeList<Types>::type GTEST_TYPE_PARAMS_( \<br>
+      CaseName);                                                         \<br>
+  typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type  \<br>
       GTEST_NAME_GENERATOR_(CaseName)<br>
<br>
 # define TYPED_TEST(CaseName, TestName)                                       \<br>
@@ -224,6 +221,13 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
   void GTEST_TEST_CLASS_NAME_(CaseName,                                       \<br>
                               TestName)<gtest_TypeParam_>::TestBody()<br>
<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define TYPED_TEST_CASE                                                \<br>
+  static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \<br>
+  TYPED_TEST_SUITE<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
 #endif  // GTEST_HAS_TYPED_TEST<br>
<br>
 // Implements type-parameterized tests.<br>
@@ -233,73 +237,93 @@ INSTANTIATE_TYPED_TEST_CASE_P(My, FooTest, MyTypes);<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
 // Expands to the namespace name that the type-parameterized tests for<br>
-// the given type-parameterized test case are defined in.  The exact<br>
+// the given type-parameterized test suite are defined in.  The exact<br>
 // name of the namespace is subject to change without notice.<br>
-# define GTEST_CASE_NAMESPACE_(TestCaseName) \<br>
-  gtest_case_##TestCaseName##_<br>
+#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
 // Expands to the name of the variable used to remember the names of<br>
-// the defined tests in the given test case.<br>
-# define GTEST_TYPED_TEST_CASE_P_STATE_(TestCaseName) \<br>
-  gtest_typed_test_case_p_state_##TestCaseName##_<br>
+// the defined tests in the given test suite.<br>
+#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \<br>
+  gtest_typed_test_suite_p_state_##TestSuiteName##_<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY.<br>
 //<br>
 // Expands to the name of the variable used to remember the names of<br>
-// the registered tests in the given test case.<br>
-# define GTEST_REGISTERED_TEST_NAMES_(TestCaseName) \<br>
-  gtest_registered_test_names_##TestCaseName##_<br>
+// the registered tests in the given test suite.<br>
+#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \<br>
+  gtest_registered_test_names_##TestSuiteName##_<br>
<br>
 // The variables defined in the type-parameterized test macros are<br>
 // static as typically these macros are used in a .h file that can be<br>
 // #included in multiple translation units linked together.<br>
-# define TYPED_TEST_CASE_P(CaseName) \<br>
-  static ::testing::internal::TypedTestCasePState \<br>
-      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName)<br>
-<br>
-# define TYPED_TEST_P(CaseName, TestName) \<br>
-  namespace GTEST_CASE_NAMESPACE_(CaseName) { \<br>
-  template <typename gtest_TypeParam_> \<br>
-  class TestName : public CaseName<gtest_TypeParam_> { \<br>
-   private: \<br>
-    typedef CaseName<gtest_TypeParam_> TestFixture; \<br>
-    typedef gtest_TypeParam_ TypeParam; \<br>
-    virtual void TestBody(); \<br>
-  }; \<br>
-  static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
-      GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).AddTestName(\<br>
-          __FILE__, __LINE__, #CaseName, #TestName); \<br>
-  } \<br>
-  template <typename gtest_TypeParam_> \<br>
-  void GTEST_CASE_NAMESPACE_(CaseName)::TestName<gtest_TypeParam_>::TestBody()<br>
-<br>
-# define REGISTER_TYPED_TEST_CASE_P(CaseName, ...) \<br>
-  namespace GTEST_CASE_NAMESPACE_(CaseName) { \<br>
-  typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \<br>
-  } \<br>
-  static const char* const GTEST_REGISTERED_TEST_NAMES_(CaseName) \<br>
-      GTEST_ATTRIBUTE_UNUSED_ = \<br>
-          GTEST_TYPED_TEST_CASE_P_STATE_(CaseName).VerifyRegisteredTestNames( \<br>
-              __FILE__, __LINE__, #__VA_ARGS__)<br>
-<br>
-// The 'Types' template argument below must have spaces around it<br>
-// since some compilers may choke on '>>' when passing a template<br>
-// instance (e.g. Types<int>)<br>
-# define INSTANTIATE_TYPED_TEST_CASE_P(Prefix, CaseName, Types, ...)      \<br>
-  static bool gtest_##Prefix##_##CaseName GTEST_ATTRIBUTE_UNUSED_ =       \<br>
-      ::testing::internal::TypeParameterizedTestCase<                     \<br>
-          CaseName, GTEST_CASE_NAMESPACE_(CaseName)::gtest_AllTests_,     \<br>
-          ::testing::internal::TypeList< Types >::type>::                 \<br>
-          Register(#Prefix,                                               \<br>
-                   ::testing::internal::CodeLocation(__FILE__, __LINE__), \<br>
-                   &GTEST_TYPED_TEST_CASE_P_STATE_(CaseName), #CaseName,  \<br>
-                   GTEST_REGISTERED_TEST_NAMES_(CaseName),                \<br>
-                   ::testing::internal::GenerateNames<                    \<br>
-                       ::testing::internal::NameGeneratorSelector<        \<br>
-                           __VA_ARGS__>::type,                            \<br>
-                       ::testing::internal::TypeList< Types >::type>())<br>
+#define TYPED_TEST_SUITE_P(SuiteName)              \<br>
+  static ::testing::internal::TypedTestSuitePState \<br>
+      GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define TYPED_TEST_CASE_P                                                 \<br>
+  static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \<br>
+  TYPED_TEST_SUITE_P<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+#define TYPED_TEST_P(SuiteName, TestName)                             \<br>
+  namespace GTEST_SUITE_NAMESPACE_(SuiteName) {                       \<br>
+    template <typename gtest_TypeParam_>                              \<br>
+    class TestName : public SuiteName<gtest_TypeParam_> {             \<br>
+     private:                                                         \<br>
+      typedef SuiteName<gtest_TypeParam_> TestFixture;                \<br>
+      typedef gtest_TypeParam_ TypeParam;                             \<br>
+      virtual void TestBody();                                        \<br>
+    };                                                                \<br>
+    static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \<br>
+        GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName(       \<br>
+            __FILE__, __LINE__, #SuiteName, #TestName);               \<br>
+  }                                                                   \<br>
+  template <typename gtest_TypeParam_>                                \<br>
+  void GTEST_SUITE_NAMESPACE_(                                        \<br>
+      SuiteName)::TestName<gtest_TypeParam_>::TestBody()<br>
+<br>
+#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...)                            \<br>
+  namespace GTEST_SUITE_NAMESPACE_(SuiteName) {                                \<br>
+    typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \<br>
+  }                                                                            \<br>
+  static const char* const GTEST_REGISTERED_TEST_NAMES_(                       \<br>
+      SuiteName) GTEST_ATTRIBUTE_UNUSED_ =                                     \<br>
+      GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames(    \<br>
+          __FILE__, __LINE__, #__VA_ARGS__)<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define REGISTER_TYPED_TEST_CASE_P                                           \<br>
+  static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \<br>
+                "");                                                         \<br>
+  REGISTER_TYPED_TEST_SUITE_P<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...)       \<br>
+  static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ =        \<br>
+      ::testing::internal::TypeParameterizedTestSuite<                      \<br>
+          SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_,    \<br>
+          ::testing::internal::TypeList<Types>::type>::                     \<br>
+          Register(#Prefix,                                                 \<br>
+                   ::testing::internal::CodeLocation(__FILE__, __LINE__),   \<br>
+                   &GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \<br>
+                   GTEST_REGISTERED_TEST_NAMES_(SuiteName),                 \<br>
+                   ::testing::internal::GenerateNames<                      \<br>
+                       ::testing::internal::NameGeneratorSelector<          \<br>
+                           __VA_ARGS__>::type,                              \<br>
+                       ::testing::internal::TypeList<Types>::type>())<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+#define INSTANTIATE_TYPED_TEST_CASE_P                                      \<br>
+  static_assert(                                                           \<br>
+      ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \<br>
+  INSTANTIATE_TYPED_TEST_SUITE_P<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 #endif  // GTEST_HAS_TYPED_TEST_P<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest.h b/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
index 5df4b0a3a7127..dbe5b1c2c3f64 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest.h<br>
@@ -52,13 +52,17 @@<br>
 #ifndef GTEST_INCLUDE_GTEST_GTEST_H_<br>
 #define GTEST_INCLUDE_GTEST_GTEST_H_<br>
<br>
+#include <cstddef><br>
 #include <limits><br>
+#include <memory><br>
 #include <ostream><br>
+#include <type_traits><br>
 #include <vector><br>
<br>
 #include "gtest/internal/gtest-internal.h"<br>
 #include "gtest/internal/gtest-string.h"<br>
 #include "gtest/gtest-death-test.h"<br>
+#include "gtest/gtest-matchers.h"<br>
 #include "gtest/gtest-message.h"<br>
 #include "gtest/gtest-param-test.h"<br>
 #include "gtest/gtest-printers.h"<br>
@@ -69,21 +73,6 @@<br>
 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \<br>
 /* class A needs to have dll-interface to be used by clients of class B */)<br>
<br>
-// Depending on the platform, <br>
diff erent string classes are available.<br>
-// On Linux, in addition to ::std::string, Google also makes use of<br>
-// class ::string, which has the same interface as ::std::string, but<br>
-// has a <br>
diff erent implementation.<br>
-//<br>
-// You can define GTEST_HAS_GLOBAL_STRING to 1 to indicate that<br>
-// ::string is available AND is a distinct type to ::std::string, or<br>
-// define it to 0 to indicate otherwise.<br>
-//<br>
-// If ::std::string and ::string are the same class on your platform<br>
-// due to aliasing, you should define GTEST_HAS_GLOBAL_STRING to 0.<br>
-//<br>
-// If you do not define GTEST_HAS_GLOBAL_STRING, it is defined<br>
-// heuristically.<br>
-<br>
 namespace testing {<br>
<br>
 // Silence C4100 (unreferenced formal parameter) and 4805<br>
@@ -195,7 +184,12 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,<br>
 // If we don't forward declare them the compiler might confuse the classes<br>
 // in friendship clauses with same named classes on the scope.<br>
 class Test;<br>
-class TestCase;<br>
+class TestSuite;<br>
+<br>
+// Old API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+using TestCase = TestSuite;<br>
+#endif<br>
 class TestInfo;<br>
 class UnitTest;<br>
<br>
@@ -298,9 +292,10 @@ class GTEST_API_ AssertionResult {<br>
   template <typename T><br>
   explicit AssertionResult(<br>
       const T& success,<br>
-      typename internal::EnableIf<<br>
-          !internal::ImplicitlyConvertible<T, AssertionResult>::value>::type*<br>
-          /*enabler*/ = NULL)<br>
+      typename std::enable_if<<br>
+          !std::is_convertible<T, AssertionResult>::value>::type*<br>
+      /*enabler*/<br>
+      = nullptr)<br>
       : success_(success) {}<br>
<br>
 #if defined(_MSC_VER) && _MSC_VER < 1910<br>
@@ -313,7 +308,7 @@ class GTEST_API_ AssertionResult {<br>
     return *this;<br>
   }<br>
<br>
-  // Returns true iff the assertion succeeded.<br>
+  // Returns true if and only if the assertion succeeded.<br>
   operator bool() const { return success_; }  // NOLINT<br>
<br>
   // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.<br>
@@ -324,9 +319,8 @@ class GTEST_API_ AssertionResult {<br>
   // assertion's expectation). When nothing has been streamed into the<br>
   // object, returns an empty string.<br>
   const char* message() const {<br>
-    return message_.get() != NULL ?  message_->c_str() : "";<br>
+    return message_.get() != nullptr ? message_->c_str() : "";<br>
   }<br>
-  // FIXME: Remove this after making sure no clients use it.<br>
   // Deprecated; please use message() instead.<br>
   const char* failure_message() const { return message(); }<br>
<br>
@@ -347,8 +341,7 @@ class GTEST_API_ AssertionResult {<br>
  private:<br>
   // Appends the contents of message to message_.<br>
   void AppendMessage(const Message& a_message) {<br>
-    if (message_.get() == NULL)<br>
-      message_.reset(new ::std::string);<br>
+    if (message_.get() == nullptr) message_.reset(new ::std::string);<br>
     message_->append(a_message.GetString().c_str());<br>
   }<br>
<br>
@@ -361,7 +354,7 @@ class GTEST_API_ AssertionResult {<br>
   // construct is not satisfied with the predicate's outcome.<br>
   // Referenced via a pointer to avoid taking too much stack frame space<br>
   // with test assertions.<br>
-  internal::scoped_ptr< ::std::string> message_;<br>
+  std::unique_ptr< ::std::string> message_;<br>
 };<br>
<br>
 // Makes a successful assertion result.<br>
@@ -385,8 +378,8 @@ namespace testing {<br>
<br>
 // The abstract class that all tests inherit from.<br>
 //<br>
-// In Google Test, a unit test program contains one or many TestCases, and<br>
-// each TestCase contains one or many Tests.<br>
+// In Google Test, a unit test program contains one or many TestSuites, and<br>
+// each TestSuite contains one or many Tests.<br>
 //<br>
 // When you define a test using the TEST macro, you don't need to<br>
 // explicitly derive from Test - the TEST macro automatically does<br>
@@ -410,49 +403,57 @@ class GTEST_API_ Test {<br>
  public:<br>
   friend class TestInfo;<br>
<br>
-  // Defines types for pointers to functions that set up and tear down<br>
-  // a test case.<br>
-  typedef internal::SetUpTestCaseFunc SetUpTestCaseFunc;<br>
-  typedef internal::TearDownTestCaseFunc TearDownTestCaseFunc;<br>
-<br>
   // The d'tor is virtual as we intend to inherit from Test.<br>
   virtual ~Test();<br>
<br>
   // Sets up the stuff shared by all tests in this test case.<br>
   //<br>
-  // Google Test will call Foo::SetUpTestCase() before running the first<br>
+  // Google Test will call Foo::SetUpTestSuite() before running the first<br>
   // test in test case Foo.  Hence a sub-class can define its own<br>
-  // SetUpTestCase() method to shadow the one defined in the super<br>
+  // SetUpTestSuite() method to shadow the one defined in the super<br>
   // class.<br>
-  static void SetUpTestCase() {}<br>
+  // Failures that happen during SetUpTestSuite are logged but otherwise<br>
+  // ignored.<br>
+  static void SetUpTestSuite() {}<br>
<br>
-  // Tears down the stuff shared by all tests in this test case.<br>
+  // Tears down the stuff shared by all tests in this test suite.<br>
   //<br>
-  // Google Test will call Foo::TearDownTestCase() after running the last<br>
+  // Google Test will call Foo::TearDownTestSuite() after running the last<br>
   // test in test case Foo.  Hence a sub-class can define its own<br>
-  // TearDownTestCase() method to shadow the one defined in the super<br>
+  // TearDownTestSuite() method to shadow the one defined in the super<br>
   // class.<br>
+  // Failures that happen during TearDownTestSuite are logged but otherwise<br>
+  // ignored.<br>
+  static void TearDownTestSuite() {}<br>
+<br>
+  // Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
   static void TearDownTestCase() {}<br>
+  static void SetUpTestCase() {}<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
-  // Returns true iff the current test has a fatal failure.<br>
+  // Returns true if and only if the current test has a fatal failure.<br>
   static bool HasFatalFailure();<br>
<br>
-  // Returns true iff the current test has a non-fatal failure.<br>
+  // Returns true if and only if the current test has a non-fatal failure.<br>
   static bool HasNonfatalFailure();<br>
<br>
-  // Returns true iff the current test has a (either fatal or<br>
+  // Returns true if and only if the current test was skipped.<br>
+  static bool IsSkipped();<br>
+<br>
+  // Returns true if and only if the current test has a (either fatal or<br>
   // non-fatal) failure.<br>
   static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); }<br>
<br>
-  // Logs a property for the current test, test case, or for the entire<br>
+  // Logs a property for the current test, test suite, or for the entire<br>
   // invocation of the test program when used outside of the context of a<br>
-  // test case.  Only the last value for a given key is remembered.  These<br>
+  // test suite.  Only the last value for a given key is remembered.  These<br>
   // are public static so they can be called from utility functions that are<br>
   // not members of the test fixture.  Calls to RecordProperty made during<br>
   // lifespan of the test (from the moment its constructor starts to the<br>
   // moment its destructor finishes) will be output in XML as attributes of<br>
   // the <testcase> element.  Properties recorded from fixture's<br>
-  // SetUpTestCase or TearDownTestCase are logged as attributes of the<br>
+  // SetUpTestSuite or TearDownTestSuite are logged as attributes of the<br>
   // corresponding <testsuite> element.  Calls to RecordProperty made in the<br>
   // global context (before or after invocation of RUN_ALL_TESTS and from<br>
   // SetUp/TearDown method of Environment objects registered with Google<br>
@@ -471,8 +472,8 @@ class GTEST_API_ Test {<br>
   virtual void TearDown();<br>
<br>
  private:<br>
-  // Returns true iff the current test has the same fixture class as<br>
-  // the first test in the current test case.<br>
+  // Returns true if and only if the current test has the same fixture class<br>
+  // as the first test in the current test suite.<br>
   static bool HasSameFixtureClass();<br>
<br>
   // Runs the test after the test fixture has been set up.<br>
@@ -490,7 +491,7 @@ class GTEST_API_ Test {<br>
   // internal method to avoid clashing with names used in user TESTs.<br>
   void DeleteSelf_() { delete this; }<br>
<br>
-  const internal::scoped_ptr< GTEST_FLAG_SAVER_ > gtest_flag_saver_;<br>
+  const std::unique_ptr<GTEST_FLAG_SAVER_> gtest_flag_saver_;<br>
<br>
   // Often a user misspells SetUp() as Setup() and spends a long time<br>
   // wondering why it is never called by Google Test.  The declaration of<br>
@@ -509,7 +510,7 @@ class GTEST_API_ Test {<br>
   // If you see an error about overriding the following function or<br>
   // about it being private, you have mis-spelled SetUp() as Setup().<br>
   struct Setup_should_be_spelled_SetUp {};<br>
-  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }<br>
+  virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }<br>
<br>
   // We disallow copying Tests.<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(Test);<br>
@@ -573,21 +574,28 @@ class GTEST_API_ TestResult {<br>
   // Returns the number of the test properties.<br>
   int test_property_count() const;<br>
<br>
-  // Returns true iff the test passed (i.e. no test part failed).<br>
-  bool Passed() const { return !Failed(); }<br>
+  // Returns true if and only if the test passed (i.e. no test part failed).<br>
+  bool Passed() const { return !Skipped() && !Failed(); }<br>
+<br>
+  // Returns true if and only if the test was skipped.<br>
+  bool Skipped() const;<br>
<br>
-  // Returns true iff the test failed.<br>
+  // Returns true if and only if the test failed.<br>
   bool Failed() const;<br>
<br>
-  // Returns true iff the test fatally failed.<br>
+  // Returns true if and only if the test fatally failed.<br>
   bool HasFatalFailure() const;<br>
<br>
-  // Returns true iff the test has a non-fatal failure.<br>
+  // Returns true if and only if the test has a non-fatal failure.<br>
   bool HasNonfatalFailure() const;<br>
<br>
   // Returns the elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
+  // Gets the time of the test case start, in ms from the start of the<br>
+  // UNIX epoch.<br>
+  TimeInMillis start_timestamp() const { return start_timestamp_; }<br>
+<br>
   // Returns the i-th test part result among all the results. i can range from 0<br>
   // to total_part_count() - 1. If i is not in that range, aborts the program.<br>
   const TestPartResult& GetTestPartResult(int i) const;<br>
@@ -599,7 +607,7 @@ class GTEST_API_ TestResult {<br>
<br>
  private:<br>
   friend class TestInfo;<br>
-  friend class TestCase;<br>
+  friend class TestSuite;<br>
   friend class UnitTest;<br>
   friend class internal::DefaultGlobalTestPartResultReporter;<br>
   friend class internal::ExecDeathTest;<br>
@@ -618,6 +626,9 @@ class GTEST_API_ TestResult {<br>
     return test_properties_;<br>
   }<br>
<br>
+  // Sets the start time.<br>
+  void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; }<br>
+<br>
   // Sets the elapsed time.<br>
   void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; }<br>
<br>
@@ -631,7 +642,7 @@ class GTEST_API_ TestResult {<br>
                       const TestProperty& test_property);<br>
<br>
   // Adds a failure if the key is a reserved attribute of Google Test<br>
-  // testcase tags.  Returns true if the property is valid.<br>
+  // testsuite tags.  Returns true if the property is valid.<br>
   // FIXME: Validate attribute names are legal and human readable.<br>
   static bool ValidateTestProperty(const std::string& xml_element,<br>
                                    const TestProperty& test_property);<br>
@@ -661,6 +672,8 @@ class GTEST_API_ TestResult {<br>
   std::vector<TestProperty> test_properties_;<br>
   // Running count of death tests.<br>
   int death_test_count_;<br>
+  // The start time, in milliseconds since UNIX Epoch.<br>
+  TimeInMillis start_timestamp_;<br>
   // The elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time_;<br>
<br>
@@ -670,7 +683,7 @@ class GTEST_API_ TestResult {<br>
<br>
 // A TestInfo object stores the following information about a test:<br>
 //<br>
-//   Test case name<br>
+//   Test suite name<br>
 //   Test name<br>
 //   Whether the test should be run<br>
 //   A function pointer that creates the test object when invoked<br>
@@ -685,8 +698,13 @@ class GTEST_API_ TestInfo {<br>
   // don't inherit from TestInfo.<br>
   ~TestInfo();<br>
<br>
-  // Returns the test case name.<br>
-  const char* test_case_name() const { return test_case_name_.c_str(); }<br>
+  // Returns the test suite name.<br>
+  const char* test_suite_name() const { return test_suite_name_.c_str(); }<br>
+<br>
+// Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  const char* test_case_name() const { return test_suite_name(); }<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Returns the test name.<br>
   const char* name() const { return name_.c_str(); }<br>
@@ -694,17 +712,15 @@ class GTEST_API_ TestInfo {<br>
   // Returns the name of the parameter type, or NULL if this is not a typed<br>
   // or a type-parameterized test.<br>
   const char* type_param() const {<br>
-    if (type_param_.get() != NULL)<br>
-      return type_param_->c_str();<br>
-    return NULL;<br>
+    if (type_param_.get() != nullptr) return type_param_->c_str();<br>
+    return nullptr;<br>
   }<br>
<br>
   // Returns the text representation of the value parameter, or NULL if this<br>
   // is not a value-parameterized test.<br>
   const char* value_param() const {<br>
-    if (value_param_.get() != NULL)<br>
-      return value_param_->c_str();<br>
-    return NULL;<br>
+    if (value_param_.get() != nullptr) return value_param_->c_str();<br>
+    return nullptr;<br>
   }<br>
<br>
   // Returns the file name where this test is defined.<br>
@@ -721,7 +737,7 @@ class GTEST_API_ TestInfo {<br>
   // been specified) and its full name matches the user-specified filter.<br>
   //<br>
   // Google Test allows the user to filter the tests by their full names.<br>
-  // The full name of a test Bar in test case Foo is defined as<br>
+  // The full name of a test Bar in test suite Foo is defined as<br>
   // "Foo.Bar".  Only the tests that match the filter will run.<br>
   //<br>
   // A filter is a colon-separated list of glob (not regex) patterns,<br>
@@ -734,7 +750,7 @@ class GTEST_API_ TestInfo {<br>
   // contains the character 'A' or starts with "Foo.".<br>
   bool should_run() const { return should_run_; }<br>
<br>
-  // Returns true iff this test will appear in the XML report.<br>
+  // Returns true if and only if this test will appear in the XML report.<br>
   bool is_reportable() const {<br>
     // The XML report includes tests matching the filter, excluding those<br>
     // run in other shards.<br>
@@ -749,24 +765,19 @@ class GTEST_API_ TestInfo {<br>
   friend class internal::DefaultDeathTestFactory;<br>
 #endif  // GTEST_HAS_DEATH_TEST<br>
   friend class Test;<br>
-  friend class TestCase;<br>
+  friend class TestSuite;<br>
   friend class internal::UnitTestImpl;<br>
   friend class internal::StreamingListenerTest;<br>
   friend TestInfo* internal::MakeAndRegisterTestInfo(<br>
-      const char* test_case_name,<br>
-      const char* name,<br>
-      const char* type_param,<br>
-      const char* value_param,<br>
-      internal::CodeLocation code_location,<br>
-      internal::TypeId fixture_class_id,<br>
-      Test::SetUpTestCaseFunc set_up_tc,<br>
-      Test::TearDownTestCaseFunc tear_down_tc,<br>
+      const char* test_suite_name, const char* name, const char* type_param,<br>
+      const char* value_param, internal::CodeLocation code_location,<br>
+      internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc,<br>
+      internal::TearDownTestSuiteFunc tear_down_tc,<br>
       internal::TestFactoryBase* factory);<br>
<br>
   // Constructs a TestInfo object. The newly constructed instance assumes<br>
   // ownership of the factory object.<br>
-  TestInfo(const std::string& test_case_name,<br>
-           const std::string& name,<br>
+  TestInfo(const std::string& test_suite_name, const std::string& name,<br>
            const char* a_type_param,   // NULL if not a type-parameterized test<br>
            const char* a_value_param,  // NULL if not a value-parameterized test<br>
            internal::CodeLocation a_code_location,<br>
@@ -788,21 +799,21 @@ class GTEST_API_ TestInfo {<br>
   }<br>
<br>
   // These fields are immutable properties of the test.<br>
-  const std::string test_case_name_;     // Test case name<br>
+  const std::string test_suite_name_;    // test suite name<br>
   const std::string name_;               // Test name<br>
   // Name of the parameter type, or NULL if this is not a typed or a<br>
   // type-parameterized test.<br>
-  const internal::scoped_ptr<const ::std::string> type_param_;<br>
+  const std::unique_ptr<const ::std::string> type_param_;<br>
   // Text representation of the value parameter, or NULL if this is not a<br>
   // value-parameterized test.<br>
-  const internal::scoped_ptr<const ::std::string> value_param_;<br>
+  const std::unique_ptr<const ::std::string> value_param_;<br>
   internal::CodeLocation location_;<br>
-  const internal::TypeId fixture_class_id_;   // ID of the test fixture class<br>
-  bool should_run_;                 // True iff this test should run<br>
-  bool is_disabled_;                // True iff this test is disabled<br>
-  bool matches_filter_;             // True if this test matches the<br>
-                                    // user-specified filter.<br>
-  bool is_in_another_shard_;        // Will be run in another shard.<br>
+  const internal::TypeId fixture_class_id_;  // ID of the test fixture class<br>
+  bool should_run_;           // True if and only if this test should run<br>
+  bool is_disabled_;          // True if and only if this test is disabled<br>
+  bool matches_filter_;       // True if this test matches the<br>
+                              // user-specified filter.<br>
+  bool is_in_another_shard_;  // Will be run in another shard.<br>
   internal::TestFactoryBase* const factory_;  // The factory that creates<br>
                                               // the test object<br>
<br>
@@ -813,90 +824,96 @@ class GTEST_API_ TestInfo {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo);<br>
 };<br>
<br>
-// A test case, which consists of a vector of TestInfos.<br>
+// A test suite, which consists of a vector of TestInfos.<br>
 //<br>
-// TestCase is not copyable.<br>
-class GTEST_API_ TestCase {<br>
+// TestSuite is not copyable.<br>
+class GTEST_API_ TestSuite {<br>
  public:<br>
-  // Creates a TestCase with the given name.<br>
+  // Creates a TestSuite with the given name.<br>
   //<br>
-  // TestCase does NOT have a default constructor.  Always use this<br>
-  // constructor to create a TestCase object.<br>
+  // TestSuite does NOT have a default constructor.  Always use this<br>
+  // constructor to create a TestSuite object.<br>
   //<br>
   // Arguments:<br>
   //<br>
-  //   name:         name of the test case<br>
+  //   name:         name of the test suite<br>
   //   a_type_param: the name of the test's type parameter, or NULL if<br>
   //                 this is not a type-parameterized test.<br>
-  //   set_up_tc:    pointer to the function that sets up the test case<br>
-  //   tear_down_tc: pointer to the function that tears down the test case<br>
-  TestCase(const char* name, const char* a_type_param,<br>
-           Test::SetUpTestCaseFunc set_up_tc,<br>
-           Test::TearDownTestCaseFunc tear_down_tc);<br>
+  //   set_up_tc:    pointer to the function that sets up the test suite<br>
+  //   tear_down_tc: pointer to the function that tears down the test suite<br>
+  TestSuite(const char* name, const char* a_type_param,<br>
+            internal::SetUpTestSuiteFunc set_up_tc,<br>
+            internal::TearDownTestSuiteFunc tear_down_tc);<br>
<br>
-  // Destructor of TestCase.<br>
-  virtual ~TestCase();<br>
+  // Destructor of TestSuite.<br>
+  virtual ~TestSuite();<br>
<br>
-  // Gets the name of the TestCase.<br>
+  // Gets the name of the TestSuite.<br>
   const char* name() const { return name_.c_str(); }<br>
<br>
   // Returns the name of the parameter type, or NULL if this is not a<br>
-  // type-parameterized test case.<br>
+  // type-parameterized test suite.<br>
   const char* type_param() const {<br>
-    if (type_param_.get() != NULL)<br>
-      return type_param_->c_str();<br>
-    return NULL;<br>
+    if (type_param_.get() != nullptr) return type_param_->c_str();<br>
+    return nullptr;<br>
   }<br>
<br>
-  // Returns true if any test in this test case should run.<br>
+  // Returns true if any test in this test suite should run.<br>
   bool should_run() const { return should_run_; }<br>
<br>
-  // Gets the number of successful tests in this test case.<br>
+  // Gets the number of successful tests in this test suite.<br>
   int successful_test_count() const;<br>
<br>
-  // Gets the number of failed tests in this test case.<br>
+  // Gets the number of skipped tests in this test suite.<br>
+  int skipped_test_count() const;<br>
+<br>
+  // Gets the number of failed tests in this test suite.<br>
   int failed_test_count() const;<br>
<br>
   // Gets the number of disabled tests that will be reported in the XML report.<br>
   int reportable_disabled_test_count() const;<br>
<br>
-  // Gets the number of disabled tests in this test case.<br>
+  // Gets the number of disabled tests in this test suite.<br>
   int disabled_test_count() const;<br>
<br>
   // Gets the number of tests to be printed in the XML report.<br>
   int reportable_test_count() const;<br>
<br>
-  // Get the number of tests in this test case that should run.<br>
+  // Get the number of tests in this test suite that should run.<br>
   int test_to_run_count() const;<br>
<br>
-  // Gets the number of all tests in this test case.<br>
+  // Gets the number of all tests in this test suite.<br>
   int total_test_count() const;<br>
<br>
-  // Returns true iff the test case passed.<br>
+  // Returns true if and only if the test suite passed.<br>
   bool Passed() const { return !Failed(); }<br>
<br>
-  // Returns true iff the test case failed.<br>
+  // Returns true if and only if the test suite failed.<br>
   bool Failed() const { return failed_test_count() > 0; }<br>
<br>
   // Returns the elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
+  // Gets the time of the test suite start, in ms from the start of the<br>
+  // UNIX epoch.<br>
+  TimeInMillis start_timestamp() const { return start_timestamp_; }<br>
+<br>
   // Returns the i-th test among all the tests. i can range from 0 to<br>
   // total_test_count() - 1. If i is not in that range, returns NULL.<br>
   const TestInfo* GetTestInfo(int i) const;<br>
<br>
   // Returns the TestResult that holds test properties recorded during<br>
-  // execution of SetUpTestCase and TearDownTestCase.<br>
+  // execution of SetUpTestSuite and TearDownTestSuite.<br>
   const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; }<br>
<br>
  private:<br>
   friend class Test;<br>
   friend class internal::UnitTestImpl;<br>
<br>
-  // Gets the (mutable) vector of TestInfos in this TestCase.<br>
+  // Gets the (mutable) vector of TestInfos in this TestSuite.<br>
   std::vector<TestInfo*>& test_info_list() { return test_info_list_; }<br>
<br>
-  // Gets the (immutable) vector of TestInfos in this TestCase.<br>
+  // Gets the (immutable) vector of TestInfos in this TestSuite.<br>
   const std::vector<TestInfo*>& test_info_list() const {<br>
     return test_info_list_;<br>
   }<br>
@@ -908,51 +925,64 @@ class GTEST_API_ TestCase {<br>
   // Sets the should_run member.<br>
   void set_should_run(bool should) { should_run_ = should; }<br>
<br>
-  // Adds a TestInfo to this test case.  Will delete the TestInfo upon<br>
-  // destruction of the TestCase object.<br>
+  // Adds a TestInfo to this test suite.  Will delete the TestInfo upon<br>
+  // destruction of the TestSuite object.<br>
   void AddTestInfo(TestInfo * test_info);<br>
<br>
-  // Clears the results of all tests in this test case.<br>
+  // Clears the results of all tests in this test suite.<br>
   void ClearResult();<br>
<br>
-  // Clears the results of all tests in the given test case.<br>
-  static void ClearTestCaseResult(TestCase* test_case) {<br>
-    test_case->ClearResult();<br>
+  // Clears the results of all tests in the given test suite.<br>
+  static void ClearTestSuiteResult(TestSuite* test_suite) {<br>
+    test_suite->ClearResult();<br>
   }<br>
<br>
-  // Runs every test in this TestCase.<br>
+  // Runs every test in this TestSuite.<br>
   void Run();<br>
<br>
-  // Runs SetUpTestCase() for this TestCase.  This wrapper is needed<br>
-  // for catching exceptions thrown from SetUpTestCase().<br>
-  void RunSetUpTestCase() { (*set_up_tc_)(); }<br>
+  // Runs SetUpTestSuite() for this TestSuite.  This wrapper is needed<br>
+  // for catching exceptions thrown from SetUpTestSuite().<br>
+  void RunSetUpTestSuite() {<br>
+    if (set_up_tc_ != nullptr) {<br>
+      (*set_up_tc_)();<br>
+    }<br>
+  }<br>
<br>
-  // Runs TearDownTestCase() for this TestCase.  This wrapper is<br>
-  // needed for catching exceptions thrown from TearDownTestCase().<br>
-  void RunTearDownTestCase() { (*tear_down_tc_)(); }<br>
+  // Runs TearDownTestSuite() for this TestSuite.  This wrapper is<br>
+  // needed for catching exceptions thrown from TearDownTestSuite().<br>
+  void RunTearDownTestSuite() {<br>
+    if (tear_down_tc_ != nullptr) {<br>
+      (*tear_down_tc_)();<br>
+    }<br>
+  }<br>
<br>
-  // Returns true iff test passed.<br>
+  // Returns true if and only if test passed.<br>
   static bool TestPassed(const TestInfo* test_info) {<br>
     return test_info->should_run() && test_info->result()->Passed();<br>
   }<br>
<br>
-  // Returns true iff test failed.<br>
+  // Returns true if and only if test skipped.<br>
+  static bool TestSkipped(const TestInfo* test_info) {<br>
+    return test_info->should_run() && test_info->result()->Skipped();<br>
+  }<br>
+<br>
+  // Returns true if and only if test failed.<br>
   static bool TestFailed(const TestInfo* test_info) {<br>
     return test_info->should_run() && test_info->result()->Failed();<br>
   }<br>
<br>
-  // Returns true iff the test is disabled and will be reported in the XML<br>
-  // report.<br>
+  // Returns true if and only if the test is disabled and will be reported in<br>
+  // the XML report.<br>
   static bool TestReportableDisabled(const TestInfo* test_info) {<br>
     return test_info->is_reportable() && test_info->is_disabled_;<br>
   }<br>
<br>
-  // Returns true iff test is disabled.<br>
+  // Returns true if and only if test is disabled.<br>
   static bool TestDisabled(const TestInfo* test_info) {<br>
     return test_info->is_disabled_;<br>
   }<br>
<br>
-  // Returns true iff this test will appear in the XML report.<br>
+  // Returns true if and only if this test will appear in the XML report.<br>
   static bool TestReportable(const TestInfo* test_info) {<br>
     return test_info->is_reportable();<br>
   }<br>
@@ -962,17 +992,17 @@ class GTEST_API_ TestCase {<br>
     return test_info->should_run();<br>
   }<br>
<br>
-  // Shuffles the tests in this test case.<br>
+  // Shuffles the tests in this test suite.<br>
   void ShuffleTests(internal::Random* random);<br>
<br>
   // Restores the test order to before the first shuffle.<br>
   void UnshuffleTests();<br>
<br>
-  // Name of the test case.<br>
+  // Name of the test suite.<br>
   std::string name_;<br>
   // Name of the parameter type, or NULL if this is not a typed or a<br>
   // type-parameterized test.<br>
-  const internal::scoped_ptr<const ::std::string> type_param_;<br>
+  const std::unique_ptr<const ::std::string> type_param_;<br>
   // The vector of TestInfos in their original order.  It owns the<br>
   // elements in the vector.<br>
   std::vector<TestInfo*> test_info_list_;<br>
@@ -980,20 +1010,22 @@ class GTEST_API_ TestCase {<br>
   // shuffling and restoring the test order.  The i-th element in this<br>
   // vector is the index of the i-th test in the shuffled test list.<br>
   std::vector<int> test_indices_;<br>
-  // Pointer to the function that sets up the test case.<br>
-  Test::SetUpTestCaseFunc set_up_tc_;<br>
-  // Pointer to the function that tears down the test case.<br>
-  Test::TearDownTestCaseFunc tear_down_tc_;<br>
-  // True iff any test in this test case should run.<br>
+  // Pointer to the function that sets up the test suite.<br>
+  internal::SetUpTestSuiteFunc set_up_tc_;<br>
+  // Pointer to the function that tears down the test suite.<br>
+  internal::TearDownTestSuiteFunc tear_down_tc_;<br>
+  // True if and only if any test in this test suite should run.<br>
   bool should_run_;<br>
+  // The start time, in milliseconds since UNIX Epoch.<br>
+  TimeInMillis start_timestamp_;<br>
   // Elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time_;<br>
-  // Holds test properties recorded during execution of SetUpTestCase and<br>
-  // TearDownTestCase.<br>
+  // Holds test properties recorded during execution of SetUpTestSuite and<br>
+  // TearDownTestSuite.<br>
   TestResult ad_hoc_test_result_;<br>
<br>
-  // We disallow copying TestCases.<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestCase);<br>
+  // We disallow copying TestSuites.<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite);<br>
 };<br>
<br>
 // An Environment object is capable of setting up and tearing down an<br>
@@ -1024,7 +1056,7 @@ class Environment {<br>
   // If you see an error about overriding the following function or<br>
   // about it being private, you have mis-spelled SetUp() as Setup().<br>
   struct Setup_should_be_spelled_SetUp {};<br>
-  virtual Setup_should_be_spelled_SetUp* Setup() { return NULL; }<br>
+  virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; }<br>
 };<br>
<br>
 #if GTEST_HAS_EXCEPTIONS<br>
@@ -1060,8 +1092,13 @@ class TestEventListener {<br>
   // Fired after environment set-up for each iteration of tests ends.<br>
   virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0;<br>
<br>
-  // Fired before the test case starts.<br>
-  virtual void OnTestCaseStart(const TestCase& test_case) = 0;<br>
+  // Fired before the test suite starts.<br>
+  virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {}<br>
+<br>
+  //  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Fired before the test starts.<br>
   virtual void OnTestStart(const TestInfo& test_info) = 0;<br>
@@ -1074,8 +1111,13 @@ class TestEventListener {<br>
   // Fired after the test ends.<br>
   virtual void OnTestEnd(const TestInfo& test_info) = 0;<br>
<br>
-  // Fired after the test case ends.<br>
-  virtual void OnTestCaseEnd(const TestCase& test_case) = 0;<br>
+  // Fired after the test suite ends.<br>
+  virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {}<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Fired before environment tear-down for each iteration of tests starts.<br>
   virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0;<br>
@@ -1098,21 +1140,30 @@ class TestEventListener {<br>
 // above.<br>
 class EmptyTestEventListener : public TestEventListener {<br>
  public:<br>
-  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestIterationStart(const UnitTest& /*unit_test*/,<br>
-                                    int /*iteration*/) {}<br>
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestCaseStart(const TestCase& /*test_case*/) {}<br>
-  virtual void OnTestStart(const TestInfo& /*test_info*/) {}<br>
-  virtual void OnTestPartResult(const TestPartResult& /*test_part_result*/) {}<br>
-  virtual void OnTestEnd(const TestInfo& /*test_info*/) {}<br>
-  virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {}<br>
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestIterationEnd(const UnitTest& /*unit_test*/,<br>
-                                  int /*iteration*/) {}<br>
-  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}<br>
+  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}<br>
+  void OnTestIterationStart(const UnitTest& /*unit_test*/,<br>
+                            int /*iteration*/) override {}<br>
+  void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {}<br>
+  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}<br>
+  void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {}<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseStart(const TestCase& /*test_case*/) override {}<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+  void OnTestStart(const TestInfo& /*test_info*/) override {}<br>
+  void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {}<br>
+  void OnTestEnd(const TestInfo& /*test_info*/) override {}<br>
+  void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {}<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseEnd(const TestCase& /*test_case*/) override {}<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+  void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {}<br>
+  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}<br>
+  void OnTestIterationEnd(const UnitTest& /*unit_test*/,<br>
+                          int /*iteration*/) override {}<br>
+  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}<br>
 };<br>
<br>
 // TestEventListeners lets users add listeners to track events in Google Test.<br>
@@ -1152,7 +1203,7 @@ class GTEST_API_ TestEventListeners {<br>
   }<br>
<br>
  private:<br>
-  friend class TestCase;<br>
+  friend class TestSuite;<br>
   friend class TestInfo;<br>
   friend class internal::DefaultGlobalTestPartResultReporter;<br>
   friend class internal::NoExecDeathTest;<br>
@@ -1193,7 +1244,7 @@ class GTEST_API_ TestEventListeners {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners);<br>
 };<br>
<br>
-// A UnitTest consists of a vector of TestCases.<br>
+// A UnitTest consists of a vector of TestSuites.<br>
 //<br>
 // This is a singleton class.  The only instance of UnitTest is<br>
 // created when UnitTest::GetInstance() is first called.  This<br>
@@ -1222,10 +1273,14 @@ class GTEST_API_ UnitTest {<br>
   // was executed.  The UnitTest object owns the string.<br>
   const char* original_working_dir() const;<br>
<br>
-  // Returns the TestCase object for the test that's currently running,<br>
+  // Returns the TestSuite object for the test that's currently running,<br>
   // or NULL if no test is running.<br>
-  const TestCase* current_test_case() const<br>
-      GTEST_LOCK_EXCLUDED_(mutex_);<br>
+  const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_);<br>
+<br>
+// Legacy API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_);<br>
+#endif<br>
<br>
   // Returns the TestInfo object for the test that's currently running,<br>
   // or NULL if no test is running.<br>
@@ -1235,29 +1290,40 @@ class GTEST_API_ UnitTest {<br>
   // Returns the random seed used at the start of the current test run.<br>
   int random_seed() const;<br>
<br>
-  // Returns the ParameterizedTestCaseRegistry object used to keep track of<br>
+  // Returns the ParameterizedTestSuiteRegistry object used to keep track of<br>
   // value-parameterized tests and instantiate and register them.<br>
   //<br>
   // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM.<br>
-  internal::ParameterizedTestCaseRegistry& parameterized_test_registry()<br>
+  internal::ParameterizedTestSuiteRegistry& parameterized_test_registry()<br>
       GTEST_LOCK_EXCLUDED_(mutex_);<br>
<br>
-  // Gets the number of successful test cases.<br>
-  int successful_test_case_count() const;<br>
+  // Gets the number of successful test suites.<br>
+  int successful_test_suite_count() const;<br>
<br>
-  // Gets the number of failed test cases.<br>
-  int failed_test_case_count() const;<br>
+  // Gets the number of failed test suites.<br>
+  int failed_test_suite_count() const;<br>
<br>
-  // Gets the number of all test cases.<br>
-  int total_test_case_count() const;<br>
+  // Gets the number of all test suites.<br>
+  int total_test_suite_count() const;<br>
<br>
-  // Gets the number of all test cases that contain at least one test<br>
+  // Gets the number of all test suites that contain at least one test<br>
   // that should run.<br>
+  int test_suite_to_run_count() const;<br>
+<br>
+  //  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  int successful_test_case_count() const;<br>
+  int failed_test_case_count() const;<br>
+  int total_test_case_count() const;<br>
   int test_case_to_run_count() const;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Gets the number of successful tests.<br>
   int successful_test_count() const;<br>
<br>
+  // Gets the number of skipped tests.<br>
+  int skipped_test_count() const;<br>
+<br>
   // Gets the number of failed tests.<br>
   int failed_test_count() const;<br>
<br>
@@ -1283,19 +1349,25 @@ class GTEST_API_ UnitTest {<br>
   // Gets the elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time() const;<br>
<br>
-  // Returns true iff the unit test passed (i.e. all test cases passed).<br>
+  // Returns true if and only if the unit test passed (i.e. all test suites<br>
+  // passed).<br>
   bool Passed() const;<br>
<br>
-  // Returns true iff the unit test failed (i.e. some test case failed<br>
-  // or something outside of all tests failed).<br>
+  // Returns true if and only if the unit test failed (i.e. some test suite<br>
+  // failed or something outside of all tests failed).<br>
   bool Failed() const;<br>
<br>
-  // Gets the i-th test case among all the test cases. i can range from 0 to<br>
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
+  // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+  // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+  const TestSuite* GetTestSuite(int i) const;<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
   const TestCase* GetTestCase(int i) const;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Returns the TestResult containing information on test failures and<br>
-  // properties logged outside of individual test cases.<br>
+  // properties logged outside of individual test suites.<br>
   const TestResult& ad_hoc_test_result() const;<br>
<br>
   // Returns the list of event listeners that can be used to track events<br>
@@ -1326,15 +1398,15 @@ class GTEST_API_ UnitTest {<br>
       GTEST_LOCK_EXCLUDED_(mutex_);<br>
<br>
   // Adds a TestProperty to the current TestResult object when invoked from<br>
-  // inside a test, to current TestCase's ad_hoc_test_result_ when invoked<br>
-  // from SetUpTestCase or TearDownTestCase, or to the global property set<br>
+  // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked<br>
+  // from SetUpTestSuite or TearDownTestSuite, or to the global property set<br>
   // when invoked elsewhere.  If the result already contains a property with<br>
   // the same key, the value will be updated.<br>
   void RecordProperty(const std::string& key, const std::string& value);<br>
<br>
-  // Gets the i-th test case among all the test cases. i can range from 0 to<br>
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
-  TestCase* GetMutableTestCase(int i);<br>
+  // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+  // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+  TestSuite* GetMutableTestSuite(int i);<br>
<br>
   // Accessors for the implementation object.<br>
   internal::UnitTestImpl* impl() { return impl_; }<br>
@@ -1419,6 +1491,10 @@ GTEST_API_ void InitGoogleTest(int* argc, char** argv);<br>
 // UNICODE mode.<br>
 GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv);<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+GTEST_API_ void InitGoogleTest();<br>
+<br>
 namespace internal {<br>
<br>
 // Separate the error generating code from the code path to reduce the stack<br>
@@ -1435,6 +1511,13 @@ AssertionResult CmpHelperEQFailure(const char* lhs_expression,<br>
                    false);<br>
 }<br>
<br>
+// This block of code defines operator==/!=<br>
+// to block lexical scope lookup.<br>
+// It prevents using invalid operator==/!= defined at namespace scope.<br>
+struct faketype {};<br>
+inline bool operator==(faketype, faketype) { return true; }<br>
+inline bool operator!=(faketype, faketype) { return false; }<br>
+<br>
 // The helper function for {ASSERT|EXPECT}_EQ.<br>
 template <typename T1, typename T2><br>
 AssertionResult CmpHelperEQ(const char* lhs_expression,<br>
@@ -1456,18 +1539,17 @@ GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression,<br>
                                        BiggestInt lhs,<br>
                                        BiggestInt rhs);<br>
<br>
-// The helper class for {ASSERT|EXPECT}_EQ.  The template argument<br>
-// lhs_is_null_literal is true iff the first argument to ASSERT_EQ()<br>
-// is a null pointer literal.  The following default implementation is<br>
-// for lhs_is_null_literal being false.<br>
-template <bool lhs_is_null_literal><br>
 class EqHelper {<br>
  public:<br>
   // This templatized version is for the general case.<br>
-  template <typename T1, typename T2><br>
+  template <<br>
+      typename T1, typename T2,<br>
+      // Disable this overload for cases where one argument is a pointer<br>
+      // and the other is the null pointer constant.<br>
+      typename std::enable_if<!std::is_integral<T1>::value ||<br>
+                              !std::is_pointer<T2>::value>::type* = nullptr><br>
   static AssertionResult Compare(const char* lhs_expression,<br>
-                                 const char* rhs_expression,<br>
-                                 const T1& lhs,<br>
+                                 const char* rhs_expression, const T1& lhs,<br>
                                  const T2& rhs) {<br>
     return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
   }<br>
@@ -1484,49 +1566,15 @@ class EqHelper {<br>
                                  BiggestInt rhs) {<br>
     return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
   }<br>
-};<br>
<br>
-// This specialization is used when the first argument to ASSERT_EQ()<br>
-// is a null pointer literal, like NULL, false, or 0.<br>
-template <><br>
-class EqHelper<true> {<br>
- public:<br>
-  // We define two overloaded versions of Compare().  The first<br>
-  // version will be picked when the second argument to ASSERT_EQ() is<br>
-  // NOT a pointer, e.g. ASSERT_EQ(0, AnIntFunction()) or<br>
-  // EXPECT_EQ(false, a_bool).<br>
-  template <typename T1, typename T2><br>
-  static AssertionResult Compare(<br>
-      const char* lhs_expression,<br>
-      const char* rhs_expression,<br>
-      const T1& lhs,<br>
-      const T2& rhs,<br>
-      // The following line prevents this overload from being considered if T2<br>
-      // is not a pointer type.  We need this because ASSERT_EQ(NULL, my_ptr)<br>
-      // expands to Compare("", "", NULL, my_ptr), which requires a conversion<br>
-      // to match the Secret* in the other overload, which would otherwise make<br>
-      // this template match better.<br>
-      typename EnableIf<!is_pointer<T2>::value>::type* = 0) {<br>
-    return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs);<br>
-  }<br>
-<br>
-  // This version will be picked when the second argument to ASSERT_EQ() is a<br>
-  // pointer, e.g. ASSERT_EQ(NULL, a_pointer).<br>
   template <typename T><br>
   static AssertionResult Compare(<br>
-      const char* lhs_expression,<br>
-      const char* rhs_expression,<br>
-      // We used to have a second template parameter instead of Secret*.  That<br>
-      // template parameter would deduce to 'long', making this a better match<br>
-      // than the first overload even without the first overload's EnableIf.<br>
-      // Unfortunately, gcc with -Wconversion-null warns when "passing NULL to<br>
-      // non-pointer argument" (even a deduced integral argument), so the old<br>
-      // implementation caused warnings in user code.<br>
-      Secret* /* lhs (NULL) */,<br>
-      T* rhs) {<br>
+      const char* lhs_expression, const char* rhs_expression,<br>
+      // Handle cases where '0' is used as a null pointer literal.<br>
+      std::nullptr_t /* lhs */, T* rhs) {<br>
     // We already know that 'lhs' is a null pointer.<br>
-    return CmpHelperEQ(lhs_expression, rhs_expression,<br>
-                       static_cast<T*>(NULL), rhs);<br>
+    return CmpHelperEQ(lhs_expression, rhs_expression, static_cast<T*>(nullptr),<br>
+                       rhs);<br>
   }<br>
 };<br>
<br>
@@ -1755,6 +1803,12 @@ class GTEST_API_ AssertHelper {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper);<br>
 };<br>
<br>
+enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW };<br>
+<br>
+GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color,<br>
+                                                            const char* fmt,<br>
+                                                            ...);<br>
+<br>
 }  // namespace internal<br>
<br>
 // The pure interface class that all value-parameterized tests inherit from.<br>
@@ -1774,13 +1828,13 @@ class GTEST_API_ AssertHelper {<br>
 //   FooTest() {<br>
 //     // Can use GetParam() here.<br>
 //   }<br>
-//   virtual ~FooTest() {<br>
+//   ~FooTest() override {<br>
 //     // Can use GetParam() here.<br>
 //   }<br>
-//   virtual void SetUp() {<br>
+//   void SetUp() override {<br>
 //     // Can use GetParam() here.<br>
 //   }<br>
-//   virtual void TearDown {<br>
+//   void TearDown override {<br>
 //     // Can use GetParam() here.<br>
 //   }<br>
 // };<br>
@@ -1789,7 +1843,7 @@ class GTEST_API_ AssertHelper {<br>
 //   Foo foo;<br>
 //   ASSERT_TRUE(foo.DoesBar(GetParam()));<br>
 // }<br>
-// INSTANTIATE_TEST_CASE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));<br>
+// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10));<br>
<br>
 template <typename T><br>
 class WithParamInterface {<br>
@@ -1798,12 +1852,9 @@ class WithParamInterface {<br>
   virtual ~WithParamInterface() {}<br>
<br>
   // The current parameter value. Is also available in the test fixture's<br>
-  // constructor. This member function is non-static, even though it only<br>
-  // references static data, to reduce the opportunity for incorrect uses<br>
-  // like writing 'WithParamInterface<bool>::GetParam()' for a test that<br>
-  // uses a fixture whose parameter type is int.<br>
-  const ParamType& GetParam() const {<br>
-    GTEST_CHECK_(parameter_ != NULL)<br>
+  // constructor.<br>
+  static const ParamType& GetParam() {<br>
+    GTEST_CHECK_(parameter_ != nullptr)<br>
         << "GetParam() can only be called inside a value-parameterized test "<br>
         << "-- did you intend to write TEST_P instead of TEST_F?";<br>
     return *parameter_;<br>
@@ -1824,7 +1875,7 @@ class WithParamInterface {<br>
 };<br>
<br>
 template <typename T><br>
-const T* WithParamInterface<T>::parameter_ = NULL;<br>
+const T* WithParamInterface<T>::parameter_ = nullptr;<br>
<br>
 // Most value-parameterized classes can ignore the existence of<br>
 // WithParamInterface, and can just inherit from ::testing::TestWithParam.<br>
@@ -1835,6 +1886,11 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
<br>
 // Macros for indicating success/failure in test code.<br>
<br>
+// Skips test in runtime.<br>
+// Skipping test aborts current function.<br>
+// Skipped tests are neither successful nor failed.<br>
+#define GTEST_SKIP() GTEST_SKIP_("Skipped")<br>
+<br>
 // ADD_FAILURE unconditionally adds a failure to the current test.<br>
 // SUCCEED generates a success - it doesn't automatically make the<br>
 // current test successful, as a test is only successful when it has<br>
@@ -1864,6 +1920,11 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
 // Generates a fatal failure with a generic message.<br>
 #define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed")<br>
<br>
+// Like GTEST_FAIL(), but at the given source file location.<br>
+#define GTEST_FAIL_AT(file, line)         \<br>
+  GTEST_MESSAGE_AT_(file, line, "Failed", \<br>
+                    ::testing::TestPartResult::kFatalFailure)<br>
+<br>
 // Define this macro to 1 to omit the definition of FAIL(), which is a<br>
 // generic name and clashes with some other libraries.<br>
 #if !GTEST_DONT_DEFINE_FAIL<br>
@@ -1964,9 +2025,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
 //   ASSERT_GT(records.size(), 0) << "There is no record left.";<br>
<br>
 #define EXPECT_EQ(val1, val2) \<br>
-  EXPECT_PRED_FORMAT2(::testing::internal:: \<br>
-                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \<br>
-                      val1, val2)<br>
+  EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)<br>
 #define EXPECT_NE(val1, val2) \<br>
   EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)<br>
 #define EXPECT_LE(val1, val2) \<br>
@@ -1979,9 +2038,7 @@ class TestWithParam : public Test, public WithParamInterface<T> {<br>
   EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2)<br>
<br>
 #define GTEST_ASSERT_EQ(val1, val2) \<br>
-  ASSERT_PRED_FORMAT2(::testing::internal:: \<br>
-                      EqHelper<GTEST_IS_NULL_LITERAL_(val1)>::Compare, \<br>
-                      val1, val2)<br>
+  ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2)<br>
 #define GTEST_ASSERT_NE(val1, val2) \<br>
   ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2)<br>
 #define GTEST_ASSERT_LE(val1, val2) \<br>
@@ -2172,12 +2229,6 @@ class GTEST_API_ ScopedTrace {<br>
     PushTrace(file, line, message ? message : "(null)");<br>
   }<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-  ScopedTrace(const char* file, int line, const ::string& message) {<br>
-    PushTrace(file, line, message);<br>
-  }<br>
-#endif<br>
-<br>
   ScopedTrace(const char* file, int line, const std::string& message) {<br>
     PushTrace(file, line, message);<br>
   }<br>
@@ -2215,10 +2266,9 @@ class GTEST_API_ ScopedTrace {<br>
   ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\<br>
     __FILE__, __LINE__, (message))<br>
<br>
-<br>
 // Compile-time assertion for type equality.<br>
-// StaticAssertTypeEq<type1, type2>() compiles iff type1 and type2 are<br>
-// the same type.  The value it returns is not interesting.<br>
+// StaticAssertTypeEq<type1, type2>() compiles if and only if type1 and type2<br>
+// are the same type.  The value it returns is not interesting.<br>
 //<br>
 // Instead of making StaticAssertTypeEq a class template, we make it a<br>
 // function template that invokes a helper class template.  This<br>
@@ -2247,18 +2297,19 @@ class GTEST_API_ ScopedTrace {<br>
 //<br>
 // to cause a compiler error.<br>
 template <typename T1, typename T2><br>
-bool StaticAssertTypeEq() {<br>
-  (void)internal::StaticAssertTypeEqHelper<T1, T2>();<br>
+constexpr bool StaticAssertTypeEq() noexcept {<br>
+  static_assert(std::is_same<T1, T2>::value,<br>
+                "type1 and type2 are not the same type");<br>
   return true;<br>
 }<br>
<br>
 // Defines a test.<br>
 //<br>
-// The first parameter is the name of the test case, and the second<br>
-// parameter is the name of the test within the test case.<br>
+// The first parameter is the name of the test suite, and the second<br>
+// parameter is the name of the test within the test suite.<br>
 //<br>
-// The convention is to end the test case name with "Test".  For<br>
-// example, a test case for the Foo class can be named FooTest.<br>
+// The convention is to end the test suite name with "Test".  For<br>
+// example, a test suite for the Foo class can be named FooTest.<br>
 //<br>
 // Test code should appear between braces after an invocation of<br>
 // this macro.  Example:<br>
@@ -2277,28 +2328,28 @@ bool StaticAssertTypeEq() {<br>
 // code.  GetTestTypeId() is guaranteed to always return the same<br>
 // value, as it always calls GetTypeId<>() from the Google Test<br>
 // framework.<br>
-#define GTEST_TEST(test_case_name, test_name)\<br>
-  GTEST_TEST_(test_case_name, test_name, \<br>
-              ::testing::Test, ::testing::internal::GetTestTypeId())<br>
+#define GTEST_TEST(test_suite_name, test_name)             \<br>
+  GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \<br>
+              ::testing::internal::GetTestTypeId())<br>
<br>
 // Define this macro to 1 to omit the definition of TEST(), which<br>
 // is a generic name and clashes with some other libraries.<br>
 #if !GTEST_DONT_DEFINE_TEST<br>
-# define TEST(test_case_name, test_name) GTEST_TEST(test_case_name, test_name)<br>
+#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name)<br>
 #endif<br>
<br>
 // Defines a test that uses a test fixture.<br>
 //<br>
 // The first parameter is the name of the test fixture class, which<br>
-// also doubles as the test case name.  The second parameter is the<br>
-// name of the test within the test case.<br>
+// also doubles as the test suite name.  The second parameter is the<br>
+// name of the test within the test suite.<br>
 //<br>
 // A test fixture class must be declared earlier.  The user should put<br>
 // the test code between braces after using this macro.  Example:<br>
 //<br>
 //   class FooTest : public testing::Test {<br>
 //    protected:<br>
-//     virtual void SetUp() { b_.AddElement(3); }<br>
+//     void SetUp() override { b_.AddElement(3); }<br>
 //<br>
 //     Foo a_;<br>
 //     Foo b_;<br>
@@ -2312,7 +2363,8 @@ bool StaticAssertTypeEq() {<br>
 //     EXPECT_EQ(a_.size(), 0);<br>
 //     EXPECT_EQ(b_.size(), 1);<br>
 //   }<br>
-<br>
+//<br>
+// GOOGLETEST_CM0011 DO NOT DELETE<br>
 #define TEST_F(test_fixture, test_name)\<br>
   GTEST_TEST_(test_fixture, test_name, test_fixture, \<br>
               ::testing::internal::GetTypeId<test_fixture>())<br>
@@ -2325,6 +2377,86 @@ GTEST_API_ std::string TempDir();<br>
 #  pragma warning(pop)<br>
 #endif<br>
<br>
+// Dynamically registers a test with the framework.<br>
+//<br>
+// This is an advanced API only to be used when the `TEST` macros are<br>
+// insufficient. The macros should be preferred when possible, as they avoid<br>
+// most of the complexity of calling this function.<br>
+//<br>
+// The `factory` argument is a factory callable (move-constructible) object or<br>
+// function pointer that creates a new instance of the Test object. It<br>
+// handles ownership to the caller. The signature of the callable is<br>
+// `Fixture*()`, where `Fixture` is the test fixture class for the test. All<br>
+// tests registered with the same `test_suite_name` must return the same<br>
+// fixture type. This is checked at runtime.<br>
+//<br>
+// The framework will infer the fixture class from the factory and will call<br>
+// the `SetUpTestSuite` and `TearDownTestSuite` for it.<br>
+//<br>
+// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is<br>
+// undefined.<br>
+//<br>
+// Use case example:<br>
+//<br>
+// class MyFixture : public ::testing::Test {<br>
+//  public:<br>
+//   // All of these optional, just like in regular macro usage.<br>
+//   static void SetUpTestSuite() { ... }<br>
+//   static void TearDownTestSuite() { ... }<br>
+//   void SetUp() override { ... }<br>
+//   void TearDown() override { ... }<br>
+// };<br>
+//<br>
+// class MyTest : public MyFixture {<br>
+//  public:<br>
+//   explicit MyTest(int data) : data_(data) {}<br>
+//   void TestBody() override { ... }<br>
+//<br>
+//  private:<br>
+//   int data_;<br>
+// };<br>
+//<br>
+// void RegisterMyTests(const std::vector<int>& values) {<br>
+//   for (int v : values) {<br>
+//     ::testing::RegisterTest(<br>
+//         "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr,<br>
+//         std::to_string(v).c_str(),<br>
+//         __FILE__, __LINE__,<br>
+//         // Important to use the fixture type as the return type here.<br>
+//         [=]() -> MyFixture* { return new MyTest(v); });<br>
+//   }<br>
+// }<br>
+// ...<br>
+// int main(int argc, char** argv) {<br>
+//   std::vector<int> values_to_test = LoadValuesFromConfig();<br>
+//   RegisterMyTests(values_to_test);<br>
+//   ...<br>
+//   return RUN_ALL_TESTS();<br>
+// }<br>
+//<br>
+template <int&... ExplicitParameterBarrier, typename Factory><br>
+TestInfo* RegisterTest(const char* test_suite_name, const char* test_name,<br>
+                       const char* type_param, const char* value_param,<br>
+                       const char* file, int line, Factory factory) {<br>
+  using TestT = typename std::remove_pointer<decltype(factory())>::type;<br>
+<br>
+  class FactoryImpl : public internal::TestFactoryBase {<br>
+   public:<br>
+    explicit FactoryImpl(Factory f) : factory_(std::move(f)) {}<br>
+    Test* CreateTest() override { return factory_(); }<br>
+<br>
+   private:<br>
+    Factory factory_;<br>
+  };<br>
+<br>
+  return internal::MakeAndRegisterTestInfo(<br>
+      test_suite_name, test_name, type_param, value_param,<br>
+      internal::CodeLocation(file, line), internal::GetTypeId<TestT>(),<br>
+      internal::SuiteApiResolver<TestT>::GetSetUpCaseOrSuite(file, line),<br>
+      internal::SuiteApiResolver<TestT>::GetTearDownCaseOrSuite(file, line),<br>
+      new FactoryImpl{std::move(factory)});<br>
+}<br>
+<br>
 }  // namespace testing<br>
<br>
 // Use this function in main() to run all tests.  It returns 0 if all<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h b/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
index 0c1105cb8eb2e..d514255c733b7 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/gtest_pred_impl.h<br>
@@ -27,11 +27,10 @@<br>
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
<br>
-// This file is AUTOMATICALLY GENERATED on 01/02/2018 by command<br>
+// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command<br>
 // 'gen_gtest_pred_impl.py 5'.  DO NOT EDIT BY HAND!<br>
 //<br>
 // Implements a family of generic predicate assertion macros.<br>
-<br>
 // GOOGLETEST_CM0001 DO NOT DELETE<br>
<br>
 #ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_<br>
@@ -67,6 +66,8 @@ namespace testing {<br>
 // We also define the EXPECT_* variations.<br>
 //<br>
 // For now we only support predicates whose arity is at most 5.<br>
+// Please email <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need<br>
+// support for higher arities.<br>
<br>
 // GTEST_ASSERT_ is the basic statement to which all of the assertions<br>
 // in this file reduce.  Don't use this in your code.<br>
@@ -89,9 +90,10 @@ AssertionResult AssertPred1Helper(const char* pred_text,<br>
                                   const T1& v1) {<br>
   if (pred(v1)) return AssertionSuccess();<br>
<br>
-  return AssertionFailure() << pred_text << "("<br>
-                            << e1 << ") evaluates to false, where"<br>
-                            << "\n" << e1 << " evaluates to " << v1;<br>
+  return AssertionFailure()<br>
+         << pred_text << "(" << e1 << ") evaluates to false, where"<br>
+         << "\n"<br>
+         << e1 << " evaluates to " << ::testing::PrintToString(v1);<br>
 }<br>
<br>
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1.<br>
@@ -133,11 +135,12 @@ AssertionResult AssertPred2Helper(const char* pred_text,<br>
                                   const T2& v2) {<br>
   if (pred(v1, v2)) return AssertionSuccess();<br>
<br>
-  return AssertionFailure() << pred_text << "("<br>
-                            << e1 << ", "<br>
-                            << e2 << ") evaluates to false, where"<br>
-                            << "\n" << e1 << " evaluates to " << v1<br>
-                            << "\n" << e2 << " evaluates to " << v2;<br>
+  return AssertionFailure()<br>
+         << pred_text << "(" << e1 << ", " << e2<br>
+         << ") evaluates to false, where"<br>
+         << "\n"<br>
+         << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+         << e2 << " evaluates to " << ::testing::PrintToString(v2);<br>
 }<br>
<br>
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2.<br>
@@ -184,13 +187,13 @@ AssertionResult AssertPred3Helper(const char* pred_text,<br>
                                   const T3& v3) {<br>
   if (pred(v1, v2, v3)) return AssertionSuccess();<br>
<br>
-  return AssertionFailure() << pred_text << "("<br>
-                            << e1 << ", "<br>
-                            << e2 << ", "<br>
-                            << e3 << ") evaluates to false, where"<br>
-                            << "\n" << e1 << " evaluates to " << v1<br>
-                            << "\n" << e2 << " evaluates to " << v2<br>
-                            << "\n" << e3 << " evaluates to " << v3;<br>
+  return AssertionFailure()<br>
+         << pred_text << "(" << e1 << ", " << e2 << ", " << e3<br>
+         << ") evaluates to false, where"<br>
+         << "\n"<br>
+         << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+         << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+         << e3 << " evaluates to " << ::testing::PrintToString(v3);<br>
 }<br>
<br>
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3.<br>
@@ -242,15 +245,14 @@ AssertionResult AssertPred4Helper(const char* pred_text,<br>
                                   const T4& v4) {<br>
   if (pred(v1, v2, v3, v4)) return AssertionSuccess();<br>
<br>
-  return AssertionFailure() << pred_text << "("<br>
-                            << e1 << ", "<br>
-                            << e2 << ", "<br>
-                            << e3 << ", "<br>
-                            << e4 << ") evaluates to false, where"<br>
-                            << "\n" << e1 << " evaluates to " << v1<br>
-                            << "\n" << e2 << " evaluates to " << v2<br>
-                            << "\n" << e3 << " evaluates to " << v3<br>
-                            << "\n" << e4 << " evaluates to " << v4;<br>
+  return AssertionFailure()<br>
+         << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4<br>
+         << ") evaluates to false, where"<br>
+         << "\n"<br>
+         << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+         << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+         << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"<br>
+         << e4 << " evaluates to " << ::testing::PrintToString(v4);<br>
 }<br>
<br>
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4.<br>
@@ -307,17 +309,15 @@ AssertionResult AssertPred5Helper(const char* pred_text,<br>
                                   const T5& v5) {<br>
   if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess();<br>
<br>
-  return AssertionFailure() << pred_text << "("<br>
-                            << e1 << ", "<br>
-                            << e2 << ", "<br>
-                            << e3 << ", "<br>
-                            << e4 << ", "<br>
-                            << e5 << ") evaluates to false, where"<br>
-                            << "\n" << e1 << " evaluates to " << v1<br>
-                            << "\n" << e2 << " evaluates to " << v2<br>
-                            << "\n" << e3 << " evaluates to " << v3<br>
-                            << "\n" << e4 << " evaluates to " << v4<br>
-                            << "\n" << e5 << " evaluates to " << v5;<br>
+  return AssertionFailure()<br>
+         << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4<br>
+         << ", " << e5 << ") evaluates to false, where"<br>
+         << "\n"<br>
+         << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n"<br>
+         << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n"<br>
+         << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n"<br>
+         << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n"<br>
+         << e5 << " evaluates to " << ::testing::PrintToString(v5);<br>
 }<br>
<br>
 // Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5.<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
index 4db41f8767356..12bb05011f96b 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-death-test-internal.h<br>
@@ -36,9 +36,11 @@<br>
 #ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_<br>
 #define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_<br>
<br>
+#include "gtest/gtest-matchers.h"<br>
 #include "gtest/internal/gtest-internal.h"<br>
<br>
 #include <stdio.h><br>
+#include <memory><br>
<br>
 namespace testing {<br>
 namespace internal {<br>
@@ -78,7 +80,7 @@ class GTEST_API_ DeathTest {<br>
   // argument is set.  If the death test should be skipped, the pointer<br>
   // is set to NULL; otherwise, it is set to the address of a new concrete<br>
   // DeathTest object that controls the execution of the current test.<br>
-  static bool Create(const char* statement, const RE* regex,<br>
+  static bool Create(const char* statement, Matcher<const std::string&> matcher,<br>
                      const char* file, int line, DeathTest** test);<br>
   DeathTest();<br>
   virtual ~DeathTest() { }<br>
@@ -144,21 +146,44 @@ GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251<br>
 class DeathTestFactory {<br>
  public:<br>
   virtual ~DeathTestFactory() { }<br>
-  virtual bool Create(const char* statement, const RE* regex,<br>
-                      const char* file, int line, DeathTest** test) = 0;<br>
+  virtual bool Create(const char* statement,<br>
+                      Matcher<const std::string&> matcher, const char* file,<br>
+                      int line, DeathTest** test) = 0;<br>
 };<br>
<br>
 // A concrete DeathTestFactory implementation for normal use.<br>
 class DefaultDeathTestFactory : public DeathTestFactory {<br>
  public:<br>
-  virtual bool Create(const char* statement, const RE* regex,<br>
-                      const char* file, int line, DeathTest** test);<br>
+  bool Create(const char* statement, Matcher<const std::string&> matcher,<br>
+              const char* file, int line, DeathTest** test) override;<br>
 };<br>
<br>
 // Returns true if exit_status describes a process that was terminated<br>
 // by a signal, or exited normally with a nonzero exit code.<br>
 GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
<br>
+// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads<br>
+// and interpreted as a regex (rather than an Eq matcher) for legacy<br>
+// compatibility.<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+    ::testing::internal::RE regex) {<br>
+  return ContainsRegex(regex.pattern());<br>
+}<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(const char* regex) {<br>
+  return ContainsRegex(regex);<br>
+}<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+    const ::std::string& regex) {<br>
+  return ContainsRegex(regex);<br>
+}<br>
+<br>
+// If a Matcher<const ::std::string&> is passed to EXPECT_DEATH (etc.), it's<br>
+// used directly.<br>
+inline Matcher<const ::std::string&> MakeDeathTestMatcher(<br>
+    Matcher<const ::std::string&> matcher) {<br>
+  return matcher;<br>
+}<br>
+<br>
 // Traps C++ exceptions escaping statement and reports them as test<br>
 // failures. Note that trapping SEH exceptions is not implemented here.<br>
 # if GTEST_HAS_EXCEPTIONS<br>
@@ -186,36 +211,36 @@ GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
<br>
 // This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*,<br>
 // ASSERT_EXIT*, and EXPECT_EXIT*.<br>
-# define GTEST_DEATH_TEST_(statement, predicate, regex, fail) \<br>
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_ \<br>
-  if (::testing::internal::AlwaysTrue()) { \<br>
-    const ::testing::internal::RE& gtest_regex = (regex); \<br>
-    ::testing::internal::DeathTest* gtest_dt; \<br>
-    if (!::testing::internal::DeathTest::Create(#statement, &gtest_regex, \<br>
-        __FILE__, __LINE__, &gtest_dt)) { \<br>
-      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
-    } \<br>
-    if (gtest_dt != NULL) { \<br>
-      ::testing::internal::scoped_ptr< ::testing::internal::DeathTest> \<br>
-          gtest_dt_ptr(gtest_dt); \<br>
-      switch (gtest_dt->AssumeRole()) { \<br>
-        case ::testing::internal::DeathTest::OVERSEE_TEST: \<br>
-          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \<br>
-            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \<br>
-          } \<br>
-          break; \<br>
-        case ::testing::internal::DeathTest::EXECUTE_TEST: { \<br>
-          ::testing::internal::DeathTest::ReturnSentinel \<br>
-              gtest_sentinel(gtest_dt); \<br>
-          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \<br>
-          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \<br>
-          break; \<br>
-        } \<br>
-      } \<br>
-    } \<br>
-  } else \<br>
-    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__): \<br>
-      fail(::testing::internal::DeathTest::LastMessage())<br>
+#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail)        \<br>
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                                \<br>
+  if (::testing::internal::AlwaysTrue()) {                                     \<br>
+    ::testing::internal::DeathTest* gtest_dt;                                  \<br>
+    if (!::testing::internal::DeathTest::Create(                               \<br>
+            #statement,                                                        \<br>
+            ::testing::internal::MakeDeathTestMatcher(regex_or_matcher),       \<br>
+            __FILE__, __LINE__, &gtest_dt)) {                                  \<br>
+      goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                        \<br>
+    }                                                                          \<br>
+    if (gtest_dt != nullptr) {                                                 \<br>
+      std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \<br>
+      switch (gtest_dt->AssumeRole()) {                                        \<br>
+        case ::testing::internal::DeathTest::OVERSEE_TEST:                     \<br>
+          if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) {                \<br>
+            goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__);                  \<br>
+          }                                                                    \<br>
+          break;                                                               \<br>
+        case ::testing::internal::DeathTest::EXECUTE_TEST: {                   \<br>
+          ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel(       \<br>
+              gtest_dt);                                                       \<br>
+          GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt);            \<br>
+          gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE);   \<br>
+          break;                                                               \<br>
+        }                                                                      \<br>
+      }                                                                        \<br>
+    }                                                                          \<br>
+  } else                                                                       \<br>
+    GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__)                                \<br>
+        : fail(::testing::internal::DeathTest::LastMessage())<br>
 // The symbol "fail" here expands to something into which a message<br>
 // can be streamed.<br>
<br>
@@ -224,14 +249,13 @@ GTEST_API_ bool ExitedUnsuccessfully(int exit_status);<br>
 // must accept a streamed message even though the message is never printed.<br>
 // The regex object is not evaluated, but it is used to prevent "unused"<br>
 // warnings and to avoid an expression that doesn't compile in debug mode.<br>
-#define GTEST_EXECUTE_STATEMENT_(statement, regex)             \<br>
-  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                \<br>
-  if (::testing::internal::AlwaysTrue()) {                     \<br>
-    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \<br>
-  } else if (!::testing::internal::AlwaysTrue()) {             \<br>
-    const ::testing::internal::RE& gtest_regex = (regex);      \<br>
-    static_cast<void>(gtest_regex);                            \<br>
-  } else                                                       \<br>
+#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher)    \<br>
+  GTEST_AMBIGUOUS_ELSE_BLOCKER_                                  \<br>
+  if (::testing::internal::AlwaysTrue()) {                       \<br>
+    GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement);   \<br>
+  } else if (!::testing::internal::AlwaysTrue()) {               \<br>
+    ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \<br>
+  } else                                                         \<br>
     ::testing::Message()<br>
<br>
 // A class representing the parsed contents of the<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
index ae38d95bf844f..c11b101516e53 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-filepath.h<br>
@@ -110,7 +110,7 @@ class GTEST_API_ FilePath {<br>
                                          const FilePath& base_name,<br>
                                          const char* extension);<br>
<br>
-  // Returns true iff the path is "".<br>
+  // Returns true if and only if the path is "".<br>
   bool IsEmpty() const { return pathname_.empty(); }<br>
<br>
   // If input name has a trailing separator character, removes it and returns<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
index b762f61fc53c3..94c816a28bdb1 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-internal.h<br>
@@ -58,6 +58,7 @@<br>
 #include <map><br>
 #include <set><br>
 #include <string><br>
+#include <type_traits><br>
 #include <vector><br>
<br>
 #include "gtest/gtest-message.h"<br>
@@ -79,7 +80,6 @@<br>
 // Stringifies its argument.<br>
 #define GTEST_STRINGIFY_(name) #name<br>
<br>
-class ProtocolMessage;<br>
 namespace proto2 { class Message; }<br>
<br>
 namespace testing {<br>
@@ -91,7 +91,7 @@ class Message;                         // Represents a failure message.<br>
 class Test;                            // Represents a test.<br>
 class TestInfo;                        // Information about a test.<br>
 class TestPartResult;                  // Result of a test part.<br>
-class UnitTest;                        // A collection of test cases.<br>
+class UnitTest;                        // A collection of test suites.<br>
<br>
 template <typename T><br>
 ::std::string PrintToString(const T& value);<br>
@@ -106,34 +106,22 @@ class UnitTestImpl;                    // Opaque implementation of UnitTest<br>
 // stack trace.<br>
 GTEST_API_ extern const char kStackTraceMarker[];<br>
<br>
-// Two overloaded helpers for checking at compile time whether an<br>
-// expression is a null pointer literal (i.e. NULL or any 0-valued<br>
-// compile-time integral constant).  Their return values have<br>
-// <br>
diff erent sizes, so we can use sizeof() to test which version is<br>
-// picked by the compiler.  These helpers have no implementations, as<br>
-// we only need their signatures.<br>
-//<br>
-// Given IsNullLiteralHelper(x), the compiler will pick the first<br>
-// version if x can be implicitly converted to Secret*, and pick the<br>
-// second version otherwise.  Since Secret is a secret and incomplete<br>
-// type, the only expression a user can write that has type Secret* is<br>
-// a null pointer literal.  Therefore, we know that x is a null<br>
-// pointer literal if and only if the first version is picked by the<br>
-// compiler.<br>
-char IsNullLiteralHelper(Secret* p);<br>
-char (&IsNullLiteralHelper(...))[2];  // NOLINT<br>
-<br>
-// A compile-time bool constant that is true if and only if x is a<br>
-// null pointer literal (i.e. NULL or any 0-valued compile-time<br>
-// integral constant).<br>
-#ifdef GTEST_ELLIPSIS_NEEDS_POD_<br>
-// We lose support for NULL detection where the compiler doesn't like<br>
-// passing non-POD classes through ellipsis (...).<br>
-# define GTEST_IS_NULL_LITERAL_(x) false<br>
-#else<br>
-# define GTEST_IS_NULL_LITERAL_(x) \<br>
-    (sizeof(::testing::internal::IsNullLiteralHelper(x)) == 1)<br>
-#endif  // GTEST_ELLIPSIS_NEEDS_POD_<br>
+// An IgnoredValue object can be implicitly constructed from ANY value.<br>
+class IgnoredValue {<br>
+  struct Sink {};<br>
+ public:<br>
+  // This constructor template allows any value to be implicitly<br>
+  // converted to IgnoredValue.  The object has no data member and<br>
+  // doesn't try to remember anything about the argument.  We<br>
+  // deliberately omit the 'explicit' keyword in order to allow the<br>
+  // conversion to be implicit.<br>
+  // Disable the conversion if T already has a magical conversion operator.<br>
+  // Otherwise we get ambiguity.<br>
+  template <typename T,<br>
+            typename std::enable_if<!std::is_convertible<T, Sink>::value,<br>
+                                    int>::type = 0><br>
+  IgnoredValue(const T& /* ignored */) {}  // NOLINT(runtime/explicit)<br>
+};<br>
<br>
 // Appends the user-supplied message to the Google-Test-generated message.<br>
 GTEST_API_ std::string AppendUserMessage(<br>
@@ -201,7 +189,7 @@ GTEST_API_ std::string DiffStrings(const std::string& left,<br>
 //   expected_value:      "5"<br>
 //   actual_value:        "6"<br>
 //<br>
-// The ignoring_case parameter is true iff the assertion is a<br>
+// The ignoring_case parameter is true if and only if the assertion is a<br>
 // *_STRCASEEQ*.  When it's true, the string " (ignoring case)" will<br>
 // be inserted into the message.<br>
 GTEST_API_ AssertionResult EqFailure(const char* expected_expression,<br>
@@ -330,15 +318,15 @@ class FloatingPoint {<br>
   // Returns the sign bit of this number.<br>
   Bits sign_bit() const { return kSignBitMask & u_.bits_; }<br>
<br>
-  // Returns true iff this is NAN (not a number).<br>
+  // Returns true if and only if this is NAN (not a number).<br>
   bool is_nan() const {<br>
     // It's a NAN if the exponent bits are all ones and the fraction<br>
     // bits are not entirely zeros.<br>
     return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0);<br>
   }<br>
<br>
-  // Returns true iff this number is at most kMaxUlps ULP's away from<br>
-  // rhs.  In particular, this function:<br>
+  // Returns true if and only if this number is at most kMaxUlps ULP's away<br>
+  // from rhs.  In particular, this function:<br>
   //<br>
   //   - returns false if either number is (or both are) NAN.<br>
   //   - treats really large numbers as almost equal to infinity.<br>
@@ -409,7 +397,7 @@ typedef FloatingPoint<float> Float;<br>
 typedef FloatingPoint<double> Double;<br>
<br>
 // In order to catch the mistake of putting tests that use <br>
diff erent<br>
-// test fixture classes in the same test case, we need to assign<br>
+// test fixture classes in the same test suite, we need to assign<br>
 // unique IDs to fixture classes and compare them.  The TypeId type is<br>
 // used to hold such IDs.  The user should treat TypeId as an opaque<br>
 // type: the only operation allowed on TypeId values is to compare<br>
@@ -469,7 +457,7 @@ class TestFactoryBase {<br>
 template <class TestClass><br>
 class TestFactoryImpl : public TestFactoryBase {<br>
  public:<br>
-  virtual Test* CreateTest() { return new TestClass; }<br>
+  Test* CreateTest() override { return new TestClass; }<br>
 };<br>
<br>
 #if GTEST_OS_WINDOWS<br>
@@ -485,9 +473,9 @@ GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr,<br>
<br>
 #endif  // GTEST_OS_WINDOWS<br>
<br>
-// Types of SetUpTestCase() and TearDownTestCase() functions.<br>
-typedef void (*SetUpTestCaseFunc)();<br>
-typedef void (*TearDownTestCaseFunc)();<br>
+// Types of SetUpTestSuite() and TearDownTestSuite() functions.<br>
+using SetUpTestSuiteFunc = void (*)();<br>
+using TearDownTestSuiteFunc = void (*)();<br>
<br>
 struct CodeLocation {<br>
   CodeLocation(const std::string& a_file, int a_line)<br>
@@ -497,12 +485,64 @@ struct CodeLocation {<br>
   int line;<br>
 };<br>
<br>
+//  Helper to identify which setup function for TestCase / TestSuite to call.<br>
+//  Only one function is allowed, either TestCase or TestSute but not both.<br>
+<br>
+// Utility functions to help SuiteApiResolver<br>
+using SetUpTearDownSuiteFuncType = void (*)();<br>
+<br>
+inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull(<br>
+    SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) {<br>
+  return a == def ? nullptr : a;<br>
+}<br>
+<br>
+template <typename T><br>
+//  Note that SuiteApiResolver inherits from T because<br>
+//  SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way<br>
+//  SuiteApiResolver can access them.<br>
+struct SuiteApiResolver : T {<br>
+  // testing::Test is only forward declared at this point. So we make it a<br>
+  // dependend class for the compiler to be OK with it.<br>
+  using Test =<br>
+      typename std::conditional<sizeof(T) != 0, ::testing::Test, void>::type;<br>
+<br>
+  static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename,<br>
+                                                        int line_num) {<br>
+    SetUpTearDownSuiteFuncType test_case_fp =<br>
+        GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase);<br>
+    SetUpTearDownSuiteFuncType test_suite_fp =<br>
+        GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite);<br>
+<br>
+    GTEST_CHECK_(!test_case_fp || !test_suite_fp)<br>
+        << "Test can not provide both SetUpTestSuite and SetUpTestCase, please "<br>
+           "make sure there is only one present at "<br>
+        << filename << ":" << line_num;<br>
+<br>
+    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;<br>
+  }<br>
+<br>
+  static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename,<br>
+                                                           int line_num) {<br>
+    SetUpTearDownSuiteFuncType test_case_fp =<br>
+        GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase);<br>
+    SetUpTearDownSuiteFuncType test_suite_fp =<br>
+        GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite);<br>
+<br>
+    GTEST_CHECK_(!test_case_fp || !test_suite_fp)<br>
+        << "Test can not provide both TearDownTestSuite and TearDownTestCase,"<br>
+           " please make sure there is only one present at"<br>
+        << filename << ":" << line_num;<br>
+<br>
+    return test_case_fp != nullptr ? test_case_fp : test_suite_fp;<br>
+  }<br>
+};<br>
+<br>
 // Creates a new TestInfo object and registers it with Google Test;<br>
 // returns the created object.<br>
 //<br>
 // Arguments:<br>
 //<br>
-//   test_case_name:   name of the test case<br>
+//   test_suite_name:   name of the test suite<br>
 //   name:             name of the test<br>
 //   type_param        the name of the test's type parameter, or NULL if<br>
 //                     this is not a typed or a type-parameterized test.<br>
@@ -510,21 +550,16 @@ struct CodeLocation {<br>
 //                     or NULL if this is not a type-parameterized test.<br>
 //   code_location:    code location where the test is defined<br>
 //   fixture_class_id: ID of the test fixture class<br>
-//   set_up_tc:        pointer to the function that sets up the test case<br>
-//   tear_down_tc:     pointer to the function that tears down the test case<br>
+//   set_up_tc:        pointer to the function that sets up the test suite<br>
+//   tear_down_tc:     pointer to the function that tears down the test suite<br>
 //   factory:          pointer to the factory that creates a test object.<br>
 //                     The newly created TestInfo instance will assume<br>
 //                     ownership of the factory object.<br>
 GTEST_API_ TestInfo* MakeAndRegisterTestInfo(<br>
-    const char* test_case_name,<br>
-    const char* name,<br>
-    const char* type_param,<br>
-    const char* value_param,<br>
-    CodeLocation code_location,<br>
-    TypeId fixture_class_id,<br>
-    SetUpTestCaseFunc set_up_tc,<br>
-    TearDownTestCaseFunc tear_down_tc,<br>
-    TestFactoryBase* factory);<br>
+    const char* test_suite_name, const char* name, const char* type_param,<br>
+    const char* value_param, CodeLocation code_location,<br>
+    TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,<br>
+    TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory);<br>
<br>
 // If *pstr starts with the given prefix, modifies *pstr to be right<br>
 // past the prefix and returns true; otherwise leaves *pstr unchanged<br>
@@ -536,19 +571,20 @@ GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr);<br>
 GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \<br>
 /* class A needs to have dll-interface to be used by clients of class B */)<br>
<br>
-// State of the definition of a type-parameterized test case.<br>
-class GTEST_API_ TypedTestCasePState {<br>
+// State of the definition of a type-parameterized test suite.<br>
+class GTEST_API_ TypedTestSuitePState {<br>
  public:<br>
-  TypedTestCasePState() : registered_(false) {}<br>
+  TypedTestSuitePState() : registered_(false) {}<br>
<br>
   // Adds the given test name to defined_test_names_ and return true<br>
-  // if the test case hasn't been registered; otherwise aborts the<br>
+  // if the test suite hasn't been registered; otherwise aborts the<br>
   // program.<br>
   bool AddTestName(const char* file, int line, const char* case_name,<br>
                    const char* test_name) {<br>
     if (registered_) {<br>
-      fprintf(stderr, "%s Test %s must be defined before "<br>
-              "REGISTER_TYPED_TEST_CASE_P(%s, ...).\n",<br>
+      fprintf(stderr,<br>
+              "%s Test %s must be defined before "<br>
+              "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n",<br>
               FormatFileLocation(file, line).c_str(), test_name, case_name);<br>
       fflush(stderr);<br>
       posix::Abort();<br>
@@ -581,14 +617,19 @@ class GTEST_API_ TypedTestCasePState {<br>
   RegisteredTestsMap registered_tests_;<br>
 };<br>
<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+using TypedTestCasePState = TypedTestSuitePState;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
 GTEST_DISABLE_MSC_WARNINGS_POP_()  //  4251<br>
<br>
 // Skips to the first non-space char after the first comma in 'str';<br>
 // returns NULL if no comma is found in 'str'.<br>
 inline const char* SkipComma(const char* str) {<br>
   const char* comma = strchr(str, ',');<br>
-  if (comma == NULL) {<br>
-    return NULL;<br>
+  if (comma == nullptr) {<br>
+    return nullptr;<br>
   }<br>
   while (IsSpace(*(++comma))) {}<br>
   return comma;<br>
@@ -598,7 +639,7 @@ inline const char* SkipComma(const char* str) {<br>
 // the entire string if it contains no comma.<br>
 inline std::string GetPrefixUntilComma(const char* str) {<br>
   const char* comma = strchr(str, ',');<br>
-  return comma == NULL ? str : std::string(str, comma);<br>
+  return comma == nullptr ? str : std::string(str, comma);<br>
 }<br>
<br>
 // Splits a given string on a given delimiter, populating a given<br>
@@ -648,7 +689,7 @@ template <GTEST_TEMPLATE_ Fixture, class TestSel, typename Types><br>
 class TypeParameterizedTest {<br>
  public:<br>
   // 'index' is the index of the test in the type list 'Types'<br>
-  // specified in INSTANTIATE_TYPED_TEST_CASE_P(Prefix, TestCase,<br>
+  // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite,<br>
   // Types).  Valid values for 'index' are [0, N - 1] where N is the<br>
   // length of Types.<br>
   static bool Register(const char* prefix, const CodeLocation& code_location,<br>
@@ -663,13 +704,17 @@ class TypeParameterizedTest {<br>
     // list.<br>
     MakeAndRegisterTestInfo(<br>
         (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name +<br>
-         "/" + type_names[index])<br>
+         "/" + type_names[static_cast<size_t>(index)])<br>
             .c_str(),<br>
         StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),<br>
         GetTypeName<Type>().c_str(),<br>
-        NULL,  // No value parameter.<br>
-        code_location, GetTypeId<FixtureClass>(), TestClass::SetUpTestCase,<br>
-        TestClass::TearDownTestCase, new TestFactoryImpl<TestClass>);<br>
+        nullptr,  // No value parameter.<br>
+        code_location, GetTypeId<FixtureClass>(),<br>
+        SuiteApiResolver<TestClass>::GetSetUpCaseOrSuite(<br>
+            code_location.file.c_str(), code_location.line),<br>
+        SuiteApiResolver<TestClass>::GetTearDownCaseOrSuite(<br>
+            code_location.file.c_str(), code_location.line),<br>
+        new TestFactoryImpl<TestClass>);<br>
<br>
     // Next, recurses (at compile time) with the tail of the type list.<br>
     return TypeParameterizedTest<Fixture, TestSel,<br>
@@ -695,15 +740,15 @@ class TypeParameterizedTest<Fixture, TestSel, Types0> {<br>
   }<br>
 };<br>
<br>
-// TypeParameterizedTestCase<Fixture, Tests, Types>::Register()<br>
+// TypeParameterizedTestSuite<Fixture, Tests, Types>::Register()<br>
 // registers *all combinations* of 'Tests' and 'Types' with Google<br>
 // Test.  The return value is insignificant - we just need to return<br>
 // something such that we can call this function in a namespace scope.<br>
 template <GTEST_TEMPLATE_ Fixture, typename Tests, typename Types><br>
-class TypeParameterizedTestCase {<br>
+class TypeParameterizedTestSuite {<br>
  public:<br>
   static bool Register(const char* prefix, CodeLocation code_location,<br>
-                       const TypedTestCasePState* state, const char* case_name,<br>
+                       const TypedTestSuitePState* state, const char* case_name,<br>
                        const char* test_names,<br>
                        const std::vector<std::string>& type_names =<br>
                            GenerateNames<DefaultNameGenerator, Types>()) {<br>
@@ -726,20 +771,20 @@ class TypeParameterizedTestCase {<br>
         prefix, test_location, case_name, test_names, 0, type_names);<br>
<br>
     // Next, recurses (at compile time) with the tail of the test list.<br>
-    return TypeParameterizedTestCase<Fixture, typename Tests::Tail,<br>
-                                     Types>::Register(prefix, code_location,<br>
-                                                      state, case_name,<br>
-                                                      SkipComma(test_names),<br>
-                                                      type_names);<br>
+    return TypeParameterizedTestSuite<Fixture, typename Tests::Tail,<br>
+                                      Types>::Register(prefix, code_location,<br>
+                                                       state, case_name,<br>
+                                                       SkipComma(test_names),<br>
+                                                       type_names);<br>
   }<br>
 };<br>
<br>
 // The base case for the compile time recursion.<br>
 template <GTEST_TEMPLATE_ Fixture, typename Types><br>
-class TypeParameterizedTestCase<Fixture, Templates0, Types> {<br>
+class TypeParameterizedTestSuite<Fixture, Templates0, Types> {<br>
  public:<br>
   static bool Register(const char* /*prefix*/, const CodeLocation&,<br>
-                       const TypedTestCasePState* /*state*/,<br>
+                       const TypedTestSuitePState* /*state*/,<br>
                        const char* /*case_name*/, const char* /*test_names*/,<br>
                        const std::vector<std::string>& =<br>
                            std::vector<std::string>() /*type_names*/) {<br>
@@ -802,120 +847,16 @@ class GTEST_API_ Random {<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(Random);<br>
 };<br>
<br>
-// Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a<br>
-// compiler error iff T1 and T2 are <br>
diff erent types.<br>
-template <typename T1, typename T2><br>
-struct CompileAssertTypesEqual;<br>
-<br>
-template <typename T><br>
-struct CompileAssertTypesEqual<T, T> {<br>
-};<br>
-<br>
-// Removes the reference from a type if it is a reference type,<br>
-// otherwise leaves it unchanged.  This is the same as<br>
-// tr1::remove_reference, which is not widely available yet.<br>
-template <typename T><br>
-struct RemoveReference { typedef T type; };  // NOLINT<br>
-template <typename T><br>
-struct RemoveReference<T&> { typedef T type; };  // NOLINT<br>
-<br>
-// A handy wrapper around RemoveReference that works when the argument<br>
-// T depends on template parameters.<br>
-#define GTEST_REMOVE_REFERENCE_(T) \<br>
-    typename ::testing::internal::RemoveReference<T>::type<br>
-<br>
-// Removes const from a type if it is a const type, otherwise leaves<br>
-// it unchanged.  This is the same as tr1::remove_const, which is not<br>
-// widely available yet.<br>
-template <typename T><br>
-struct RemoveConst { typedef T type; };  // NOLINT<br>
-template <typename T><br>
-struct RemoveConst<const T> { typedef T type; };  // NOLINT<br>
-<br>
-// MSVC 8.0, Sun C++, and IBM XL C++ have a bug which causes the above<br>
-// definition to fail to remove the const in 'const int[3]' and 'const<br>
-// char[3][4]'.  The following specialization works around the bug.<br>
-template <typename T, size_t N><br>
-struct RemoveConst<const T[N]> {<br>
-  typedef typename RemoveConst<T>::type type[N];<br>
-};<br>
-<br>
-#if defined(_MSC_VER) && _MSC_VER < 1400<br>
-// This is the only specialization that allows VC++ 7.1 to remove const in<br>
-// 'const int[3] and 'const int[3][4]'.  However, it causes trouble with GCC<br>
-// and thus needs to be conditionally compiled.<br>
-template <typename T, size_t N><br>
-struct RemoveConst<T[N]> {<br>
-  typedef typename RemoveConst<T>::type type[N];<br>
-};<br>
-#endif<br>
-<br>
-// A handy wrapper around RemoveConst that works when the argument<br>
-// T depends on template parameters.<br>
-#define GTEST_REMOVE_CONST_(T) \<br>
-    typename ::testing::internal::RemoveConst<T>::type<br>
-<br>
 // Turns const U&, U&, const U, and U all into U.<br>
 #define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \<br>
-    GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T))<br>
-<br>
-// ImplicitlyConvertible<From, To>::value is a compile-time bool<br>
-// constant that's true iff type From can be implicitly converted to<br>
-// type To.<br>
-template <typename From, typename To><br>
-class ImplicitlyConvertible {<br>
- private:<br>
-  // We need the following helper functions only for their types.<br>
-  // They have no implementations.<br>
-<br>
-  // MakeFrom() is an expression whose type is From.  We cannot simply<br>
-  // use From(), as the type From may not have a public default<br>
-  // constructor.<br>
-  static typename AddReference<From>::type MakeFrom();<br>
-<br>
-  // These two functions are overloaded.  Given an expression<br>
-  // Helper(x), the compiler will pick the first version if x can be<br>
-  // implicitly converted to type To; otherwise it will pick the<br>
-  // second version.<br>
-  //<br>
-  // The first version returns a value of size 1, and the second<br>
-  // version returns a value of size 2.  Therefore, by checking the<br>
-  // size of Helper(x), which can be done at compile time, we can tell<br>
-  // which version of Helper() is used, and hence whether x can be<br>
-  // implicitly converted to type To.<br>
-  static char Helper(To);<br>
-  static char (&Helper(...))[2];  // NOLINT<br>
-<br>
-  // We have to put the 'public' section after the 'private' section,<br>
-  // or MSVC refuses to compile the code.<br>
- public:<br>
-#if defined(__BORLANDC__)<br>
-  // C++Builder cannot use member overload resolution during template<br>
-  // instantiation.  The simplest workaround is to use its C++0x type traits<br>
-  // functions (C++Builder 2009 and above only).<br>
-  static const bool value = __is_convertible(From, To);<br>
-#else<br>
-  // MSVC warns about implicitly converting from double to int for<br>
-  // possible loss of data, so we need to temporarily disable the<br>
-  // warning.<br>
-  GTEST_DISABLE_MSC_WARNINGS_PUSH_(4244)<br>
-  static const bool value =<br>
-      sizeof(Helper(ImplicitlyConvertible::MakeFrom())) == 1;<br>
-  GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
-#endif  // __BORLANDC__<br>
-};<br>
-template <typename From, typename To><br>
-const bool ImplicitlyConvertible<From, To>::value;<br>
+  typename std::remove_const<typename std::remove_reference<T>::type>::type<br>
<br>
 // IsAProtocolMessage<T>::value is a compile-time bool constant that's<br>
-// true iff T is type ProtocolMessage, proto2::Message, or a subclass<br>
-// of those.<br>
+// true if and only if T is type proto2::Message or a subclass of it.<br>
 template <typename T><br>
 struct IsAProtocolMessage<br>
     : public bool_constant<<br>
-  ImplicitlyConvertible<const T*, const ::ProtocolMessage*>::value ||<br>
-  ImplicitlyConvertible<const T*, const ::proto2::Message*>::value> {<br>
-};<br>
+          std::is_convertible<const T*, const ::proto2::Message*>::value> {};<br>
<br>
 // When the compiler sees expression IsContainerTest<C>(0), if C is an<br>
 // STL-style container class, the first overload of IsContainerTest<br>
@@ -942,7 +883,6 @@ struct IsAProtocolMessage<br>
 // IsContainerTest(typename C::const_iterator*) and<br>
 // IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++.<br>
 typedef int IsContainer;<br>
-#if GTEST_LANG_CXX11<br>
 template <class C,<br>
           class Iterator = decltype(::std::declval<const C&>().begin()),<br>
           class = decltype(::std::declval<const C&>().end()),<br>
@@ -952,14 +892,6 @@ template <class C,<br>
 IsContainer IsContainerTest(int /* dummy */) {<br>
   return 0;<br>
 }<br>
-#else<br>
-template <class C><br>
-IsContainer IsContainerTest(int /* dummy */,<br>
-                            typename C::iterator* /* it */ = NULL,<br>
-                            typename C::const_iterator* /* const_it */ = NULL) {<br>
-  return 0;<br>
-}<br>
-#endif  // GTEST_LANG_CXX11<br>
<br>
 typedef char IsNotContainer;<br>
 template <class C><br>
@@ -980,47 +912,30 @@ struct IsHashTable {<br>
   static char test(...);<br>
<br>
  public:<br>
-  static const bool value = sizeof(test<T>(0, 0)) == sizeof(int);<br>
+  static const bool value = sizeof(test<T>(nullptr, nullptr)) == sizeof(int);<br>
 };<br>
<br>
 template <typename T><br>
 const bool IsHashTable<T>::value;<br>
<br>
-template<typename T><br>
-struct VoidT {<br>
-    typedef void value_type;<br>
-};<br>
-<br>
-template <typename T, typename = void><br>
-struct HasValueType : false_type {};<br>
-template <typename T><br>
-struct HasValueType<T, VoidT<typename T::value_type> > : true_type {<br>
-};<br>
-<br>
 template <typename C,<br>
-          bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer),<br>
-          bool = HasValueType<C>::value><br>
+          bool = sizeof(IsContainerTest<C>(0)) == sizeof(IsContainer)><br>
 struct IsRecursiveContainerImpl;<br>
<br>
-template <typename C, bool HV><br>
-struct IsRecursiveContainerImpl<C, false, HV> : public false_type {};<br>
+template <typename C><br>
+struct IsRecursiveContainerImpl<C, false> : public std::false_type {};<br>
<br>
 // Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to<br>
 // obey the same inconsistencies as the IsContainerTest, namely check if<br>
 // something is a container is relying on only const_iterator in C++11 and<br>
 // is relying on both const_iterator and iterator otherwise<br>
 template <typename C><br>
-struct IsRecursiveContainerImpl<C, true, false> : public false_type {};<br>
-<br>
-template <typename C><br>
-struct IsRecursiveContainerImpl<C, true, true> {<br>
-  #if GTEST_LANG_CXX11<br>
-  typedef typename IteratorTraits<typename C::const_iterator>::value_type<br>
-      value_type;<br>
-#else<br>
-  typedef typename IteratorTraits<typename C::iterator>::value_type value_type;<br>
-#endif<br>
-  typedef is_same<value_type, C> type;<br>
+struct IsRecursiveContainerImpl<C, true> {<br>
+  using value_type = decltype(*std::declval<typename C::const_iterator>());<br>
+  using type =<br>
+      std::is_same<typename std::remove_const<<br>
+                       typename std::remove_reference<value_type>::type>::type,<br>
+                   C>;<br>
 };<br>
<br>
 // IsRecursiveContainer<Type> is a unary compile-time predicate that<br>
@@ -1032,13 +947,6 @@ struct IsRecursiveContainerImpl<C, true, true> {<br>
 template <typename C><br>
 struct IsRecursiveContainer : public IsRecursiveContainerImpl<C>::type {};<br>
<br>
-// EnableIf<condition>::type is void when 'Cond' is true, and<br>
-// undefined when 'Cond' is false.  To use SFINAE to make a function<br>
-// overload only apply when a particular expression is true, add<br>
-// "typename EnableIf<expression>::type* = 0" as the last parameter.<br>
-template<bool> struct EnableIf;<br>
-template<> struct EnableIf<true> { typedef void type; };  // NOLINT<br>
-<br>
 // Utilities for native arrays.<br>
<br>
 // ArrayEq() compares two k-dimensional native arrays using the<br>
@@ -1161,10 +1069,9 @@ class NativeArray {<br>
   }<br>
<br>
  private:<br>
-  enum {<br>
-    kCheckTypeIsNotConstOrAReference = StaticAssertTypeEqHelper<<br>
-        Element, GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>::value<br>
-  };<br>
+  static_assert(!std::is_const<Element>::value, "Type must not be const");<br>
+  static_assert(!std::is_reference<Element>::value,<br>
+                "Type must not be a reference");<br>
<br>
   // Initializes this object with a copy of the input.<br>
   void InitCopy(const Element* array, size_t a_size) {<br>
@@ -1189,6 +1096,139 @@ class NativeArray {<br>
   GTEST_DISALLOW_ASSIGN_(NativeArray);<br>
 };<br>
<br>
+// Backport of std::index_sequence.<br>
+template <size_t... Is><br>
+struct IndexSequence {<br>
+  using type = IndexSequence;<br>
+};<br>
+<br>
+// Double the IndexSequence, and one if plus_one is true.<br>
+template <bool plus_one, typename T, size_t sizeofT><br>
+struct DoubleSequence;<br>
+template <size_t... I, size_t sizeofT><br>
+struct DoubleSequence<true, IndexSequence<I...>, sizeofT> {<br>
+  using type = IndexSequence<I..., (sizeofT + I)..., 2 * sizeofT>;<br>
+};<br>
+template <size_t... I, size_t sizeofT><br>
+struct DoubleSequence<false, IndexSequence<I...>, sizeofT> {<br>
+  using type = IndexSequence<I..., (sizeofT + I)...>;<br>
+};<br>
+<br>
+// Backport of std::make_index_sequence.<br>
+// It uses O(ln(N)) instantiation depth.<br>
+template <size_t N><br>
+struct MakeIndexSequence<br>
+    : DoubleSequence<N % 2 == 1, typename MakeIndexSequence<N / 2>::type,<br>
+                     N / 2>::type {};<br>
+<br>
+template <><br>
+struct MakeIndexSequence<0> : IndexSequence<> {};<br>
+<br>
+// FIXME: This implementation of ElemFromList is O(1) in instantiation depth,<br>
+// but it is O(N^2) in total instantiations. Not sure if this is the best<br>
+// tradeoff, as it will make it somewhat slow to compile.<br>
+template <typename T, size_t, size_t><br>
+struct ElemFromListImpl {};<br>
+<br>
+template <typename T, size_t I><br>
+struct ElemFromListImpl<T, I, I> {<br>
+  using type = T;<br>
+};<br>
+<br>
+// Get the Nth element from T...<br>
+// It uses O(1) instantiation depth.<br>
+template <size_t N, typename I, typename... T><br>
+struct ElemFromList;<br>
+<br>
+template <size_t N, size_t... I, typename... T><br>
+struct ElemFromList<N, IndexSequence<I...>, T...><br>
+    : ElemFromListImpl<T, N, I>... {};<br>
+<br>
+template <typename... T><br>
+class FlatTuple;<br>
+<br>
+template <typename Derived, size_t I><br>
+struct FlatTupleElemBase;<br>
+<br>
+template <typename... T, size_t I><br>
+struct FlatTupleElemBase<FlatTuple<T...>, I> {<br>
+  using value_type =<br>
+      typename ElemFromList<I, typename MakeIndexSequence<sizeof...(T)>::type,<br>
+                            T...>::type;<br>
+  FlatTupleElemBase() = default;<br>
+  explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {}<br>
+  value_type value;<br>
+};<br>
+<br>
+template <typename Derived, typename Idx><br>
+struct FlatTupleBase;<br>
+<br>
+template <size_t... Idx, typename... T><br>
+struct FlatTupleBase<FlatTuple<T...>, IndexSequence<Idx...>><br>
+    : FlatTupleElemBase<FlatTuple<T...>, Idx>... {<br>
+  using Indices = IndexSequence<Idx...>;<br>
+  FlatTupleBase() = default;<br>
+  explicit FlatTupleBase(T... t)<br>
+      : FlatTupleElemBase<FlatTuple<T...>, Idx>(std::move(t))... {}<br>
+};<br>
+<br>
+// Analog to std::tuple but with <br>
diff erent tradeoffs.<br>
+// This class minimizes the template instantiation depth, thus allowing more<br>
+// elements that std::tuple would. std::tuple has been seen to require an<br>
+// instantiation depth of more than 10x the number of elements in some<br>
+// implementations.<br>
+// FlatTuple and ElemFromList are not recursive and have a fixed depth<br>
+// regardless of T...<br>
+// MakeIndexSequence, on the other hand, it is recursive but with an<br>
+// instantiation depth of O(ln(N)).<br>
+template <typename... T><br>
+class FlatTuple<br>
+    : private FlatTupleBase<FlatTuple<T...>,<br>
+                            typename MakeIndexSequence<sizeof...(T)>::type> {<br>
+  using Indices = typename FlatTuple::FlatTupleBase::Indices;<br>
+<br>
+ public:<br>
+  FlatTuple() = default;<br>
+  explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {}<br>
+<br>
+  template <size_t I><br>
+  const typename ElemFromList<I, Indices, T...>::type& Get() const {<br>
+    return static_cast<const FlatTupleElemBase<FlatTuple, I>*>(this)->value;<br>
+  }<br>
+<br>
+  template <size_t I><br>
+  typename ElemFromList<I, Indices, T...>::type& Get() {<br>
+    return static_cast<FlatTupleElemBase<FlatTuple, I>*>(this)->value;<br>
+  }<br>
+};<br>
+<br>
+// Utility functions to be called with static_assert to induce deprecation<br>
+// warnings.<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+    "INSTANTIATE_TEST_CASE_P is deprecated, please use "<br>
+    "INSTANTIATE_TEST_SUITE_P")<br>
+constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+    "TYPED_TEST_CASE_P is deprecated, please use "<br>
+    "TYPED_TEST_SUITE_P")<br>
+constexpr bool TypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+    "TYPED_TEST_CASE is deprecated, please use "<br>
+    "TYPED_TEST_SUITE")<br>
+constexpr bool TypedTestCaseIsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+    "REGISTER_TYPED_TEST_CASE_P is deprecated, please use "<br>
+    "REGISTER_TYPED_TEST_SUITE_P")<br>
+constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
+GTEST_INTERNAL_DEPRECATED(<br>
+    "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use "<br>
+    "INSTANTIATE_TYPED_TEST_SUITE_P")<br>
+constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; }<br>
+<br>
 }  // namespace internal<br>
 }  // namespace testing<br>
<br>
@@ -1208,7 +1248,10 @@ class NativeArray {<br>
 #define GTEST_SUCCESS_(message) \<br>
   GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess)<br>
<br>
-// Suppress MSVC warning 4702 (unreachable code) for the code following<br>
+#define GTEST_SKIP_(message) \<br>
+  return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip)<br>
+<br>
+// Suppress MSVC warning 4072 (unreachable code) for the code following<br>
 // statement if it returns or throws (or doesn't return or throw in some<br>
 // situations).<br>
 #define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \<br>
@@ -1300,31 +1343,38 @@ class NativeArray {<br>
            "  Actual: it does.")<br>
<br>
 // Expands to the name of the class that implements the given test.<br>
-#define GTEST_TEST_CLASS_NAME_(test_case_name, test_name) \<br>
-  test_case_name##_##test_name##_Test<br>
+#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \<br>
+  test_suite_name##_##test_name##_Test<br>
<br>
 // Helper macro for defining tests.<br>
-#define GTEST_TEST_(test_case_name, test_name, parent_class, parent_id)\<br>
-class GTEST_TEST_CLASS_NAME_(test_case_name, test_name) : public parent_class {\<br>
- public:\<br>
-  GTEST_TEST_CLASS_NAME_(test_case_name, test_name)() {}\<br>
- private:\<br>
-  virtual void TestBody();\<br>
-  static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;\<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(\<br>
-      GTEST_TEST_CLASS_NAME_(test_case_name, test_name));\<br>
-};\<br>
-\<br>
-::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_case_name, test_name)\<br>
-  ::test_info_ =\<br>
-    ::testing::internal::MakeAndRegisterTestInfo(\<br>
-        #test_case_name, #test_name, NULL, NULL, \<br>
-        ::testing::internal::CodeLocation(__FILE__, __LINE__), \<br>
-        (parent_id), \<br>
-        parent_class::SetUpTestCase, \<br>
-        parent_class::TearDownTestCase, \<br>
-        new ::testing::internal::TestFactoryImpl<\<br>
-            GTEST_TEST_CLASS_NAME_(test_case_name, test_name)>);\<br>
-void GTEST_TEST_CLASS_NAME_(test_case_name, test_name)::TestBody()<br>
+#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id)      \<br>
+  static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1,                \<br>
+                "test_suite_name must not be empty");                         \<br>
+  static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1,                      \<br>
+                "test_name must not be empty");                               \<br>
+  class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)                    \<br>
+      : public parent_class {                                                 \<br>
+   public:                                                                    \<br>
+    GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {}                   \<br>
+                                                                              \<br>
+   private:                                                                   \<br>
+    virtual void TestBody();                                                  \<br>
+    static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_;     \<br>
+    GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name,   \<br>
+                                                           test_name));       \<br>
+  };                                                                          \<br>
+                                                                              \<br>
+  ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name,          \<br>
+                                                    test_name)::test_info_ =  \<br>
+      ::testing::internal::MakeAndRegisterTestInfo(                           \<br>
+          #test_suite_name, #test_name, nullptr, nullptr,                     \<br>
+          ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \<br>
+          ::testing::internal::SuiteApiResolver<                              \<br>
+              parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__),         \<br>
+          ::testing::internal::SuiteApiResolver<                              \<br>
+              parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__),      \<br>
+          new ::testing::internal::TestFactoryImpl<GTEST_TEST_CLASS_NAME_(    \<br>
+              test_suite_name, test_name)>);                                  \<br>
+  void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody()<br>
<br>
 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
deleted file mode 100644<br>
index 082b87289ae17..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-linked_ptr.h<br>
+++ /dev/null<br>
@@ -1,243 +0,0 @@<br>
-// Copyright 2003 Google Inc.<br>
-// All rights reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-//     * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-//     * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-//     * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-//<br>
-// A "smart" pointer type with reference tracking.  Every pointer to a<br>
-// particular object is kept on a circular linked list.  When the last pointer<br>
-// to an object is destroyed or reassigned, the object is deleted.<br>
-//<br>
-// Used properly, this deletes the object when the last reference goes away.<br>
-// There are several caveats:<br>
-// - Like all reference counting schemes, cycles lead to leaks.<br>
-// - Each smart pointer is actually two pointers (8 bytes instead of 4).<br>
-// - Every time a pointer is assigned, the entire list of pointers to that<br>
-//   object is traversed.  This class is therefore NOT SUITABLE when there<br>
-//   will often be more than two or three pointers to a particular object.<br>
-// - References are only tracked as long as linked_ptr<> objects are copied.<br>
-//   If a linked_ptr<> is converted to a raw pointer and back, BAD THINGS<br>
-//   will happen (double deletion).<br>
-//<br>
-// A good use of this class is storing object references in STL containers.<br>
-// You can safely put linked_ptr<> in a vector<>.<br>
-// Other uses may not be as good.<br>
-//<br>
-// Note: If you use an incomplete type with linked_ptr<>, the class<br>
-// *containing* linked_ptr<> must have a constructor and destructor (even<br>
-// if they do nothing!).<br>
-//<br>
-// Bill Gibbons suggested we use something like this.<br>
-//<br>
-// Thread Safety:<br>
-//   Unlike other linked_ptr implementations, in this implementation<br>
-//   a linked_ptr object is thread-safe in the sense that:<br>
-//     - it's safe to copy linked_ptr objects concurrently,<br>
-//     - it's safe to copy *from* a linked_ptr and read its underlying<br>
-//       raw pointer (e.g. via get()) concurrently, and<br>
-//     - it's safe to write to two linked_ptrs that point to the same<br>
-//       shared object concurrently.<br>
-// FIXME: rename this to safe_linked_ptr to avoid<br>
-// confusion with normal linked_ptr.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
-<br>
-#include <stdlib.h><br>
-#include <assert.h><br>
-<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-namespace testing {<br>
-namespace internal {<br>
-<br>
-// Protects copying of all linked_ptr objects.<br>
-GTEST_API_ GTEST_DECLARE_STATIC_MUTEX_(g_linked_ptr_mutex);<br>
-<br>
-// This is used internally by all instances of linked_ptr<>.  It needs to be<br>
-// a non-template class because <br>
diff erent types of linked_ptr<> can refer to<br>
-// the same object (linked_ptr<Superclass>(obj) vs linked_ptr<Subclass>(obj)).<br>
-// So, it needs to be possible for <br>
diff erent types of linked_ptr to participate<br>
-// in the same circular linked list, so we need a single class type here.<br>
-//<br>
-// DO NOT USE THIS CLASS DIRECTLY YOURSELF.  Use linked_ptr<T>.<br>
-class linked_ptr_internal {<br>
- public:<br>
-  // Create a new circle that includes only this instance.<br>
-  void join_new() {<br>
-    next_ = this;<br>
-  }<br>
-<br>
-  // Many linked_ptr operations may change p.link_ for some linked_ptr<br>
-  // variable p in the same circle as this object.  Therefore we need<br>
-  // to prevent two such operations from occurring concurrently.<br>
-  //<br>
-  // Note that <br>
diff erent types of linked_ptr objects can coexist in a<br>
-  // circle (e.g. linked_ptr<Base>, linked_ptr<Derived1>, and<br>
-  // linked_ptr<Derived2>).  Therefore we must use a single mutex to<br>
-  // protect all linked_ptr objects.  This can create serious<br>
-  // contention in production code, but is acceptable in a testing<br>
-  // framework.<br>
-<br>
-  // Join an existing circle.<br>
-  void join(linked_ptr_internal const* ptr)<br>
-      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {<br>
-    MutexLock lock(&g_linked_ptr_mutex);<br>
-<br>
-    linked_ptr_internal const* p = ptr;<br>
-    while (p->next_ != ptr) {<br>
-      assert(p->next_ != this &&<br>
-             "Trying to join() a linked ring we are already in. "<br>
-             "Is GMock thread safety enabled?");<br>
-      p = p->next_;<br>
-    }<br>
-    p->next_ = this;<br>
-    next_ = ptr;<br>
-  }<br>
-<br>
-  // Leave whatever circle we're part of.  Returns true if we were the<br>
-  // last member of the circle.  Once this is done, you can join() another.<br>
-  bool depart()<br>
-      GTEST_LOCK_EXCLUDED_(g_linked_ptr_mutex) {<br>
-    MutexLock lock(&g_linked_ptr_mutex);<br>
-<br>
-    if (next_ == this) return true;<br>
-    linked_ptr_internal const* p = next_;<br>
-    while (p->next_ != this) {<br>
-      assert(p->next_ != next_ &&<br>
-             "Trying to depart() a linked ring we are not in. "<br>
-             "Is GMock thread safety enabled?");<br>
-      p = p->next_;<br>
-    }<br>
-    p->next_ = next_;<br>
-    return false;<br>
-  }<br>
-<br>
- private:<br>
-  mutable linked_ptr_internal const* next_;<br>
-};<br>
-<br>
-template <typename T><br>
-class linked_ptr {<br>
- public:<br>
-  typedef T element_type;<br>
-<br>
-  // Take over ownership of a raw pointer.  This should happen as soon as<br>
-  // possible after the object is created.<br>
-  explicit linked_ptr(T* ptr = NULL) { capture(ptr); }<br>
-  ~linked_ptr() { depart(); }<br>
-<br>
-  // Copy an existing linked_ptr<>, adding ourselves to the list of references.<br>
-  template <typename U> linked_ptr(linked_ptr<U> const& ptr) { copy(&ptr); }<br>
-  linked_ptr(linked_ptr const& ptr) {  // NOLINT<br>
-    assert(&ptr != this);<br>
-    copy(&ptr);<br>
-  }<br>
-<br>
-  // Assignment releases the old value and acquires the new.<br>
-  template <typename U> linked_ptr& operator=(linked_ptr<U> const& ptr) {<br>
-    depart();<br>
-    copy(&ptr);<br>
-    return *this;<br>
-  }<br>
-<br>
-  linked_ptr& operator=(linked_ptr const& ptr) {<br>
-    if (&ptr != this) {<br>
-      depart();<br>
-      copy(&ptr);<br>
-    }<br>
-    return *this;<br>
-  }<br>
-<br>
-  // Smart pointer members.<br>
-  void reset(T* ptr = NULL) {<br>
-    depart();<br>
-    capture(ptr);<br>
-  }<br>
-  T* get() const { return value_; }<br>
-  T* operator->() const { return value_; }<br>
-  T& operator*() const { return *value_; }<br>
-<br>
-  bool operator==(T* p) const { return value_ == p; }<br>
-  bool operator!=(T* p) const { return value_ != p; }<br>
-  template <typename U><br>
-  bool operator==(linked_ptr<U> const& ptr) const {<br>
-    return value_ == ptr.get();<br>
-  }<br>
-  template <typename U><br>
-  bool operator!=(linked_ptr<U> const& ptr) const {<br>
-    return value_ != ptr.get();<br>
-  }<br>
-<br>
- private:<br>
-  template <typename U><br>
-  friend class linked_ptr;<br>
-<br>
-  T* value_;<br>
-  linked_ptr_internal link_;<br>
-<br>
-  void depart() {<br>
-    if (link_.depart()) delete value_;<br>
-  }<br>
-<br>
-  void capture(T* ptr) {<br>
-    value_ = ptr;<br>
-    link_.join_new();<br>
-  }<br>
-<br>
-  template <typename U> void copy(linked_ptr<U> const* ptr) {<br>
-    value_ = ptr->get();<br>
-    if (value_)<br>
-      link_.join(&ptr->link_);<br>
-    else<br>
-      link_.join_new();<br>
-  }<br>
-};<br>
-<br>
-template<typename T> inline<br>
-bool operator==(T* ptr, const linked_ptr<T>& x) {<br>
-  return ptr == x.get();<br>
-}<br>
-<br>
-template<typename T> inline<br>
-bool operator!=(T* ptr, const linked_ptr<T>& x) {<br>
-  return ptr != x.get();<br>
-}<br>
-<br>
-// A function to convert T* into linked_ptr<T><br>
-// Doing e.g. make_linked_ptr(new FooBarBaz<type>(arg)) is a shorter notation<br>
-// for linked_ptr<FooBarBaz<type> >(new FooBarBaz<type>(arg))<br>
-template <typename T><br>
-linked_ptr<T> make_linked_ptr(T* ptr) {<br>
-  return linked_ptr<T>(ptr);<br>
-}<br>
-<br>
-}  // namespace internal<br>
-}  // namespace testing<br>
-<br>
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_LINKED_PTR_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
deleted file mode 100644<br>
index a6f49b256ab52..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util-generated.h<br>
+++ /dev/null<br>
@@ -1,5565 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-//     pump.py gtest-param-util-generated.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2008 Google Inc.<br>
-// All Rights Reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-//     * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-//     * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-//     * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Type and function utilities for implementing parameterized tests.<br>
-// This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!<br>
-//<br>
-// Currently Google Test supports at most 50 arguments in Values,<br>
-// and at most 10 arguments in Combine. Please contact<br>
-// <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need more.<br>
-// Please note that the number of arguments to Combine is limited<br>
-// by the maximum arity of the implementation of tuple which is<br>
-// currently set at 10.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
-<br>
-#include "gtest/internal/gtest-param-util.h"<br>
-#include "gtest/internal/gtest-port.h"<br>
-<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic push<br>
-#pragma clang diagnostic ignored "-Wdeprecated-copy"<br>
-#endif<br>
-#endif<br>
-<br>
-namespace testing {<br>
-<br>
-// Forward declarations of ValuesIn(), which is implemented in<br>
-// include/gtest/gtest-param-test.h.<br>
-template <typename ForwardIterator><br>
-internal::ParamGenerator<<br>
-  typename ::testing::internal::IteratorTraits<ForwardIterator>::value_type><br>
-ValuesIn(ForwardIterator begin, ForwardIterator end);<br>
-<br>
-template <typename T, size_t N><br>
-internal::ParamGenerator<T> ValuesIn(const T (&array)[N]);<br>
-<br>
-template <class Container><br>
-internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
-    const Container& container);<br>
-<br>
-namespace internal {<br>
-<br>
-// Used in the Values() function to provide polymorphic capabilities.<br>
-template <typename T1><br>
-class ValueArray1 {<br>
- public:<br>
-  explicit ValueArray1(T1 v1) : v1_(v1) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray1(const ValueArray1& other) : v1_(other.v1_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray1& other);<br>
-<br>
-  const T1 v1_;<br>
-};<br>
-<br>
-template <typename T1, typename T2><br>
-class ValueArray2 {<br>
- public:<br>
-  ValueArray2(T1 v1, T2 v2) : v1_(v1), v2_(v2) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray2(const ValueArray2& other) : v1_(other.v1_), v2_(other.v2_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray2& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-class ValueArray3 {<br>
- public:<br>
-  ValueArray3(T1 v1, T2 v2, T3 v3) : v1_(v1), v2_(v2), v3_(v3) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray3(const ValueArray3& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray3& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-class ValueArray4 {<br>
- public:<br>
-  ValueArray4(T1 v1, T2 v2, T3 v3, T4 v4) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray4(const ValueArray4& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray4& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-class ValueArray5 {<br>
- public:<br>
-  ValueArray5(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray5(const ValueArray5& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray5& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6><br>
-class ValueArray6 {<br>
- public:<br>
-  ValueArray6(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray6(const ValueArray6& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray6& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7><br>
-class ValueArray7 {<br>
- public:<br>
-  ValueArray7(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray7(const ValueArray7& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray7& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8><br>
-class ValueArray8 {<br>
- public:<br>
-  ValueArray8(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7,<br>
-      T8 v8) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray8(const ValueArray8& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray8& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9><br>
-class ValueArray9 {<br>
- public:<br>
-  ValueArray9(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8,<br>
-      T9 v9) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray9(const ValueArray9& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray9& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10><br>
-class ValueArray10 {<br>
- public:<br>
-  ValueArray10(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray10(const ValueArray10& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray10& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11><br>
-class ValueArray11 {<br>
- public:<br>
-  ValueArray11(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray11(const ValueArray11& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray11& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12><br>
-class ValueArray12 {<br>
- public:<br>
-  ValueArray12(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray12(const ValueArray12& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray12& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13><br>
-class ValueArray13 {<br>
- public:<br>
-  ValueArray13(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
-      v12_(v12), v13_(v13) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray13(const ValueArray13& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray13& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14><br>
-class ValueArray14 {<br>
- public:<br>
-  ValueArray14(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray14(const ValueArray14& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray14& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15><br>
-class ValueArray15 {<br>
- public:<br>
-  ValueArray15(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray15(const ValueArray15& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray15& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16><br>
-class ValueArray16 {<br>
- public:<br>
-  ValueArray16(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
-      v16_(v16) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray16(const ValueArray16& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray16& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17><br>
-class ValueArray17 {<br>
- public:<br>
-  ValueArray17(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16,<br>
-      T17 v17) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray17(const ValueArray17& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray17& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18><br>
-class ValueArray18 {<br>
- public:<br>
-  ValueArray18(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray18(const ValueArray18& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray18& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19><br>
-class ValueArray19 {<br>
- public:<br>
-  ValueArray19(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray19(const ValueArray19& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray19& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20><br>
-class ValueArray20 {<br>
- public:<br>
-  ValueArray20(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
-      v19_(v19), v20_(v20) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray20(const ValueArray20& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray20& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21><br>
-class ValueArray21 {<br>
- public:<br>
-  ValueArray21(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray21(const ValueArray21& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray21& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22><br>
-class ValueArray22 {<br>
- public:<br>
-  ValueArray22(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray22(const ValueArray22& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray22& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23><br>
-class ValueArray23 {<br>
- public:<br>
-  ValueArray23(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray23(const ValueArray23& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray23& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24><br>
-class ValueArray24 {<br>
- public:<br>
-  ValueArray24(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
-      v22_(v22), v23_(v23), v24_(v24) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray24(const ValueArray24& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray24& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25><br>
-class ValueArray25 {<br>
- public:<br>
-  ValueArray25(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24,<br>
-      T25 v25) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray25(const ValueArray25& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray25& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26><br>
-class ValueArray26 {<br>
- public:<br>
-  ValueArray26(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray26(const ValueArray26& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray26& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27><br>
-class ValueArray27 {<br>
- public:<br>
-  ValueArray27(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
-      v26_(v26), v27_(v27) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray27(const ValueArray27& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray27& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28><br>
-class ValueArray28 {<br>
- public:<br>
-  ValueArray28(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray28(const ValueArray28& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray28& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29><br>
-class ValueArray29 {<br>
- public:<br>
-  ValueArray29(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray29(const ValueArray29& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray29& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30><br>
-class ValueArray30 {<br>
- public:<br>
-  ValueArray30(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray30(const ValueArray30& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray30& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31><br>
-class ValueArray31 {<br>
- public:<br>
-  ValueArray31(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30), v31_(v31) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray31(const ValueArray31& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray31& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32><br>
-class ValueArray32 {<br>
- public:<br>
-  ValueArray32(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray32(const ValueArray32& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray32& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33><br>
-class ValueArray33 {<br>
- public:<br>
-  ValueArray33(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32,<br>
-      T33 v33) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray33(const ValueArray33& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray33& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34><br>
-class ValueArray34 {<br>
- public:<br>
-  ValueArray34(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33), v34_(v34) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray34(const ValueArray34& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray34& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35><br>
-class ValueArray35 {<br>
- public:<br>
-  ValueArray35(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
-      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),<br>
-      v32_(v32), v33_(v33), v34_(v34), v35_(v35) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray35(const ValueArray35& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray35& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36><br>
-class ValueArray36 {<br>
- public:<br>
-  ValueArray36(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),<br>
-      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray36(const ValueArray36& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray36& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37><br>
-class ValueArray37 {<br>
- public:<br>
-  ValueArray37(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),<br>
-      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),<br>
-      v36_(v36), v37_(v37) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray37(const ValueArray37& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray37& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38><br>
-class ValueArray38 {<br>
- public:<br>
-  ValueArray38(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray38(const ValueArray38& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray38& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39><br>
-class ValueArray39 {<br>
- public:<br>
-  ValueArray39(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray39(const ValueArray39& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray39& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40><br>
-class ValueArray40 {<br>
- public:<br>
-  ValueArray40(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),<br>
-      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),<br>
-      v40_(v40) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray40(const ValueArray40& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray40& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41><br>
-class ValueArray41 {<br>
- public:<br>
-  ValueArray41(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40,<br>
-      T41 v41) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
-      v39_(v39), v40_(v40), v41_(v41) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray41(const ValueArray41& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray41& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42><br>
-class ValueArray42 {<br>
- public:<br>
-  ValueArray42(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray42(const ValueArray42& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray42& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43><br>
-class ValueArray43 {<br>
- public:<br>
-  ValueArray43(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6),<br>
-      v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13),<br>
-      v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19),<br>
-      v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25),<br>
-      v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31),<br>
-      v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37),<br>
-      v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray43(const ValueArray43& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray43& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44><br>
-class ValueArray44 {<br>
- public:<br>
-  ValueArray44(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5),<br>
-      v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12),<br>
-      v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17), v18_(v18),<br>
-      v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23), v24_(v24),<br>
-      v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29), v30_(v30),<br>
-      v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35), v36_(v36),<br>
-      v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41), v42_(v42),<br>
-      v43_(v43), v44_(v44) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray44(const ValueArray44& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray44& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45><br>
-class ValueArray45 {<br>
- public:<br>
-  ValueArray45(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45) : v1_(v1), v2_(v2), v3_(v3), v4_(v4),<br>
-      v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10), v11_(v11),<br>
-      v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16), v17_(v17),<br>
-      v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22), v23_(v23),<br>
-      v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28), v29_(v29),<br>
-      v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34), v35_(v35),<br>
-      v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40), v41_(v41),<br>
-      v42_(v42), v43_(v43), v44_(v44), v45_(v45) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray45(const ValueArray45& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray45& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46><br>
-class ValueArray46 {<br>
- public:<br>
-  ValueArray46(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46) : v1_(v1), v2_(v2), v3_(v3),<br>
-      v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),<br>
-      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_), static_cast<T>(v46_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray46(const ValueArray46& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray46& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-  const T46 v46_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47><br>
-class ValueArray47 {<br>
- public:<br>
-  ValueArray47(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47) : v1_(v1), v2_(v2),<br>
-      v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9), v10_(v10),<br>
-      v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15), v16_(v16),<br>
-      v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21), v22_(v22),<br>
-      v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27), v28_(v28),<br>
-      v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33), v34_(v34),<br>
-      v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39), v40_(v40),<br>
-      v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45), v46_(v46),<br>
-      v47_(v47) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray47(const ValueArray47& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
-      v47_(other.v47_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray47& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-  const T46 v46_;<br>
-  const T47 v47_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48><br>
-class ValueArray48 {<br>
- public:<br>
-  ValueArray48(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48) : v1_(v1),<br>
-      v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7), v8_(v8), v9_(v9),<br>
-      v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14), v15_(v15),<br>
-      v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20), v21_(v21),<br>
-      v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26), v27_(v27),<br>
-      v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32), v33_(v33),<br>
-      v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38), v39_(v39),<br>
-      v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44), v45_(v45),<br>
-      v46_(v46), v47_(v47), v48_(v48) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
-        static_cast<T>(v48_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray48(const ValueArray48& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
-      v47_(other.v47_), v48_(other.v48_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray48& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-  const T46 v46_;<br>
-  const T47 v47_;<br>
-  const T48 v48_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48, typename T49><br>
-class ValueArray49 {<br>
- public:<br>
-  ValueArray49(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48,<br>
-      T49 v49) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),<br>
-      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
-        static_cast<T>(v48_), static_cast<T>(v49_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray49(const ValueArray49& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
-      v47_(other.v47_), v48_(other.v48_), v49_(other.v49_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray49& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-  const T46 v46_;<br>
-  const T47 v47_;<br>
-  const T48 v48_;<br>
-  const T49 v49_;<br>
-};<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10,<br>
-    typename T11, typename T12, typename T13, typename T14, typename T15,<br>
-    typename T16, typename T17, typename T18, typename T19, typename T20,<br>
-    typename T21, typename T22, typename T23, typename T24, typename T25,<br>
-    typename T26, typename T27, typename T28, typename T29, typename T30,<br>
-    typename T31, typename T32, typename T33, typename T34, typename T35,<br>
-    typename T36, typename T37, typename T38, typename T39, typename T40,<br>
-    typename T41, typename T42, typename T43, typename T44, typename T45,<br>
-    typename T46, typename T47, typename T48, typename T49, typename T50><br>
-class ValueArray50 {<br>
- public:<br>
-  ValueArray50(T1 v1, T2 v2, T3 v3, T4 v4, T5 v5, T6 v6, T7 v7, T8 v8, T9 v9,<br>
-      T10 v10, T11 v11, T12 v12, T13 v13, T14 v14, T15 v15, T16 v16, T17 v17,<br>
-      T18 v18, T19 v19, T20 v20, T21 v21, T22 v22, T23 v23, T24 v24, T25 v25,<br>
-      T26 v26, T27 v27, T28 v28, T29 v29, T30 v30, T31 v31, T32 v32, T33 v33,<br>
-      T34 v34, T35 v35, T36 v36, T37 v37, T38 v38, T39 v39, T40 v40, T41 v41,<br>
-      T42 v42, T43 v43, T44 v44, T45 v45, T46 v46, T47 v47, T48 v48, T49 v49,<br>
-      T50 v50) : v1_(v1), v2_(v2), v3_(v3), v4_(v4), v5_(v5), v6_(v6), v7_(v7),<br>
-      v8_(v8), v9_(v9), v10_(v10), v11_(v11), v12_(v12), v13_(v13), v14_(v14),<br>
-      v15_(v15), v16_(v16), v17_(v17), v18_(v18), v19_(v19), v20_(v20),<br>
-      v21_(v21), v22_(v22), v23_(v23), v24_(v24), v25_(v25), v26_(v26),<br>
-      v27_(v27), v28_(v28), v29_(v29), v30_(v30), v31_(v31), v32_(v32),<br>
-      v33_(v33), v34_(v34), v35_(v35), v36_(v36), v37_(v37), v38_(v38),<br>
-      v39_(v39), v40_(v40), v41_(v41), v42_(v42), v43_(v43), v44_(v44),<br>
-      v45_(v45), v46_(v46), v47_(v47), v48_(v48), v49_(v49), v50_(v50) {}<br>
-<br>
-  template <typename T><br>
-  operator ParamGenerator<T>() const {<br>
-    const T array[] = {static_cast<T>(v1_), static_cast<T>(v2_),<br>
-        static_cast<T>(v3_), static_cast<T>(v4_), static_cast<T>(v5_),<br>
-        static_cast<T>(v6_), static_cast<T>(v7_), static_cast<T>(v8_),<br>
-        static_cast<T>(v9_), static_cast<T>(v10_), static_cast<T>(v11_),<br>
-        static_cast<T>(v12_), static_cast<T>(v13_), static_cast<T>(v14_),<br>
-        static_cast<T>(v15_), static_cast<T>(v16_), static_cast<T>(v17_),<br>
-        static_cast<T>(v18_), static_cast<T>(v19_), static_cast<T>(v20_),<br>
-        static_cast<T>(v21_), static_cast<T>(v22_), static_cast<T>(v23_),<br>
-        static_cast<T>(v24_), static_cast<T>(v25_), static_cast<T>(v26_),<br>
-        static_cast<T>(v27_), static_cast<T>(v28_), static_cast<T>(v29_),<br>
-        static_cast<T>(v30_), static_cast<T>(v31_), static_cast<T>(v32_),<br>
-        static_cast<T>(v33_), static_cast<T>(v34_), static_cast<T>(v35_),<br>
-        static_cast<T>(v36_), static_cast<T>(v37_), static_cast<T>(v38_),<br>
-        static_cast<T>(v39_), static_cast<T>(v40_), static_cast<T>(v41_),<br>
-        static_cast<T>(v42_), static_cast<T>(v43_), static_cast<T>(v44_),<br>
-        static_cast<T>(v45_), static_cast<T>(v46_), static_cast<T>(v47_),<br>
-        static_cast<T>(v48_), static_cast<T>(v49_), static_cast<T>(v50_)};<br>
-    return ValuesIn(array);<br>
-  }<br>
-<br>
-  ValueArray50(const ValueArray50& other) : v1_(other.v1_), v2_(other.v2_),<br>
-      v3_(other.v3_), v4_(other.v4_), v5_(other.v5_), v6_(other.v6_),<br>
-      v7_(other.v7_), v8_(other.v8_), v9_(other.v9_), v10_(other.v10_),<br>
-      v11_(other.v11_), v12_(other.v12_), v13_(other.v13_), v14_(other.v14_),<br>
-      v15_(other.v15_), v16_(other.v16_), v17_(other.v17_), v18_(other.v18_),<br>
-      v19_(other.v19_), v20_(other.v20_), v21_(other.v21_), v22_(other.v22_),<br>
-      v23_(other.v23_), v24_(other.v24_), v25_(other.v25_), v26_(other.v26_),<br>
-      v27_(other.v27_), v28_(other.v28_), v29_(other.v29_), v30_(other.v30_),<br>
-      v31_(other.v31_), v32_(other.v32_), v33_(other.v33_), v34_(other.v34_),<br>
-      v35_(other.v35_), v36_(other.v36_), v37_(other.v37_), v38_(other.v38_),<br>
-      v39_(other.v39_), v40_(other.v40_), v41_(other.v41_), v42_(other.v42_),<br>
-      v43_(other.v43_), v44_(other.v44_), v45_(other.v45_), v46_(other.v46_),<br>
-      v47_(other.v47_), v48_(other.v48_), v49_(other.v49_), v50_(other.v50_) {}<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const ValueArray50& other);<br>
-<br>
-  const T1 v1_;<br>
-  const T2 v2_;<br>
-  const T3 v3_;<br>
-  const T4 v4_;<br>
-  const T5 v5_;<br>
-  const T6 v6_;<br>
-  const T7 v7_;<br>
-  const T8 v8_;<br>
-  const T9 v9_;<br>
-  const T10 v10_;<br>
-  const T11 v11_;<br>
-  const T12 v12_;<br>
-  const T13 v13_;<br>
-  const T14 v14_;<br>
-  const T15 v15_;<br>
-  const T16 v16_;<br>
-  const T17 v17_;<br>
-  const T18 v18_;<br>
-  const T19 v19_;<br>
-  const T20 v20_;<br>
-  const T21 v21_;<br>
-  const T22 v22_;<br>
-  const T23 v23_;<br>
-  const T24 v24_;<br>
-  const T25 v25_;<br>
-  const T26 v26_;<br>
-  const T27 v27_;<br>
-  const T28 v28_;<br>
-  const T29 v29_;<br>
-  const T30 v30_;<br>
-  const T31 v31_;<br>
-  const T32 v32_;<br>
-  const T33 v33_;<br>
-  const T34 v34_;<br>
-  const T35 v35_;<br>
-  const T36 v36_;<br>
-  const T37 v37_;<br>
-  const T38 v38_;<br>
-  const T39 v39_;<br>
-  const T40 v40_;<br>
-  const T41 v41_;<br>
-  const T42 v42_;<br>
-  const T43 v43_;<br>
-  const T44 v44_;<br>
-  const T45 v45_;<br>
-  const T46 v46_;<br>
-  const T47 v47_;<br>
-  const T48 v48_;<br>
-  const T49 v49_;<br>
-  const T50 v50_;<br>
-};<br>
-<br>
-# if GTEST_HAS_COMBINE<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Generates values from the Cartesian product of values produced<br>
-// by the argument generators.<br>
-//<br>
-template <typename T1, typename T2><br>
-class CartesianProductGenerator2<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2> ParamType;<br>
-<br>
-  CartesianProductGenerator2(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2)<br>
-      : g1_(g1), g2_(g2) {}<br>
-  virtual ~CartesianProductGenerator2() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current2_;<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator2::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator2& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-};  // class CartesianProductGenerator2<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3><br>
-class CartesianProductGenerator3<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3> ParamType;<br>
-<br>
-  CartesianProductGenerator3(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3)<br>
-      : g1_(g1), g2_(g2), g3_(g3) {}<br>
-  virtual ~CartesianProductGenerator3() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current3_;<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator3::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator3& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-};  // class CartesianProductGenerator3<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4><br>
-class CartesianProductGenerator4<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4> ParamType;<br>
-<br>
-  CartesianProductGenerator4(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}<br>
-  virtual ~CartesianProductGenerator4() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current4_;<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator4::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator4& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-};  // class CartesianProductGenerator4<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-class CartesianProductGenerator5<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5> ParamType;<br>
-<br>
-  CartesianProductGenerator5(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}<br>
-  virtual ~CartesianProductGenerator5() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current5_;<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator5::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator5& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-};  // class CartesianProductGenerator5<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6><br>
-class CartesianProductGenerator6<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5,<br>
-        T6> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6> ParamType;<br>
-<br>
-  CartesianProductGenerator6(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
-      const ParamGenerator<T6>& g6)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}<br>
-  virtual ~CartesianProductGenerator6() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5,<br>
-      const ParamGenerator<T6>& g6,<br>
-      const typename ParamGenerator<T6>::iterator& current6)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current6_;<br>
-      if (current6_ == end6_) {<br>
-        current6_ = begin6_;<br>
-        ++current5_;<br>
-      }<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_ &&<br>
-          current6_ == typed_other->current6_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_),<br>
-        begin6_(other.begin6_),<br>
-        end6_(other.end6_),<br>
-        current6_(other.current6_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_, *current6_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_ ||<br>
-          current6_ == end6_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    const typename ParamGenerator<T6>::iterator begin6_;<br>
-    const typename ParamGenerator<T6>::iterator end6_;<br>
-    typename ParamGenerator<T6>::iterator current6_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator6::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator6& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-  const ParamGenerator<T6> g6_;<br>
-};  // class CartesianProductGenerator6<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7><br>
-class CartesianProductGenerator7<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
-        T7> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> ParamType;<br>
-<br>
-  CartesianProductGenerator7(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}<br>
-  virtual ~CartesianProductGenerator7() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
-        g7_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5,<br>
-      const ParamGenerator<T6>& g6,<br>
-      const typename ParamGenerator<T6>::iterator& current6,<br>
-      const ParamGenerator<T7>& g7,<br>
-      const typename ParamGenerator<T7>::iterator& current7)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current7_;<br>
-      if (current7_ == end7_) {<br>
-        current7_ = begin7_;<br>
-        ++current6_;<br>
-      }<br>
-      if (current6_ == end6_) {<br>
-        current6_ = begin6_;<br>
-        ++current5_;<br>
-      }<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_ &&<br>
-          current6_ == typed_other->current6_ &&<br>
-          current7_ == typed_other->current7_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_),<br>
-        begin6_(other.begin6_),<br>
-        end6_(other.end6_),<br>
-        current6_(other.current6_),<br>
-        begin7_(other.begin7_),<br>
-        end7_(other.end7_),<br>
-        current7_(other.current7_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_, *current6_, *current7_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_ ||<br>
-          current6_ == end6_ ||<br>
-          current7_ == end7_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    const typename ParamGenerator<T6>::iterator begin6_;<br>
-    const typename ParamGenerator<T6>::iterator end6_;<br>
-    typename ParamGenerator<T6>::iterator current6_;<br>
-    const typename ParamGenerator<T7>::iterator begin7_;<br>
-    const typename ParamGenerator<T7>::iterator end7_;<br>
-    typename ParamGenerator<T7>::iterator current7_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator7::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator7& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-  const ParamGenerator<T6> g6_;<br>
-  const ParamGenerator<T7> g7_;<br>
-};  // class CartesianProductGenerator7<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8><br>
-class CartesianProductGenerator8<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
-        T7, T8> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> ParamType;<br>
-<br>
-  CartesianProductGenerator8(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
-      const ParamGenerator<T8>& g8)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),<br>
-          g8_(g8) {}<br>
-  virtual ~CartesianProductGenerator8() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
-        g7_.begin(), g8_, g8_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
-        g8_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5,<br>
-      const ParamGenerator<T6>& g6,<br>
-      const typename ParamGenerator<T6>::iterator& current6,<br>
-      const ParamGenerator<T7>& g7,<br>
-      const typename ParamGenerator<T7>::iterator& current7,<br>
-      const ParamGenerator<T8>& g8,<br>
-      const typename ParamGenerator<T8>::iterator& current8)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current8_;<br>
-      if (current8_ == end8_) {<br>
-        current8_ = begin8_;<br>
-        ++current7_;<br>
-      }<br>
-      if (current7_ == end7_) {<br>
-        current7_ = begin7_;<br>
-        ++current6_;<br>
-      }<br>
-      if (current6_ == end6_) {<br>
-        current6_ = begin6_;<br>
-        ++current5_;<br>
-      }<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_ &&<br>
-          current6_ == typed_other->current6_ &&<br>
-          current7_ == typed_other->current7_ &&<br>
-          current8_ == typed_other->current8_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_),<br>
-        begin6_(other.begin6_),<br>
-        end6_(other.end6_),<br>
-        current6_(other.current6_),<br>
-        begin7_(other.begin7_),<br>
-        end7_(other.end7_),<br>
-        current7_(other.current7_),<br>
-        begin8_(other.begin8_),<br>
-        end8_(other.end8_),<br>
-        current8_(other.current8_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_, *current6_, *current7_, *current8_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_ ||<br>
-          current6_ == end6_ ||<br>
-          current7_ == end7_ ||<br>
-          current8_ == end8_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    const typename ParamGenerator<T6>::iterator begin6_;<br>
-    const typename ParamGenerator<T6>::iterator end6_;<br>
-    typename ParamGenerator<T6>::iterator current6_;<br>
-    const typename ParamGenerator<T7>::iterator begin7_;<br>
-    const typename ParamGenerator<T7>::iterator end7_;<br>
-    typename ParamGenerator<T7>::iterator current7_;<br>
-    const typename ParamGenerator<T8>::iterator begin8_;<br>
-    const typename ParamGenerator<T8>::iterator end8_;<br>
-    typename ParamGenerator<T8>::iterator current8_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator8::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator8& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-  const ParamGenerator<T6> g6_;<br>
-  const ParamGenerator<T7> g7_;<br>
-  const ParamGenerator<T8> g8_;<br>
-};  // class CartesianProductGenerator8<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9><br>
-class CartesianProductGenerator9<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
-        T7, T8, T9> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9> ParamType;<br>
-<br>
-  CartesianProductGenerator9(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
-      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
-          g9_(g9) {}<br>
-  virtual ~CartesianProductGenerator9() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
-        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
-        g8_.end(), g9_, g9_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5,<br>
-      const ParamGenerator<T6>& g6,<br>
-      const typename ParamGenerator<T6>::iterator& current6,<br>
-      const ParamGenerator<T7>& g7,<br>
-      const typename ParamGenerator<T7>::iterator& current7,<br>
-      const ParamGenerator<T8>& g8,<br>
-      const typename ParamGenerator<T8>::iterator& current8,<br>
-      const ParamGenerator<T9>& g9,<br>
-      const typename ParamGenerator<T9>::iterator& current9)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),<br>
-          begin9_(g9.begin()), end9_(g9.end()), current9_(current9)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current9_;<br>
-      if (current9_ == end9_) {<br>
-        current9_ = begin9_;<br>
-        ++current8_;<br>
-      }<br>
-      if (current8_ == end8_) {<br>
-        current8_ = begin8_;<br>
-        ++current7_;<br>
-      }<br>
-      if (current7_ == end7_) {<br>
-        current7_ = begin7_;<br>
-        ++current6_;<br>
-      }<br>
-      if (current6_ == end6_) {<br>
-        current6_ = begin6_;<br>
-        ++current5_;<br>
-      }<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_ &&<br>
-          current6_ == typed_other->current6_ &&<br>
-          current7_ == typed_other->current7_ &&<br>
-          current8_ == typed_other->current8_ &&<br>
-          current9_ == typed_other->current9_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_),<br>
-        begin6_(other.begin6_),<br>
-        end6_(other.end6_),<br>
-        current6_(other.current6_),<br>
-        begin7_(other.begin7_),<br>
-        end7_(other.end7_),<br>
-        current7_(other.current7_),<br>
-        begin8_(other.begin8_),<br>
-        end8_(other.end8_),<br>
-        current8_(other.current8_),<br>
-        begin9_(other.begin9_),<br>
-        end9_(other.end9_),<br>
-        current9_(other.current9_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_, *current6_, *current7_, *current8_,<br>
-            *current9_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_ ||<br>
-          current6_ == end6_ ||<br>
-          current7_ == end7_ ||<br>
-          current8_ == end8_ ||<br>
-          current9_ == end9_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    const typename ParamGenerator<T6>::iterator begin6_;<br>
-    const typename ParamGenerator<T6>::iterator end6_;<br>
-    typename ParamGenerator<T6>::iterator current6_;<br>
-    const typename ParamGenerator<T7>::iterator begin7_;<br>
-    const typename ParamGenerator<T7>::iterator end7_;<br>
-    typename ParamGenerator<T7>::iterator current7_;<br>
-    const typename ParamGenerator<T8>::iterator begin8_;<br>
-    const typename ParamGenerator<T8>::iterator end8_;<br>
-    typename ParamGenerator<T8>::iterator current8_;<br>
-    const typename ParamGenerator<T9>::iterator begin9_;<br>
-    const typename ParamGenerator<T9>::iterator end9_;<br>
-    typename ParamGenerator<T9>::iterator current9_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator9::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator9& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-  const ParamGenerator<T6> g6_;<br>
-  const ParamGenerator<T7> g7_;<br>
-  const ParamGenerator<T8> g8_;<br>
-  const ParamGenerator<T9> g9_;<br>
-};  // class CartesianProductGenerator9<br>
-<br>
-<br>
-template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-    typename T6, typename T7, typename T8, typename T9, typename T10><br>
-class CartesianProductGenerator10<br>
-    : public ParamGeneratorInterface< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
-        T7, T8, T9, T10> > {<br>
- public:<br>
-  typedef ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10> ParamType;<br>
-<br>
-  CartesianProductGenerator10(const ParamGenerator<T1>& g1,<br>
-      const ParamGenerator<T2>& g2, const ParamGenerator<T3>& g3,<br>
-      const ParamGenerator<T4>& g4, const ParamGenerator<T5>& g5,<br>
-      const ParamGenerator<T6>& g6, const ParamGenerator<T7>& g7,<br>
-      const ParamGenerator<T8>& g8, const ParamGenerator<T9>& g9,<br>
-      const ParamGenerator<T10>& g10)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
-          g9_(g9), g10_(g10) {}<br>
-  virtual ~CartesianProductGenerator10() {}<br>
-<br>
-  virtual ParamIteratorInterface<ParamType>* Begin() const {<br>
-    return new Iterator(this, g1_, g1_.begin(), g2_, g2_.begin(), g3_,<br>
-        g3_.begin(), g4_, g4_.begin(), g5_, g5_.begin(), g6_, g6_.begin(), g7_,<br>
-        g7_.begin(), g8_, g8_.begin(), g9_, g9_.begin(), g10_, g10_.begin());<br>
-  }<br>
-  virtual ParamIteratorInterface<ParamType>* End() const {<br>
-    return new Iterator(this, g1_, g1_.end(), g2_, g2_.end(), g3_, g3_.end(),<br>
-        g4_, g4_.end(), g5_, g5_.end(), g6_, g6_.end(), g7_, g7_.end(), g8_,<br>
-        g8_.end(), g9_, g9_.end(), g10_, g10_.end());<br>
-  }<br>
-<br>
- private:<br>
-  class Iterator : public ParamIteratorInterface<ParamType> {<br>
-   public:<br>
-    Iterator(const ParamGeneratorInterface<ParamType>* base,<br>
-      const ParamGenerator<T1>& g1,<br>
-      const typename ParamGenerator<T1>::iterator& current1,<br>
-      const ParamGenerator<T2>& g2,<br>
-      const typename ParamGenerator<T2>::iterator& current2,<br>
-      const ParamGenerator<T3>& g3,<br>
-      const typename ParamGenerator<T3>::iterator& current3,<br>
-      const ParamGenerator<T4>& g4,<br>
-      const typename ParamGenerator<T4>::iterator& current4,<br>
-      const ParamGenerator<T5>& g5,<br>
-      const typename ParamGenerator<T5>::iterator& current5,<br>
-      const ParamGenerator<T6>& g6,<br>
-      const typename ParamGenerator<T6>::iterator& current6,<br>
-      const ParamGenerator<T7>& g7,<br>
-      const typename ParamGenerator<T7>::iterator& current7,<br>
-      const ParamGenerator<T8>& g8,<br>
-      const typename ParamGenerator<T8>::iterator& current8,<br>
-      const ParamGenerator<T9>& g9,<br>
-      const typename ParamGenerator<T9>::iterator& current9,<br>
-      const ParamGenerator<T10>& g10,<br>
-      const typename ParamGenerator<T10>::iterator& current10)<br>
-        : base_(base),<br>
-          begin1_(g1.begin()), end1_(g1.end()), current1_(current1),<br>
-          begin2_(g2.begin()), end2_(g2.end()), current2_(current2),<br>
-          begin3_(g3.begin()), end3_(g3.end()), current3_(current3),<br>
-          begin4_(g4.begin()), end4_(g4.end()), current4_(current4),<br>
-          begin5_(g5.begin()), end5_(g5.end()), current5_(current5),<br>
-          begin6_(g6.begin()), end6_(g6.end()), current6_(current6),<br>
-          begin7_(g7.begin()), end7_(g7.end()), current7_(current7),<br>
-          begin8_(g8.begin()), end8_(g8.end()), current8_(current8),<br>
-          begin9_(g9.begin()), end9_(g9.end()), current9_(current9),<br>
-          begin10_(g10.begin()), end10_(g10.end()), current10_(current10)    {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ~Iterator() {}<br>
-<br>
-    virtual const ParamGeneratorInterface<ParamType>* BaseGenerator() const {<br>
-      return base_;<br>
-    }<br>
-    // Advance should not be called on beyond-of-range iterators<br>
-    // so no component iterators must be beyond end of range, either.<br>
-    virtual void Advance() {<br>
-      assert(!AtEnd());<br>
-      ++current10_;<br>
-      if (current10_ == end10_) {<br>
-        current10_ = begin10_;<br>
-        ++current9_;<br>
-      }<br>
-      if (current9_ == end9_) {<br>
-        current9_ = begin9_;<br>
-        ++current8_;<br>
-      }<br>
-      if (current8_ == end8_) {<br>
-        current8_ = begin8_;<br>
-        ++current7_;<br>
-      }<br>
-      if (current7_ == end7_) {<br>
-        current7_ = begin7_;<br>
-        ++current6_;<br>
-      }<br>
-      if (current6_ == end6_) {<br>
-        current6_ = begin6_;<br>
-        ++current5_;<br>
-      }<br>
-      if (current5_ == end5_) {<br>
-        current5_ = begin5_;<br>
-        ++current4_;<br>
-      }<br>
-      if (current4_ == end4_) {<br>
-        current4_ = begin4_;<br>
-        ++current3_;<br>
-      }<br>
-      if (current3_ == end3_) {<br>
-        current3_ = begin3_;<br>
-        ++current2_;<br>
-      }<br>
-      if (current2_ == end2_) {<br>
-        current2_ = begin2_;<br>
-        ++current1_;<br>
-      }<br>
-      ComputeCurrentValue();<br>
-    }<br>
-    virtual ParamIteratorInterface<ParamType>* Clone() const {<br>
-      return new Iterator(*this);<br>
-    }<br>
-    virtual const ParamType* Current() const { return current_value_.get(); }<br>
-    virtual bool Equals(const ParamIteratorInterface<ParamType>& other) const {<br>
-      // Having the same base generator guarantees that the other<br>
-      // iterator is of the same type and we can downcast.<br>
-      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
-          << "The program attempted to compare iterators "<br>
-          << "from <br>
diff erent generators." << std::endl;<br>
-      const Iterator* typed_other =<br>
-          CheckedDowncastToActualType<const Iterator>(&other);<br>
-      // We must report iterators equal if they both point beyond their<br>
-      // respective ranges. That can happen in a variety of fashions,<br>
-      // so we have to consult AtEnd().<br>
-      return (AtEnd() && typed_other->AtEnd()) ||<br>
-         (<br>
-          current1_ == typed_other->current1_ &&<br>
-          current2_ == typed_other->current2_ &&<br>
-          current3_ == typed_other->current3_ &&<br>
-          current4_ == typed_other->current4_ &&<br>
-          current5_ == typed_other->current5_ &&<br>
-          current6_ == typed_other->current6_ &&<br>
-          current7_ == typed_other->current7_ &&<br>
-          current8_ == typed_other->current8_ &&<br>
-          current9_ == typed_other->current9_ &&<br>
-          current10_ == typed_other->current10_);<br>
-    }<br>
-<br>
-   private:<br>
-    Iterator(const Iterator& other)<br>
-        : base_(other.base_),<br>
-        begin1_(other.begin1_),<br>
-        end1_(other.end1_),<br>
-        current1_(other.current1_),<br>
-        begin2_(other.begin2_),<br>
-        end2_(other.end2_),<br>
-        current2_(other.current2_),<br>
-        begin3_(other.begin3_),<br>
-        end3_(other.end3_),<br>
-        current3_(other.current3_),<br>
-        begin4_(other.begin4_),<br>
-        end4_(other.end4_),<br>
-        current4_(other.current4_),<br>
-        begin5_(other.begin5_),<br>
-        end5_(other.end5_),<br>
-        current5_(other.current5_),<br>
-        begin6_(other.begin6_),<br>
-        end6_(other.end6_),<br>
-        current6_(other.current6_),<br>
-        begin7_(other.begin7_),<br>
-        end7_(other.end7_),<br>
-        current7_(other.current7_),<br>
-        begin8_(other.begin8_),<br>
-        end8_(other.end8_),<br>
-        current8_(other.current8_),<br>
-        begin9_(other.begin9_),<br>
-        end9_(other.end9_),<br>
-        current9_(other.current9_),<br>
-        begin10_(other.begin10_),<br>
-        end10_(other.end10_),<br>
-        current10_(other.current10_) {<br>
-      ComputeCurrentValue();<br>
-    }<br>
-<br>
-    void ComputeCurrentValue() {<br>
-      if (!AtEnd())<br>
-        current_value_.reset(new ParamType(*current1_, *current2_, *current3_,<br>
-            *current4_, *current5_, *current6_, *current7_, *current8_,<br>
-            *current9_, *current10_));<br>
-    }<br>
-    bool AtEnd() const {<br>
-      // We must report iterator past the end of the range when either of the<br>
-      // component iterators has reached the end of its range.<br>
-      return<br>
-          current1_ == end1_ ||<br>
-          current2_ == end2_ ||<br>
-          current3_ == end3_ ||<br>
-          current4_ == end4_ ||<br>
-          current5_ == end5_ ||<br>
-          current6_ == end6_ ||<br>
-          current7_ == end7_ ||<br>
-          current8_ == end8_ ||<br>
-          current9_ == end9_ ||<br>
-          current10_ == end10_;<br>
-    }<br>
-<br>
-    // No implementation - assignment is unsupported.<br>
-    void operator=(const Iterator& other);<br>
-<br>
-    const ParamGeneratorInterface<ParamType>* const base_;<br>
-    // begin[i]_ and end[i]_ define the i-th range that Iterator traverses.<br>
-    // current[i]_ is the actual traversing iterator.<br>
-    const typename ParamGenerator<T1>::iterator begin1_;<br>
-    const typename ParamGenerator<T1>::iterator end1_;<br>
-    typename ParamGenerator<T1>::iterator current1_;<br>
-    const typename ParamGenerator<T2>::iterator begin2_;<br>
-    const typename ParamGenerator<T2>::iterator end2_;<br>
-    typename ParamGenerator<T2>::iterator current2_;<br>
-    const typename ParamGenerator<T3>::iterator begin3_;<br>
-    const typename ParamGenerator<T3>::iterator end3_;<br>
-    typename ParamGenerator<T3>::iterator current3_;<br>
-    const typename ParamGenerator<T4>::iterator begin4_;<br>
-    const typename ParamGenerator<T4>::iterator end4_;<br>
-    typename ParamGenerator<T4>::iterator current4_;<br>
-    const typename ParamGenerator<T5>::iterator begin5_;<br>
-    const typename ParamGenerator<T5>::iterator end5_;<br>
-    typename ParamGenerator<T5>::iterator current5_;<br>
-    const typename ParamGenerator<T6>::iterator begin6_;<br>
-    const typename ParamGenerator<T6>::iterator end6_;<br>
-    typename ParamGenerator<T6>::iterator current6_;<br>
-    const typename ParamGenerator<T7>::iterator begin7_;<br>
-    const typename ParamGenerator<T7>::iterator end7_;<br>
-    typename ParamGenerator<T7>::iterator current7_;<br>
-    const typename ParamGenerator<T8>::iterator begin8_;<br>
-    const typename ParamGenerator<T8>::iterator end8_;<br>
-    typename ParamGenerator<T8>::iterator current8_;<br>
-    const typename ParamGenerator<T9>::iterator begin9_;<br>
-    const typename ParamGenerator<T9>::iterator end9_;<br>
-    typename ParamGenerator<T9>::iterator current9_;<br>
-    const typename ParamGenerator<T10>::iterator begin10_;<br>
-    const typename ParamGenerator<T10>::iterator end10_;<br>
-    typename ParamGenerator<T10>::iterator current10_;<br>
-    linked_ptr<ParamType> current_value_;<br>
-  };  // class CartesianProductGenerator10::Iterator<br>
-<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductGenerator10& other);<br>
-<br>
-  const ParamGenerator<T1> g1_;<br>
-  const ParamGenerator<T2> g2_;<br>
-  const ParamGenerator<T3> g3_;<br>
-  const ParamGenerator<T4> g4_;<br>
-  const ParamGenerator<T5> g5_;<br>
-  const ParamGenerator<T6> g6_;<br>
-  const ParamGenerator<T7> g7_;<br>
-  const ParamGenerator<T8> g8_;<br>
-  const ParamGenerator<T9> g9_;<br>
-  const ParamGenerator<T10> g10_;<br>
-};  // class CartesianProductGenerator10<br>
-<br>
-<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Helper classes providing Combine() with polymorphic features. They allow<br>
-// casting CartesianProductGeneratorN<T> to ParamGenerator<U> if T is<br>
-// convertible to U.<br>
-//<br>
-template <class Generator1, class Generator2><br>
-class CartesianProductHolder2 {<br>
- public:<br>
-CartesianProductHolder2(const Generator1& g1, const Generator2& g2)<br>
-      : g1_(g1), g2_(g2) {}<br>
-  template <typename T1, typename T2><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2> >(<br>
-        new CartesianProductGenerator2<T1, T2>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder2& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-};  // class CartesianProductHolder2<br>
-<br>
-template <class Generator1, class Generator2, class Generator3><br>
-class CartesianProductHolder3 {<br>
- public:<br>
-CartesianProductHolder3(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3)<br>
-      : g1_(g1), g2_(g2), g3_(g3) {}<br>
-  template <typename T1, typename T2, typename T3><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3> >(<br>
-        new CartesianProductGenerator3<T1, T2, T3>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder3& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-};  // class CartesianProductHolder3<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4><br>
-class CartesianProductHolder4 {<br>
- public:<br>
-CartesianProductHolder4(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4> >(<br>
-        new CartesianProductGenerator4<T1, T2, T3, T4>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder4& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-};  // class CartesianProductHolder4<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5><br>
-class CartesianProductHolder5 {<br>
- public:<br>
-CartesianProductHolder5(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5> >(<br>
-        new CartesianProductGenerator5<T1, T2, T3, T4, T5>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder5& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-};  // class CartesianProductHolder5<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5, class Generator6><br>
-class CartesianProductHolder6 {<br>
- public:<br>
-CartesianProductHolder6(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
-    const Generator6& g6)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-      typename T6><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6> >(<br>
-        new CartesianProductGenerator6<T1, T2, T3, T4, T5, T6>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_),<br>
-        static_cast<ParamGenerator<T6> >(g6_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder6& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-  const Generator6 g6_;<br>
-};  // class CartesianProductHolder6<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5, class Generator6, class Generator7><br>
-class CartesianProductHolder7 {<br>
- public:<br>
-CartesianProductHolder7(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
-    const Generator6& g6, const Generator7& g7)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-      typename T6, typename T7><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6,<br>
-      T7> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7> >(<br>
-        new CartesianProductGenerator7<T1, T2, T3, T4, T5, T6, T7>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_),<br>
-        static_cast<ParamGenerator<T6> >(g6_),<br>
-        static_cast<ParamGenerator<T7> >(g7_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder7& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-  const Generator6 g6_;<br>
-  const Generator7 g7_;<br>
-};  // class CartesianProductHolder7<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5, class Generator6, class Generator7,<br>
-    class Generator8><br>
-class CartesianProductHolder8 {<br>
- public:<br>
-CartesianProductHolder8(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
-    const Generator6& g6, const Generator7& g7, const Generator8& g8)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7),<br>
-          g8_(g8) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-      typename T6, typename T7, typename T8><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7,<br>
-      T8> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8> >(<br>
-        new CartesianProductGenerator8<T1, T2, T3, T4, T5, T6, T7, T8>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_),<br>
-        static_cast<ParamGenerator<T6> >(g6_),<br>
-        static_cast<ParamGenerator<T7> >(g7_),<br>
-        static_cast<ParamGenerator<T8> >(g8_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder8& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-  const Generator6 g6_;<br>
-  const Generator7 g7_;<br>
-  const Generator8 g8_;<br>
-};  // class CartesianProductHolder8<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5, class Generator6, class Generator7,<br>
-    class Generator8, class Generator9><br>
-class CartesianProductHolder9 {<br>
- public:<br>
-CartesianProductHolder9(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
-    const Generator6& g6, const Generator7& g7, const Generator8& g8,<br>
-    const Generator9& g9)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
-          g9_(g9) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-      typename T6, typename T7, typename T8, typename T9><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,<br>
-      T9> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8,<br>
-        T9> >(<br>
-        new CartesianProductGenerator9<T1, T2, T3, T4, T5, T6, T7, T8, T9>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_),<br>
-        static_cast<ParamGenerator<T6> >(g6_),<br>
-        static_cast<ParamGenerator<T7> >(g7_),<br>
-        static_cast<ParamGenerator<T8> >(g8_),<br>
-        static_cast<ParamGenerator<T9> >(g9_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder9& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-  const Generator6 g6_;<br>
-  const Generator7 g7_;<br>
-  const Generator8 g8_;<br>
-  const Generator9 g9_;<br>
-};  // class CartesianProductHolder9<br>
-<br>
-template <class Generator1, class Generator2, class Generator3,<br>
-    class Generator4, class Generator5, class Generator6, class Generator7,<br>
-    class Generator8, class Generator9, class Generator10><br>
-class CartesianProductHolder10 {<br>
- public:<br>
-CartesianProductHolder10(const Generator1& g1, const Generator2& g2,<br>
-    const Generator3& g3, const Generator4& g4, const Generator5& g5,<br>
-    const Generator6& g6, const Generator7& g7, const Generator8& g8,<br>
-    const Generator9& g9, const Generator10& g10)<br>
-      : g1_(g1), g2_(g2), g3_(g3), g4_(g4), g5_(g5), g6_(g6), g7_(g7), g8_(g8),<br>
-          g9_(g9), g10_(g10) {}<br>
-  template <typename T1, typename T2, typename T3, typename T4, typename T5,<br>
-      typename T6, typename T7, typename T8, typename T9, typename T10><br>
-  operator ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
-      T10> >() const {<br>
-    return ParamGenerator< ::testing::tuple<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
-        T10> >(<br>
-        new CartesianProductGenerator10<T1, T2, T3, T4, T5, T6, T7, T8, T9,<br>
-            T10>(<br>
-        static_cast<ParamGenerator<T1> >(g1_),<br>
-        static_cast<ParamGenerator<T2> >(g2_),<br>
-        static_cast<ParamGenerator<T3> >(g3_),<br>
-        static_cast<ParamGenerator<T4> >(g4_),<br>
-        static_cast<ParamGenerator<T5> >(g5_),<br>
-        static_cast<ParamGenerator<T6> >(g6_),<br>
-        static_cast<ParamGenerator<T7> >(g7_),<br>
-        static_cast<ParamGenerator<T8> >(g8_),<br>
-        static_cast<ParamGenerator<T9> >(g9_),<br>
-        static_cast<ParamGenerator<T10> >(g10_)));<br>
-  }<br>
-<br>
- private:<br>
-  // No implementation - assignment is unsupported.<br>
-  void operator=(const CartesianProductHolder10& other);<br>
-<br>
-  const Generator1 g1_;<br>
-  const Generator2 g2_;<br>
-  const Generator3 g3_;<br>
-  const Generator4 g4_;<br>
-  const Generator5 g5_;<br>
-  const Generator6 g6_;<br>
-  const Generator7 g7_;<br>
-  const Generator8 g8_;<br>
-  const Generator9 g9_;<br>
-  const Generator10 g10_;<br>
-};  // class CartesianProductHolder10<br>
-<br>
-# endif  // GTEST_HAS_COMBINE<br>
-<br>
-}  // namespace internal<br>
-}  // namespace testing<br>
-<br>
-#ifdef __clang__<br>
-#if __has_warning("-Wdeprecated-copy")<br>
-#pragma clang diagnostic pop<br>
-#endif<br>
-#endif<br>
-<br>
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_GENERATED_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
index d64f620c4c674..97533993c0c3c 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-param-util.h<br>
@@ -37,18 +37,19 @@<br>
<br>
 #include <ctype.h><br>
<br>
+#include <cassert><br>
 #include <iterator><br>
+#include <memory><br>
 #include <set><br>
+#include <tuple><br>
 #include <utility><br>
 #include <vector><br>
<br>
 #include "gtest/internal/gtest-internal.h"<br>
-#include "gtest/internal/gtest-linked_ptr.h"<br>
 #include "gtest/internal/gtest-port.h"<br>
 #include "gtest/gtest-printers.h"<br>
<br>
 namespace testing {<br>
-<br>
 // Input to a parameterized test name generator, describing a test parameter.<br>
 // Consists of the parameter value and the integer parameter index.<br>
 template <class ParamType><br>
@@ -72,13 +73,14 @@ struct PrintToStringParamName {<br>
 namespace internal {<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
+// Utility Functions<br>
+<br>
 // Outputs a message explaining invalid registration of <br>
diff erent<br>
-// fixture class for the same test case. This may happen when<br>
+// fixture class for the same test suite. This may happen when<br>
 // TEST_P macro is used to define two tests with the same name<br>
 // but in <br>
diff erent namespaces.<br>
-GTEST_API_ void ReportInvalidTestCaseType(const char* test_case_name,<br>
-                                          CodeLocation code_location);<br>
+GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name,<br>
+                                           CodeLocation code_location);<br>
<br>
 template <typename> class ParamGeneratorInterface;<br>
 template <typename> class ParamGenerator;<br>
@@ -153,7 +155,7 @@ class ParamIterator {<br>
  private:<br>
   friend class ParamGenerator<T>;<br>
   explicit ParamIterator(ParamIteratorInterface<T>* impl) : impl_(impl) {}<br>
-  scoped_ptr<ParamIteratorInterface<T> > impl_;<br>
+  std::unique_ptr<ParamIteratorInterface<T> > impl_;<br>
 };<br>
<br>
 // ParamGeneratorInterface<T> is the binary interface to access generators<br>
@@ -192,7 +194,7 @@ class ParamGenerator {<br>
   iterator end() const { return iterator(impl_->End()); }<br>
<br>
  private:<br>
-  linked_ptr<const ParamGeneratorInterface<T> > impl_;<br>
+  std::shared_ptr<const ParamGeneratorInterface<T> > impl_;<br>
 };<br>
<br>
 // Generates values from a range of two comparable values. Can be used to<br>
@@ -205,12 +207,12 @@ class RangeGenerator : public ParamGeneratorInterface<T> {<br>
   RangeGenerator(T begin, T end, IncrementT step)<br>
       : begin_(begin), end_(end),<br>
         step_(step), end_index_(CalculateEndIndex(begin, end, step)) {}<br>
-  virtual ~RangeGenerator() {}<br>
+  ~RangeGenerator() override {}<br>
<br>
-  virtual ParamIteratorInterface<T>* Begin() const {<br>
+  ParamIteratorInterface<T>* Begin() const override {<br>
     return new Iterator(this, begin_, 0, step_);<br>
   }<br>
-  virtual ParamIteratorInterface<T>* End() const {<br>
+  ParamIteratorInterface<T>* End() const override {<br>
     return new Iterator(this, end_, end_index_, step_);<br>
   }<br>
<br>
@@ -220,20 +222,20 @@ class RangeGenerator : public ParamGeneratorInterface<T> {<br>
     Iterator(const ParamGeneratorInterface<T>* base, T value, int index,<br>
              IncrementT step)<br>
         : base_(base), value_(value), index_(index), step_(step) {}<br>
-    virtual ~Iterator() {}<br>
+    ~Iterator() override {}<br>
<br>
-    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {<br>
+    const ParamGeneratorInterface<T>* BaseGenerator() const override {<br>
       return base_;<br>
     }<br>
-    virtual void Advance() {<br>
+    void Advance() override {<br>
       value_ = static_cast<T>(value_ + step_);<br>
       index_++;<br>
     }<br>
-    virtual ParamIteratorInterface<T>* Clone() const {<br>
+    ParamIteratorInterface<T>* Clone() const override {<br>
       return new Iterator(*this);<br>
     }<br>
-    virtual const T* Current() const { return &value_; }<br>
-    virtual bool Equals(const ParamIteratorInterface<T>& other) const {<br>
+    const T* Current() const override { return &value_; }<br>
+    bool Equals(const ParamIteratorInterface<T>& other) const override {<br>
       // Having the same base generator guarantees that the other<br>
       // iterator is of the same type and we can downcast.<br>
       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
@@ -290,12 +292,12 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
   template <typename ForwardIterator><br>
   ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end)<br>
       : container_(begin, end) {}<br>
-  virtual ~ValuesInIteratorRangeGenerator() {}<br>
+  ~ValuesInIteratorRangeGenerator() override {}<br>
<br>
-  virtual ParamIteratorInterface<T>* Begin() const {<br>
+  ParamIteratorInterface<T>* Begin() const override {<br>
     return new Iterator(this, container_.begin());<br>
   }<br>
-  virtual ParamIteratorInterface<T>* End() const {<br>
+  ParamIteratorInterface<T>* End() const override {<br>
     return new Iterator(this, container_.end());<br>
   }<br>
<br>
@@ -307,16 +309,16 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
     Iterator(const ParamGeneratorInterface<T>* base,<br>
              typename ContainerType::const_iterator iterator)<br>
         : base_(base), iterator_(iterator) {}<br>
-    virtual ~Iterator() {}<br>
+    ~Iterator() override {}<br>
<br>
-    virtual const ParamGeneratorInterface<T>* BaseGenerator() const {<br>
+    const ParamGeneratorInterface<T>* BaseGenerator() const override {<br>
       return base_;<br>
     }<br>
-    virtual void Advance() {<br>
+    void Advance() override {<br>
       ++iterator_;<br>
       value_.reset();<br>
     }<br>
-    virtual ParamIteratorInterface<T>* Clone() const {<br>
+    ParamIteratorInterface<T>* Clone() const override {<br>
       return new Iterator(*this);<br>
     }<br>
     // We need to use cached value referenced by iterator_ because *iterator_<br>
@@ -326,12 +328,11 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
     // can advance iterator_ beyond the end of the range, and we cannot<br>
     // detect that fact. The client code, on the other hand, is<br>
     // responsible for not calling Current() on an out-of-range iterator.<br>
-    virtual const T* Current() const {<br>
-      if (value_.get() == NULL)<br>
-        value_.reset(new T(*iterator_));<br>
+    const T* Current() const override {<br>
+      if (value_.get() == nullptr) value_.reset(new T(*iterator_));<br>
       return value_.get();<br>
     }<br>
-    virtual bool Equals(const ParamIteratorInterface<T>& other) const {<br>
+    bool Equals(const ParamIteratorInterface<T>& other) const override {<br>
       // Having the same base generator guarantees that the other<br>
       // iterator is of the same type and we can downcast.<br>
       GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
@@ -354,9 +355,9 @@ class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface<T> {<br>
     // A cached value of *iterator_. We keep it here to allow access by<br>
     // pointer in the wrapping iterator's operator->().<br>
     // value_ needs to be mutable to be accessed in Current().<br>
-    // Use of scoped_ptr helps manage cached value's lifetime,<br>
+    // Use of std::unique_ptr helps manage cached value's lifetime,<br>
     // which is bound by the lifespan of the iterator itself.<br>
-    mutable scoped_ptr<const T> value_;<br>
+    mutable std::unique_ptr<const T> value_;<br>
   };  // class ValuesInIteratorRangeGenerator::Iterator<br>
<br>
   // No implementation - assignment is unsupported.<br>
@@ -376,25 +377,12 @@ std::string DefaultParamName(const TestParamInfo<ParamType>& info) {<br>
   return name_stream.GetString();<br>
 }<br>
<br>
-// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
-//<br>
-// Parameterized test name overload helpers, which help the<br>
-// INSTANTIATE_TEST_CASE_P macro choose between the default parameterized<br>
-// test name generator and user param name generator.<br>
-template <class ParamType, class ParamNameGenFunctor><br>
-ParamNameGenFunctor GetParamNameGen(ParamNameGenFunctor func) {<br>
-  return func;<br>
-}<br>
-<br>
-template <class ParamType><br>
-struct ParamNameGenFunc {<br>
-  typedef std::string Type(const TestParamInfo<ParamType>&);<br>
-};<br>
-<br>
-template <class ParamType><br>
-typename ParamNameGenFunc<ParamType>::Type *GetParamNameGen() {<br>
-  return DefaultParamName;<br>
+template <typename T = int><br>
+void TestNotEmpty() {<br>
+  static_assert(sizeof(T) == 0, "Empty arguments are not allowed.");<br>
 }<br>
+template <typename T = int><br>
+void TestNotEmpty(const T&) {}<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
@@ -406,7 +394,7 @@ class ParameterizedTestFactory : public TestFactoryBase {<br>
   typedef typename TestClass::ParamType ParamType;<br>
   explicit ParameterizedTestFactory(ParamType parameter) :<br>
       parameter_(parameter) {}<br>
-  virtual Test* CreateTest() {<br>
+  Test* CreateTest() override {<br>
     TestClass::SetParam(&parameter_);<br>
     return new TestClass();<br>
   }<br>
@@ -434,19 +422,19 @@ class TestMetaFactoryBase {<br>
 // TestMetaFactory creates test factories for passing into<br>
 // MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives<br>
 // ownership of test factory pointer, same factory object cannot be passed<br>
-// into that method twice. But ParameterizedTestCaseInfo is going to call<br>
+// into that method twice. But ParameterizedTestSuiteInfo is going to call<br>
 // it for each Test/Parameter value combination. Thus it needs meta factory<br>
 // creator class.<br>
-template <class TestCase><br>
+template <class TestSuite><br>
 class TestMetaFactory<br>
-    : public TestMetaFactoryBase<typename TestCase::ParamType> {<br>
+    : public TestMetaFactoryBase<typename TestSuite::ParamType> {<br>
  public:<br>
-  typedef typename TestCase::ParamType ParamType;<br>
+  using ParamType = typename TestSuite::ParamType;<br>
<br>
   TestMetaFactory() {}<br>
<br>
-  virtual TestFactoryBase* CreateTestFactory(ParamType parameter) {<br>
-    return new ParameterizedTestFactory<TestCase>(parameter);<br>
+  TestFactoryBase* CreateTestFactory(ParamType parameter) override {<br>
+    return new ParameterizedTestFactory<TestSuite>(parameter);<br>
   }<br>
<br>
  private:<br>
@@ -455,93 +443,93 @@ class TestMetaFactory<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
-// ParameterizedTestCaseInfoBase is a generic interface<br>
-// to ParameterizedTestCaseInfo classes. ParameterizedTestCaseInfoBase<br>
+// ParameterizedTestSuiteInfoBase is a generic interface<br>
+// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase<br>
 // accumulates test information provided by TEST_P macro invocations<br>
-// and generators provided by INSTANTIATE_TEST_CASE_P macro invocations<br>
+// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations<br>
 // and uses that information to register all resulting test instances<br>
-// in RegisterTests method. The ParameterizeTestCaseRegistry class holds<br>
-// a collection of pointers to the ParameterizedTestCaseInfo objects<br>
+// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds<br>
+// a collection of pointers to the ParameterizedTestSuiteInfo objects<br>
 // and calls RegisterTests() on each of them when asked.<br>
-class ParameterizedTestCaseInfoBase {<br>
+class ParameterizedTestSuiteInfoBase {<br>
  public:<br>
-  virtual ~ParameterizedTestCaseInfoBase() {}<br>
+  virtual ~ParameterizedTestSuiteInfoBase() {}<br>
<br>
-  // Base part of test case name for display purposes.<br>
-  virtual const std::string& GetTestCaseName() const = 0;<br>
+  // Base part of test suite name for display purposes.<br>
+  virtual const std::string& GetTestSuiteName() const = 0;<br>
   // Test case id to verify identity.<br>
-  virtual TypeId GetTestCaseTypeId() const = 0;<br>
+  virtual TypeId GetTestSuiteTypeId() const = 0;<br>
   // UnitTest class invokes this method to register tests in this<br>
-  // test case right before running them in RUN_ALL_TESTS macro.<br>
-  // This method should not be called more then once on any single<br>
-  // instance of a ParameterizedTestCaseInfoBase derived class.<br>
+  // test suite right before running them in RUN_ALL_TESTS macro.<br>
+  // This method should not be called more than once on any single<br>
+  // instance of a ParameterizedTestSuiteInfoBase derived class.<br>
   virtual void RegisterTests() = 0;<br>
<br>
  protected:<br>
-  ParameterizedTestCaseInfoBase() {}<br>
+  ParameterizedTestSuiteInfoBase() {}<br>
<br>
  private:<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfoBase);<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase);<br>
 };<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
-// ParameterizedTestCaseInfo accumulates tests obtained from TEST_P<br>
-// macro invocations for a particular test case and generators<br>
-// obtained from INSTANTIATE_TEST_CASE_P macro invocations for that<br>
-// test case. It registers tests with all values generated by all<br>
+// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P<br>
+// macro invocations for a particular test suite and generators<br>
+// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that<br>
+// test suite. It registers tests with all values generated by all<br>
 // generators when asked.<br>
-template <class TestCase><br>
-class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
+template <class TestSuite><br>
+class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase {<br>
  public:<br>
   // ParamType and GeneratorCreationFunc are private types but are required<br>
   // for declarations of public methods AddTestPattern() and<br>
-  // AddTestCaseInstantiation().<br>
-  typedef typename TestCase::ParamType ParamType;<br>
+  // AddTestSuiteInstantiation().<br>
+  using ParamType = typename TestSuite::ParamType;<br>
   // A function that returns an instance of appropriate generator type.<br>
   typedef ParamGenerator<ParamType>(GeneratorCreationFunc)();<br>
-  typedef typename ParamNameGenFunc<ParamType>::Type ParamNameGeneratorFunc;<br>
+  using ParamNameGeneratorFunc = std::string(const TestParamInfo<ParamType>&);<br>
<br>
-  explicit ParameterizedTestCaseInfo(<br>
-      const char* name, CodeLocation code_location)<br>
-      : test_case_name_(name), code_location_(code_location) {}<br>
+  explicit ParameterizedTestSuiteInfo(const char* name,<br>
+                                      CodeLocation code_location)<br>
+      : test_suite_name_(name), code_location_(code_location) {}<br>
<br>
   // Test case base name for display purposes.<br>
-  virtual const std::string& GetTestCaseName() const { return test_case_name_; }<br>
+  const std::string& GetTestSuiteName() const override {<br>
+    return test_suite_name_;<br>
+  }<br>
   // Test case id to verify identity.<br>
-  virtual TypeId GetTestCaseTypeId() const { return GetTypeId<TestCase>(); }<br>
+  TypeId GetTestSuiteTypeId() const override { return GetTypeId<TestSuite>(); }<br>
   // TEST_P macro uses AddTestPattern() to record information<br>
   // about a single test in a LocalTestInfo structure.<br>
-  // test_case_name is the base name of the test case (without invocation<br>
+  // test_suite_name is the base name of the test suite (without invocation<br>
   // prefix). test_base_name is the name of an individual test without<br>
   // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is<br>
-  // test case base name and DoBar is test base name.<br>
-  void AddTestPattern(const char* test_case_name,<br>
-                      const char* test_base_name,<br>
+  // test suite base name and DoBar is test base name.<br>
+  void AddTestPattern(const char* test_suite_name, const char* test_base_name,<br>
                       TestMetaFactoryBase<ParamType>* meta_factory) {<br>
-    tests_.push_back(linked_ptr<TestInfo>(new TestInfo(test_case_name,<br>
-                                                       test_base_name,<br>
-                                                       meta_factory)));<br>
+    tests_.push_back(std::shared_ptr<TestInfo>(<br>
+        new TestInfo(test_suite_name, test_base_name, meta_factory)));<br>
   }<br>
-  // INSTANTIATE_TEST_CASE_P macro uses AddGenerator() to record information<br>
+  // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information<br>
   // about a generator.<br>
-  int AddTestCaseInstantiation(const std::string& instantiation_name,<br>
-                               GeneratorCreationFunc* func,<br>
-                               ParamNameGeneratorFunc* name_func,<br>
-                               const char* file, int line) {<br>
+  int AddTestSuiteInstantiation(const std::string& instantiation_name,<br>
+                                GeneratorCreationFunc* func,<br>
+                                ParamNameGeneratorFunc* name_func,<br>
+                                const char* file, int line) {<br>
     instantiations_.push_back(<br>
         InstantiationInfo(instantiation_name, func, name_func, file, line));<br>
     return 0;  // Return value used only to run this method in namespace scope.<br>
   }<br>
-  // UnitTest class invokes this method to register tests in this test case<br>
-  // test cases right before running tests in RUN_ALL_TESTS macro.<br>
-  // This method should not be called more then once on any single<br>
-  // instance of a ParameterizedTestCaseInfoBase derived class.<br>
-  // UnitTest has a guard to prevent from calling this method more then once.<br>
-  virtual void RegisterTests() {<br>
+  // UnitTest class invokes this method to register tests in this test suite<br>
+  // test suites right before running tests in RUN_ALL_TESTS macro.<br>
+  // This method should not be called more than once on any single<br>
+  // instance of a ParameterizedTestSuiteInfoBase derived class.<br>
+  // UnitTest has a guard to prevent from calling this method more than once.<br>
+  void RegisterTests() override {<br>
     for (typename TestInfoContainer::iterator test_it = tests_.begin();<br>
          test_it != tests_.end(); ++test_it) {<br>
-      linked_ptr<TestInfo> test_info = *test_it;<br>
+      std::shared_ptr<TestInfo> test_info = *test_it;<br>
       for (typename InstantiationContainer::iterator gen_it =<br>
                instantiations_.begin(); gen_it != instantiations_.end();<br>
                ++gen_it) {<br>
@@ -551,10 +539,10 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
         const char* file = gen_it->file;<br>
         int line = gen_it->line;<br>
<br>
-        std::string test_case_name;<br>
+        std::string test_suite_name;<br>
         if ( !instantiation_name.empty() )<br>
-          test_case_name = instantiation_name + "/";<br>
-        test_case_name += test_info->test_case_base_name;<br>
+          test_suite_name = instantiation_name + "/";<br>
+        test_suite_name += test_info->test_suite_base_name;<br>
<br>
         size_t i = 0;<br>
         std::set<std::string> test_param_names;<br>
@@ -577,39 +565,39 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
<br>
           test_param_names.insert(param_name);<br>
<br>
-          test_name_stream << test_info->test_base_name << "/" << param_name;<br>
+          if (!test_info->test_base_name.empty()) {<br>
+            test_name_stream << test_info->test_base_name << "/";<br>
+          }<br>
+          test_name_stream << param_name;<br>
           MakeAndRegisterTestInfo(<br>
-              test_case_name.c_str(),<br>
-              test_name_stream.GetString().c_str(),<br>
-              NULL,  // No type parameter.<br>
-              PrintToString(*param_it).c_str(),<br>
-              code_location_,<br>
-              GetTestCaseTypeId(),<br>
-              TestCase::SetUpTestCase,<br>
-              TestCase::TearDownTestCase,<br>
+              test_suite_name.c_str(), test_name_stream.GetString().c_str(),<br>
+              nullptr,  // No type parameter.<br>
+              PrintToString(*param_it).c_str(), code_location_,<br>
+              GetTestSuiteTypeId(),<br>
+              SuiteApiResolver<TestSuite>::GetSetUpCaseOrSuite(file, line),<br>
+              SuiteApiResolver<TestSuite>::GetTearDownCaseOrSuite(file, line),<br>
               test_info->test_meta_factory->CreateTestFactory(*param_it));<br>
         }  // for param_it<br>
       }  // for gen_it<br>
     }  // for test_it<br>
-  }  // RegisterTests<br>
+  }    // RegisterTests<br>
<br>
  private:<br>
   // LocalTestInfo structure keeps information about a single test registered<br>
   // with TEST_P macro.<br>
   struct TestInfo {<br>
-    TestInfo(const char* a_test_case_base_name,<br>
-             const char* a_test_base_name,<br>
-             TestMetaFactoryBase<ParamType>* a_test_meta_factory) :<br>
-        test_case_base_name(a_test_case_base_name),<br>
-        test_base_name(a_test_base_name),<br>
-        test_meta_factory(a_test_meta_factory) {}<br>
-<br>
-    const std::string test_case_base_name;<br>
+    TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name,<br>
+             TestMetaFactoryBase<ParamType>* a_test_meta_factory)<br>
+        : test_suite_base_name(a_test_suite_base_name),<br>
+          test_base_name(a_test_base_name),<br>
+          test_meta_factory(a_test_meta_factory) {}<br>
+<br>
+    const std::string test_suite_base_name;<br>
     const std::string test_base_name;<br>
-    const scoped_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;<br>
+    const std::unique_ptr<TestMetaFactoryBase<ParamType> > test_meta_factory;<br>
   };<br>
-  typedef ::std::vector<linked_ptr<TestInfo> > TestInfoContainer;<br>
-  // Records data received from INSTANTIATE_TEST_CASE_P macros:<br>
+  using TestInfoContainer = ::std::vector<std::shared_ptr<TestInfo> >;<br>
+  // Records data received from INSTANTIATE_TEST_SUITE_P macros:<br>
   //  <Instantiation name, Sequence generator creation function,<br>
   //     Name generator function, Source file, Source line><br>
   struct InstantiationInfo {<br>
@@ -646,76 +634,247 @@ class ParameterizedTestCaseInfo : public ParameterizedTestCaseInfoBase {<br>
     return true;<br>
   }<br>
<br>
-  const std::string test_case_name_;<br>
+  const std::string test_suite_name_;<br>
   CodeLocation code_location_;<br>
   TestInfoContainer tests_;<br>
   InstantiationContainer instantiations_;<br>
<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseInfo);<br>
-};  // class ParameterizedTestCaseInfo<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo);<br>
+};  // class ParameterizedTestSuiteInfo<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+template <class TestCase><br>
+using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo<TestCase>;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
-// ParameterizedTestCaseRegistry contains a map of ParameterizedTestCaseInfoBase<br>
-// classes accessed by test case names. TEST_P and INSTANTIATE_TEST_CASE_P<br>
-// macros use it to locate their corresponding ParameterizedTestCaseInfo<br>
-// descriptors.<br>
-class ParameterizedTestCaseRegistry {<br>
+// ParameterizedTestSuiteRegistry contains a map of<br>
+// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P<br>
+// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding<br>
+// ParameterizedTestSuiteInfo descriptors.<br>
+class ParameterizedTestSuiteRegistry {<br>
  public:<br>
-  ParameterizedTestCaseRegistry() {}<br>
-  ~ParameterizedTestCaseRegistry() {<br>
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
-         it != test_case_infos_.end(); ++it) {<br>
-      delete *it;<br>
+  ParameterizedTestSuiteRegistry() {}<br>
+  ~ParameterizedTestSuiteRegistry() {<br>
+    for (auto& test_suite_info : test_suite_infos_) {<br>
+      delete test_suite_info;<br>
     }<br>
   }<br>
<br>
   // Looks up or creates and returns a structure containing information about<br>
-  // tests and instantiations of a particular test case.<br>
-  template <class TestCase><br>
-  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(<br>
-      const char* test_case_name,<br>
-      CodeLocation code_location) {<br>
-    ParameterizedTestCaseInfo<TestCase>* typed_test_info = NULL;<br>
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
-         it != test_case_infos_.end(); ++it) {<br>
-      if ((*it)->GetTestCaseName() == test_case_name) {<br>
-        if ((*it)->GetTestCaseTypeId() != GetTypeId<TestCase>()) {<br>
+  // tests and instantiations of a particular test suite.<br>
+  template <class TestSuite><br>
+  ParameterizedTestSuiteInfo<TestSuite>* GetTestSuitePatternHolder(<br>
+      const char* test_suite_name, CodeLocation code_location) {<br>
+    ParameterizedTestSuiteInfo<TestSuite>* typed_test_info = nullptr;<br>
+    for (auto& test_suite_info : test_suite_infos_) {<br>
+      if (test_suite_info->GetTestSuiteName() == test_suite_name) {<br>
+        if (test_suite_info->GetTestSuiteTypeId() != GetTypeId<TestSuite>()) {<br>
           // Complain about incorrect usage of Google Test facilities<br>
           // and terminate the program since we cannot guaranty correct<br>
-          // test case setup and tear-down in this case.<br>
-          ReportInvalidTestCaseType(test_case_name, code_location);<br>
+          // test suite setup and tear-down in this case.<br>
+          ReportInvalidTestSuiteType(test_suite_name, code_location);<br>
           posix::Abort();<br>
         } else {<br>
           // At this point we are sure that the object we found is of the same<br>
           // type we are looking for, so we downcast it to that type<br>
           // without further checks.<br>
           typed_test_info = CheckedDowncastToActualType<<br>
-              ParameterizedTestCaseInfo<TestCase> >(*it);<br>
+              ParameterizedTestSuiteInfo<TestSuite> >(test_suite_info);<br>
         }<br>
         break;<br>
       }<br>
     }<br>
-    if (typed_test_info == NULL) {<br>
-      typed_test_info = new ParameterizedTestCaseInfo<TestCase>(<br>
-          test_case_name, code_location);<br>
-      test_case_infos_.push_back(typed_test_info);<br>
+    if (typed_test_info == nullptr) {<br>
+      typed_test_info = new ParameterizedTestSuiteInfo<TestSuite>(<br>
+          test_suite_name, code_location);<br>
+      test_suite_infos_.push_back(typed_test_info);<br>
     }<br>
     return typed_test_info;<br>
   }<br>
   void RegisterTests() {<br>
-    for (TestCaseInfoContainer::iterator it = test_case_infos_.begin();<br>
-         it != test_case_infos_.end(); ++it) {<br>
-      (*it)->RegisterTests();<br>
+    for (auto& test_suite_info : test_suite_infos_) {<br>
+      test_suite_info->RegisterTests();<br>
     }<br>
   }<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  template <class TestCase><br>
+  ParameterizedTestCaseInfo<TestCase>* GetTestCasePatternHolder(<br>
+      const char* test_case_name, CodeLocation code_location) {<br>
+    return GetTestSuitePatternHolder<TestCase>(test_case_name, code_location);<br>
+  }<br>
+<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+ private:<br>
+  using TestSuiteInfoContainer = ::std::vector<ParameterizedTestSuiteInfoBase*>;<br>
+<br>
+  TestSuiteInfoContainer test_suite_infos_;<br>
+<br>
+  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry);<br>
+};<br>
+<br>
+}  // namespace internal<br>
+<br>
+// Forward declarations of ValuesIn(), which is implemented in<br>
+// include/gtest/gtest-param-test.h.<br>
+template <class Container><br>
+internal::ParamGenerator<typename Container::value_type> ValuesIn(<br>
+    const Container& container);<br>
+<br>
+namespace internal {<br>
+// Used in the Values() function to provide polymorphic capabilities.<br>
+<br>
+template <typename... Ts><br>
+class ValueArray {<br>
+ public:<br>
+  ValueArray(Ts... v) : v_{std::move(v)...} {}<br>
+<br>
+  template <typename T><br>
+  operator ParamGenerator<T>() const {  // NOLINT<br>
+    return ValuesIn(MakeVector<T>(MakeIndexSequence<sizeof...(Ts)>()));<br>
+  }<br>
<br>
  private:<br>
-  typedef ::std::vector<ParameterizedTestCaseInfoBase*> TestCaseInfoContainer;<br>
+  template <typename T, size_t... I><br>
+  std::vector<T> MakeVector(IndexSequence<I...>) const {<br>
+    return std::vector<T>{static_cast<T>(v_.template Get<I>())...};<br>
+  }<br>
<br>
-  TestCaseInfoContainer test_case_infos_;<br>
+  FlatTuple<Ts...> v_;<br>
+};<br>
<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestCaseRegistry);<br>
+template <typename... T><br>
+class CartesianProductGenerator<br>
+    : public ParamGeneratorInterface<::std::tuple<T...>> {<br>
+ public:<br>
+  typedef ::std::tuple<T...> ParamType;<br>
+<br>
+  CartesianProductGenerator(const std::tuple<ParamGenerator<T>...>& g)<br>
+      : generators_(g) {}<br>
+  ~CartesianProductGenerator() override {}<br>
+<br>
+  ParamIteratorInterface<ParamType>* Begin() const override {<br>
+    return new Iterator(this, generators_, false);<br>
+  }<br>
+  ParamIteratorInterface<ParamType>* End() const override {<br>
+    return new Iterator(this, generators_, true);<br>
+  }<br>
+<br>
+ private:<br>
+  template <class I><br>
+  class IteratorImpl;<br>
+  template <size_t... I><br>
+  class IteratorImpl<IndexSequence<I...>><br>
+      : public ParamIteratorInterface<ParamType> {<br>
+   public:<br>
+    IteratorImpl(const ParamGeneratorInterface<ParamType>* base,<br>
+             const std::tuple<ParamGenerator<T>...>& generators, bool is_end)<br>
+        : base_(base),<br>
+          begin_(std::get<I>(generators).begin()...),<br>
+          end_(std::get<I>(generators).end()...),<br>
+          current_(is_end ? end_ : begin_) {<br>
+      ComputeCurrentValue();<br>
+    }<br>
+    ~IteratorImpl() override {}<br>
+<br>
+    const ParamGeneratorInterface<ParamType>* BaseGenerator() const override {<br>
+      return base_;<br>
+    }<br>
+    // Advance should not be called on beyond-of-range iterators<br>
+    // so no component iterators must be beyond end of range, either.<br>
+    void Advance() override {<br>
+      assert(!AtEnd());<br>
+      // Advance the last iterator.<br>
+      ++std::get<sizeof...(T) - 1>(current_);<br>
+      // if that reaches end, propagate that up.<br>
+      AdvanceIfEnd<sizeof...(T) - 1>();<br>
+      ComputeCurrentValue();<br>
+    }<br>
+    ParamIteratorInterface<ParamType>* Clone() const override {<br>
+      return new IteratorImpl(*this);<br>
+    }<br>
+<br>
+    const ParamType* Current() const override { return current_value_.get(); }<br>
+<br>
+    bool Equals(const ParamIteratorInterface<ParamType>& other) const override {<br>
+      // Having the same base generator guarantees that the other<br>
+      // iterator is of the same type and we can downcast.<br>
+      GTEST_CHECK_(BaseGenerator() == other.BaseGenerator())<br>
+          << "The program attempted to compare iterators "<br>
+          << "from <br>
diff erent generators." << std::endl;<br>
+      const IteratorImpl* typed_other =<br>
+          CheckedDowncastToActualType<const IteratorImpl>(&other);<br>
+<br>
+      // We must report iterators equal if they both point beyond their<br>
+      // respective ranges. That can happen in a variety of fashions,<br>
+      // so we have to consult AtEnd().<br>
+      if (AtEnd() && typed_other->AtEnd()) return true;<br>
+<br>
+      bool same = true;<br>
+      bool dummy[] = {<br>
+          (same = same && std::get<I>(current_) ==<br>
+                              std::get<I>(typed_other->current_))...};<br>
+      (void)dummy;<br>
+      return same;<br>
+    }<br>
+<br>
+   private:<br>
+    template <size_t ThisI><br>
+    void AdvanceIfEnd() {<br>
+      if (std::get<ThisI>(current_) != std::get<ThisI>(end_)) return;<br>
+<br>
+      bool last = ThisI == 0;<br>
+      if (last) {<br>
+        // We are done. Nothing else to propagate.<br>
+        return;<br>
+      }<br>
+<br>
+      constexpr size_t NextI = ThisI - (ThisI != 0);<br>
+      std::get<ThisI>(current_) = std::get<ThisI>(begin_);<br>
+      ++std::get<NextI>(current_);<br>
+      AdvanceIfEnd<NextI>();<br>
+    }<br>
+<br>
+    void ComputeCurrentValue() {<br>
+      if (!AtEnd())<br>
+        current_value_ = std::make_shared<ParamType>(*std::get<I>(current_)...);<br>
+    }<br>
+    bool AtEnd() const {<br>
+      bool at_end = false;<br>
+      bool dummy[] = {<br>
+          (at_end = at_end || std::get<I>(current_) == std::get<I>(end_))...};<br>
+      (void)dummy;<br>
+      return at_end;<br>
+    }<br>
+<br>
+    const ParamGeneratorInterface<ParamType>* const base_;<br>
+    std::tuple<typename ParamGenerator<T>::iterator...> begin_;<br>
+    std::tuple<typename ParamGenerator<T>::iterator...> end_;<br>
+    std::tuple<typename ParamGenerator<T>::iterator...> current_;<br>
+    std::shared_ptr<ParamType> current_value_;<br>
+  };<br>
+<br>
+  using Iterator = IteratorImpl<typename MakeIndexSequence<sizeof...(T)>::type>;<br>
+<br>
+  std::tuple<ParamGenerator<T>...> generators_;<br>
+};<br>
+<br>
+template <class... Gen><br>
+class CartesianProductHolder {<br>
+ public:<br>
+  CartesianProductHolder(const Gen&... g) : generators_(g...) {}<br>
+  template <typename... T><br>
+  operator ParamGenerator<::std::tuple<T...>>() const {<br>
+    return ParamGenerator<::std::tuple<T...>>(<br>
+        new CartesianProductGenerator<T...>(generators_));<br>
+  }<br>
+<br>
+ private:<br>
+  std::tuple<Gen...> generators_;<br>
 };<br>
<br>
 }  // namespace internal<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
index f83700e06d98c..cece93dba12d4 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port-arch.h<br>
@@ -38,14 +38,13 @@<br>
 // Determines the platform on which Google Test is compiled.<br>
 #ifdef __CYGWIN__<br>
 # define GTEST_OS_CYGWIN 1<br>
-#elif defined __SYMBIAN32__<br>
-# define GTEST_OS_SYMBIAN 1<br>
+# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__)<br>
+#  define GTEST_OS_WINDOWS_MINGW 1<br>
+#  define GTEST_OS_WINDOWS 1<br>
 #elif defined _WIN32<br>
 # define GTEST_OS_WINDOWS 1<br>
 # ifdef _WIN32_WCE<br>
 #  define GTEST_OS_WINDOWS_MOBILE 1<br>
-# elif defined(__MINGW__) || defined(__MINGW32__)<br>
-#  define GTEST_OS_WINDOWS_MINGW 1<br>
 # elif defined(WINAPI_FAMILY)<br>
 #  include <winapifamily.h><br>
 #  if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)<br>
@@ -65,15 +64,21 @@<br>
 # else<br>
 #  define GTEST_OS_WINDOWS_DESKTOP 1<br>
 # endif  // _WIN32_WCE<br>
+#elif defined __OS2__<br>
+# define GTEST_OS_OS2 1<br>
 #elif defined __APPLE__<br>
 # define GTEST_OS_MAC 1<br>
 # if TARGET_OS_IPHONE<br>
 #  define GTEST_OS_IOS 1<br>
 # endif<br>
+#elif defined __DragonFly__<br>
+# define GTEST_OS_DRAGONFLY 1<br>
 #elif defined __FreeBSD__<br>
 # define GTEST_OS_FREEBSD 1<br>
 #elif defined __Fuchsia__<br>
 # define GTEST_OS_FUCHSIA 1<br>
+#elif defined(__GLIBC__) && defined(__FreeBSD_kernel__)<br>
+# define GTEST_OS_GNU_KFREEBSD 1<br>
 #elif defined __linux__<br>
 # define GTEST_OS_LINUX 1<br>
 # if defined __ANDROID__<br>
@@ -95,6 +100,8 @@<br>
 # define GTEST_OS_OPENBSD 1<br>
 #elif defined __QNX__<br>
 # define GTEST_OS_QNX 1<br>
+#elif defined(__HAIKU__)<br>
+#define GTEST_OS_HAIKU 1<br>
 #endif  // __CYGWIN__<br>
<br>
 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
index 786497d854c97..063fcb1083bab 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-port.h<br>
@@ -72,10 +72,6 @@<br>
 //                              is/isn't available.<br>
 //   GTEST_HAS_EXCEPTIONS     - Define it to 1/0 to indicate that exceptions<br>
 //                              are enabled.<br>
-//   GTEST_HAS_GLOBAL_STRING  - Define it to 1/0 to indicate that ::string<br>
-//                              is/isn't available<br>
-//   GTEST_HAS_GLOBAL_WSTRING - Define it to 1/0 to indicate that ::wstring<br>
-//                              is/isn't available<br>
 //   GTEST_HAS_POSIX_RE       - Define it to 1/0 to indicate that POSIX regular<br>
 //                              expressions are/aren't available.<br>
 //   GTEST_HAS_PTHREAD        - Define it to 1/0 to indicate that <pthread.h><br>
@@ -85,8 +81,6 @@<br>
 //   GTEST_HAS_STD_WSTRING    - Define it to 1/0 to indicate that<br>
 //                              std::wstring does/doesn't work (Google Test can<br>
 //                              be used where std::wstring is unavailable).<br>
-//   GTEST_HAS_TR1_TUPLE      - Define it to 1/0 to indicate tr1::tuple<br>
-//                              is/isn't available.<br>
 //   GTEST_HAS_SEH            - Define it to 1/0 to indicate whether the<br>
 //                              compiler supports Microsoft's "Structured<br>
 //                              Exception Handling".<br>
@@ -94,12 +88,6 @@<br>
 //                            - Define it to 1/0 to indicate whether the<br>
 //                              platform supports I/O stream redirection using<br>
 //                              dup() and dup2().<br>
-//   GTEST_USE_OWN_TR1_TUPLE  - Define it to 1/0 to indicate whether Google<br>
-//                              Test's own tr1 tuple implementation should be<br>
-//                              used.  Unused when the user sets<br>
-//                              GTEST_HAS_TR1_TUPLE to 0.<br>
-//   GTEST_LANG_CXX11         - Define it to 1/0 to indicate that Google Test<br>
-//                              is building in C++11/C++98 mode.<br>
 //   GTEST_LINKED_AS_SHARED_LIBRARY<br>
 //                            - Define to 1 when compiling tests that use<br>
 //                              Google Test as a shared library (known as<br>
@@ -125,8 +113,11 @@<br>
 //<br>
 //   GTEST_OS_AIX      - IBM AIX<br>
 //   GTEST_OS_CYGWIN   - Cygwin<br>
+//   GTEST_OS_DRAGONFLY - DragonFlyBSD<br>
 //   GTEST_OS_FREEBSD  - FreeBSD<br>
 //   GTEST_OS_FUCHSIA  - Fuchsia<br>
+//   GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD<br>
+//   GTEST_OS_HAIKU    - Haiku<br>
 //   GTEST_OS_HPUX     - HP-UX<br>
 //   GTEST_OS_LINUX    - Linux<br>
 //     GTEST_OS_LINUX_ANDROID - Google Android<br>
@@ -135,9 +126,9 @@<br>
 //   GTEST_OS_NACL     - Google Native Client (NaCl)<br>
 //   GTEST_OS_NETBSD   - NetBSD<br>
 //   GTEST_OS_OPENBSD  - OpenBSD<br>
+//   GTEST_OS_OS2      - OS/2<br>
 //   GTEST_OS_QNX      - QNX<br>
 //   GTEST_OS_SOLARIS  - Sun Solaris<br>
-//   GTEST_OS_SYMBIAN  - Symbian<br>
 //   GTEST_OS_WINDOWS  - Windows (Desktop, MinGW, or Mobile)<br>
 //     GTEST_OS_WINDOWS_DESKTOP  - Windows Desktop<br>
 //     GTEST_OS_WINDOWS_MINGW    - MinGW<br>
@@ -146,7 +137,7 @@<br>
 //     GTEST_OS_WINDOWS_RT       - Windows Store App/WinRT<br>
 //   GTEST_OS_ZOS      - z/OS<br>
 //<br>
-// Among the platforms, Cygwin, Linux, Max OS X, and Windows have the<br>
+// Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the<br>
 // most stable support.  Since core members of the Google Test project<br>
 // don't have access to other platforms, support for them may be less<br>
 // stable.  If you notice any problems on your platform, please notify<br>
@@ -172,8 +163,6 @@<br>
 //   EXPECT_DEATH(DoSomethingDeadly());<br>
 // #endif<br>
 //<br>
-//   GTEST_HAS_COMBINE      - the Combine() function (for value-parameterized<br>
-//                            tests)<br>
 //   GTEST_HAS_DEATH_TEST   - death tests<br>
 //   GTEST_HAS_TYPED_TEST   - typed tests<br>
 //   GTEST_HAS_TYPED_TEST_P - type-parameterized tests<br>
@@ -184,7 +173,6 @@<br>
 //                            define themselves.<br>
 //   GTEST_USES_SIMPLE_RE   - our own simple regex is used;<br>
 //                            the above RE\b(s) are mutually exclusive.<br>
-//   GTEST_CAN_COMPARE_NULL - accepts untyped NULL in EXPECT_EQ().<br>
<br>
 // Misc public macros<br>
 // ------------------<br>
@@ -210,23 +198,10 @@<br>
 //   GTEST_INTENTIONAL_CONST_COND_POP_  - finish code section where MSVC C4127<br>
 //                                        is suppressed.<br>
 //<br>
-// C++11 feature wrappers:<br>
-//<br>
-//   testing::internal::forward - portability wrapper for std::forward.<br>
-//   testing::internal::move  - portability wrapper for std::move.<br>
-//<br>
 // Synchronization:<br>
 //   Mutex, MutexLock, ThreadLocal, GetThreadCount()<br>
 //                            - synchronization primitives.<br>
 //<br>
-// Template meta programming:<br>
-//   is_pointer     - as in TR1; needed on Symbian and IBM XL C/C++ only.<br>
-//   IteratorTraits - partial implementation of std::iterator_traits, which<br>
-//                    is not available in libCstd when compiled with Sun C++.<br>
-//<br>
-// Smart pointers:<br>
-//   scoped_ptr     - as in TR2.<br>
-//<br>
 // Regular expressions:<br>
 //   RE             - a simple regular expression class using the POSIX<br>
 //                    Extended Regular Expression syntax on UNIX-like platforms<br>
@@ -262,12 +237,20 @@<br>
 //   BoolFromGTestEnv()   - parses a bool environment variable.<br>
 //   Int32FromGTestEnv()  - parses an Int32 environment variable.<br>
 //   StringFromGTestEnv() - parses a string environment variable.<br>
+//<br>
+// Deprecation warnings:<br>
+//   GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as<br>
+//                                        deprecated; calling a marked function<br>
+//                                        should generate a compiler warning<br>
<br>
 #include <ctype.h>   // for isspace, etc<br>
 #include <stddef.h>  // for ptr<br>
diff _t<br>
-#include <stdlib.h><br>
 #include <stdio.h><br>
+#include <stdlib.h><br>
 #include <string.h><br>
+#include <memory><br>
+#include <type_traits><br>
+<br>
 #ifndef _WIN32_WCE<br>
 # include <sys/types.h><br>
 # include <sys/stat.h><br>
@@ -278,12 +261,11 @@<br>
 # include <TargetConditionals.h><br>
 #endif<br>
<br>
-// Brings in the definition of HAS_GLOBAL_STRING.  This must be done<br>
-// BEFORE we test HAS_GLOBAL_STRING.<br>
-#include <string>  // NOLINT<br>
 #include <algorithm>  // NOLINT<br>
-#include <iostream>  // NOLINT<br>
-#include <sstream>  // NOLINT<br>
+#include <iostream>   // NOLINT<br>
+#include <sstream>    // NOLINT<br>
+#include <string>     // NOLINT<br>
+#include <tuple><br>
 #include <utility><br>
 #include <vector>  // NOLINT<br>
<br>
@@ -315,14 +297,14 @@<br>
 //   GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385)<br>
 //   /* code that triggers warnings C4800 and C4385 */<br>
 //   GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
-#if _MSC_VER >= 1400<br>
+#if defined(_MSC_VER)<br>
 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \<br>
     __pragma(warning(push))                        \<br>
     __pragma(warning(disable: warnings))<br>
 # define GTEST_DISABLE_MSC_WARNINGS_POP_()          \<br>
     __pragma(warning(pop))<br>
 #else<br>
-// Older versions of MSVC don't have __pragma.<br>
+// Not all compilers are MSVC<br>
 # define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings)<br>
 # define GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
 #endif<br>
@@ -343,80 +325,6 @@<br>
     GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
 #endif<br>
<br>
-#ifndef GTEST_LANG_CXX11<br>
-// gcc and clang define __GXX_EXPERIMENTAL_CXX0X__ when<br>
-// -std={c,gnu}++{0x,11} is passed.  The C++11 standard specifies a<br>
-// value for __cplusplus, and recent versions of clang, gcc, and<br>
-// probably other compilers set that too in C++11 mode.<br>
-# if __GXX_EXPERIMENTAL_CXX0X__ || __cplusplus >= 201103L || _MSC_VER >= 1900<br>
-// Compiling in at least C++11 mode.<br>
-#  define GTEST_LANG_CXX11 1<br>
-# else<br>
-#  define GTEST_LANG_CXX11 0<br>
-# endif<br>
-#endif<br>
-<br>
-// Distinct from C++11 language support, some environments don't provide<br>
-// proper C++11 library support. Notably, it's possible to build in<br>
-// C++11 mode when targeting Mac OS X 10.6, which has an old libstdc++<br>
-// with no C++11 support.<br>
-//<br>
-// libstdc++ has sufficient C++11 support as of GCC 4.6.0, __GLIBCXX__<br>
-// 20110325, but maintenance releases in the 4.4 and 4.5 series followed<br>
-// this date, so check for those versions by their date stamps.<br>
-// <a href="https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning-%23if" rel="noreferrer" target="_blank">https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning<br>
-#if</a> GTEST_LANG_CXX11 && \<br>
-    (!defined(__GLIBCXX__) || ( \<br>
-        __GLIBCXX__ >= 20110325ul &&  /* GCC >= 4.6.0 */ \<br>
-        /* Blacklist of patch releases of older branches: */ \<br>
-        __GLIBCXX__ != 20110416ul &&  /* GCC 4.4.6 */ \<br>
-        __GLIBCXX__ != 20120313ul &&  /* GCC 4.4.7 */ \<br>
-        __GLIBCXX__ != 20110428ul &&  /* GCC 4.5.3 */ \<br>
-        __GLIBCXX__ != 20120702ul))   /* GCC 4.5.4 */<br>
-# define GTEST_STDLIB_CXX11 1<br>
-#endif<br>
-<br>
-// Only use C++11 library features if the library provides them.<br>
-#if GTEST_STDLIB_CXX11<br>
-# define GTEST_HAS_STD_BEGIN_AND_END_ 1<br>
-# define GTEST_HAS_STD_FORWARD_LIST_ 1<br>
-# if !defined(_MSC_VER) || (_MSC_FULL_VER >= 190023824)<br>
-// works only with VS2015U2 and better<br>
-#   define GTEST_HAS_STD_FUNCTION_ 1<br>
-# endif<br>
-# define GTEST_HAS_STD_INITIALIZER_LIST_ 1<br>
-# define GTEST_HAS_STD_MOVE_ 1<br>
-# define GTEST_HAS_STD_UNIQUE_PTR_ 1<br>
-# define GTEST_HAS_STD_SHARED_PTR_ 1<br>
-# define GTEST_HAS_UNORDERED_MAP_ 1<br>
-# define GTEST_HAS_UNORDERED_SET_ 1<br>
-#endif<br>
-<br>
-// C++11 specifies that <tuple> provides std::tuple.<br>
-// Some platforms still might not have it, however.<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_HAS_STD_TUPLE_ 1<br>
-# if defined(__clang__)<br>
-// Inspired by<br>
-// <a href="https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros" rel="noreferrer" target="_blank">https://clang.llvm.org/docs/LanguageExtensions.html#include-file-checking-macros</a><br>
-#  if defined(__has_include) && !__has_include(<tuple>)<br>
-#   undef GTEST_HAS_STD_TUPLE_<br>
-#  endif<br>
-# elif defined(_MSC_VER)<br>
-// Inspired by boost/config/stdlib/dinkumware.hpp<br>
-#  if defined(_CPPLIB_VER) && _CPPLIB_VER < 520<br>
-#   undef GTEST_HAS_STD_TUPLE_<br>
-#  endif<br>
-# elif defined(__GLIBCXX__)<br>
-// Inspired by boost/config/stdlib/libstdcpp3.hpp,<br>
-// <a href="http://gcc.gnu.org/gcc-4.2/changes.html" rel="noreferrer" target="_blank">http://gcc.gnu.org/gcc-4.2/changes.html</a> and<br>
-// <a href="https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x" rel="noreferrer" target="_blank">https://web.archive.org/web/20140227044429/gcc.gnu.org/onlinedocs/libstdc++/manual/bk01pt01ch01.html#manual.intro.status.standard.200x</a><br>
-#  if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)<br>
-#   undef GTEST_HAS_STD_TUPLE_<br>
-#  endif<br>
-# endif<br>
-#endif<br>
-<br>
 // Brings in definitions for functions used in the testing::internal::posix<br>
 // namespace (read, write, close, chdir, isatty, stat). We do not currently<br>
 // use them on Windows Mobile.<br>
@@ -449,7 +357,8 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 #  include <android/api-level.h>  // NOLINT<br>
 #endif<br>
<br>
-// Defines this to true iff Google Test can use POSIX regular expressions.<br>
+// Defines this to true if and only if Google Test can use POSIX regular<br>
+// expressions.<br>
 #ifndef GTEST_HAS_POSIX_RE<br>
 # if GTEST_OS_LINUX_ANDROID<br>
 // On Android, <regex.h> is only available starting with Gingerbread.<br>
@@ -490,7 +399,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 // The user didn't tell us whether exceptions are enabled, so we need<br>
 // to figure it out.<br>
 # if defined(_MSC_VER) && defined(_CPPUNWIND)<br>
-// MSVC defines _CPPUNWIND to 1 iff exceptions are enabled.<br>
+// MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled.<br>
 #  define GTEST_HAS_EXCEPTIONS 1<br>
 # elif defined(__BORLANDC__)<br>
 // C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS<br>
@@ -501,16 +410,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 #  endif  // _HAS_EXCEPTIONS<br>
 #  define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS<br>
 # elif defined(__clang__)<br>
-// clang defines __EXCEPTIONS iff exceptions are enabled before clang 220714,<br>
-// but iff cleanups are enabled after that. In Obj-C++ files, there can be<br>
-// cleanups for ObjC exceptions which also need cleanups, even if C++ exceptions<br>
-// are disabled. clang has __has_feature(cxx_exceptions) which checks for C++<br>
-// exceptions starting at clang r206352, but which checked for cleanups prior to<br>
-// that. To reliably check for C++ exception availability with clang, check for<br>
+// clang defines __EXCEPTIONS if and only if exceptions are enabled before clang<br>
+// 220714, but if and only if cleanups are enabled after that. In Obj-C++ files,<br>
+// there can be cleanups for ObjC exceptions which also need cleanups, even if<br>
+// C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which<br>
+// checks for C++ exceptions starting at clang r206352, but which checked for<br>
+// cleanups prior to that. To reliably check for C++ exception availability with<br>
+// clang, check for<br>
 // __EXCEPTIONS && __has_feature(cxx_exceptions).<br>
 #  define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions))<br>
 # elif defined(__GNUC__) && __EXCEPTIONS<br>
-// gcc defines __EXCEPTIONS to 1 iff exceptions are enabled.<br>
+// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled.<br>
 #  define GTEST_HAS_EXCEPTIONS 1<br>
 # elif defined(__SUNPRO_CC)<br>
 // Sun Pro CC supports exceptions.  However, there is no compile-time way of<br>
@@ -518,7 +428,7 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 // they are enabled unless the user tells us otherwise.<br>
 #  define GTEST_HAS_EXCEPTIONS 1<br>
 # elif defined(__IBMCPP__) && __EXCEPTIONS<br>
-// xlC defines __EXCEPTIONS to 1 iff exceptions are enabled.<br>
+// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled.<br>
 #  define GTEST_HAS_EXCEPTIONS 1<br>
 # elif defined(__HP_aCC)<br>
 // Exception handling is in effect by default in HP aCC compiler. It has to<br>
@@ -540,31 +450,18 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 # error "::std::string isn't available."<br>
 #endif  // !defined(GTEST_HAS_STD_STRING)<br>
<br>
-#ifndef GTEST_HAS_GLOBAL_STRING<br>
-# define GTEST_HAS_GLOBAL_STRING 0<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
 #ifndef GTEST_HAS_STD_WSTRING<br>
 // The user didn't tell us whether ::std::wstring is available, so we need<br>
 // to figure it out.<br>
-// FIXME: uses autoconf to detect whether ::std::wstring<br>
-//   is available.<br>
-<br>
 // Cygwin 1.7 and below doesn't support ::std::wstring.<br>
 // Solaris' libc++ doesn't support it either.  Android has<br>
 // no support for it at least as recent as Froyo (2.2).<br>
-# define GTEST_HAS_STD_WSTRING \<br>
-    (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS))<br>
+#define GTEST_HAS_STD_WSTRING                                         \<br>
+  (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \<br>
+     GTEST_OS_HAIKU))<br>
<br>
 #endif  // GTEST_HAS_STD_WSTRING<br>
<br>
-#ifndef GTEST_HAS_GLOBAL_WSTRING<br>
-// The user didn't tell us whether ::wstring is available, so we need<br>
-// to figure it out.<br>
-# define GTEST_HAS_GLOBAL_WSTRING \<br>
-    (GTEST_HAS_STD_WSTRING && GTEST_HAS_GLOBAL_STRING)<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
 // Determines whether RTTI is available.<br>
 #ifndef GTEST_HAS_RTTI<br>
 // The user didn't tell us whether RTTI is enabled, so we need to<br>
@@ -572,14 +469,15 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
<br>
 # ifdef _MSC_VER<br>
<br>
-#  ifdef _CPPRTTI  // MSVC defines this macro iff RTTI is enabled.<br>
+#ifdef _CPPRTTI  // MSVC defines this macro if and only if RTTI is enabled.<br>
 #   define GTEST_HAS_RTTI 1<br>
 #  else<br>
 #   define GTEST_HAS_RTTI 0<br>
 #  endif<br>
<br>
-// Starting with version 4.3.2, gcc defines __GXX_RTTI iff RTTI is enabled.<br>
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40302)<br>
+// Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is<br>
+// enabled.<br>
+# elif defined(__GNUC__)<br>
<br>
 #  ifdef __GXX_RTTI<br>
 // When building against STLport with the Android NDK and with<br>
@@ -635,9 +533,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 //<br>
 // To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0<br>
 // to your compiler flags.<br>
-#define GTEST_HAS_PTHREAD                                             \<br>
-  (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \<br>
-   GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)<br>
+#define GTEST_HAS_PTHREAD                                                      \<br>
+  (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX ||          \<br>
+   GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \<br>
+   GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD ||          \<br>
+   GTEST_OS_HAIKU)<br>
 #endif  // GTEST_HAS_PTHREAD<br>
<br>
 #if GTEST_HAS_PTHREAD<br>
@@ -649,136 +549,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 # include <time.h>  // NOLINT<br>
 #endif<br>
<br>
-// Determines if hash_map/hash_set are available.<br>
-// Only used for testing against those containers.<br>
-#if !defined(GTEST_HAS_HASH_MAP_)<br>
-# if defined(_MSC_VER) && (_MSC_VER < 1900)<br>
-#  define GTEST_HAS_HASH_MAP_ 1  // Indicates that hash_map is available.<br>
-#  define GTEST_HAS_HASH_SET_ 1  // Indicates that hash_set is available.<br>
-# endif  // _MSC_VER<br>
-#endif  // !defined(GTEST_HAS_HASH_MAP_)<br>
-<br>
-// Determines whether Google Test can use tr1/tuple.  You can define<br>
-// this macro to 0 to prevent Google Test from using tuple (any<br>
-// feature depending on tuple with be disabled in this mode).<br>
-#ifndef GTEST_HAS_TR1_TUPLE<br>
-# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR)<br>
-// STLport, provided with the Android NDK, has neither <tr1/tuple> or <tuple>.<br>
-#  define GTEST_HAS_TR1_TUPLE 0<br>
-# elif defined(_MSC_VER) && (_MSC_VER >= 1910)<br>
-// Prevent `warning C4996: 'std::tr1': warning STL4002:<br>
-// The non-Standard std::tr1 namespace and TR1-only machinery<br>
-// are deprecated and will be REMOVED.`<br>
-#  define GTEST_HAS_TR1_TUPLE 0<br>
-# elif GTEST_LANG_CXX11 && defined(_LIBCPP_VERSION)<br>
-// libc++ doesn't support TR1.<br>
-#  define GTEST_HAS_TR1_TUPLE 0<br>
-# else<br>
-// The user didn't tell us not to do it, so we assume it's OK.<br>
-#  define GTEST_HAS_TR1_TUPLE 1<br>
-# endif<br>
-#endif  // GTEST_HAS_TR1_TUPLE<br>
-<br>
-// Determines whether Google Test's own tr1 tuple implementation<br>
-// should be used.<br>
-#ifndef GTEST_USE_OWN_TR1_TUPLE<br>
-// We use our own tuple implementation on Symbian.<br>
-# if GTEST_OS_SYMBIAN<br>
-#  define GTEST_USE_OWN_TR1_TUPLE 1<br>
-# else<br>
-// The user didn't tell us, so we need to figure it out.<br>
-<br>
-// We use our own TR1 tuple if we aren't sure the user has an<br>
-// implementation of it already.  At this time, libstdc++ 4.0.0+ and<br>
-// MSVC 2010 are the only mainstream standard libraries that come<br>
-// with a TR1 tuple implementation.  NVIDIA's CUDA NVCC compiler<br>
-// pretends to be GCC by defining __GNUC__ and friends, but cannot<br>
-// compile GCC's tuple implementation.  MSVC 2008 (9.0) provides TR1<br>
-// tuple in a 323 MB Feature Pack download, which we cannot assume the<br>
-// user has.  QNX's QCC compiler is a modified GCC but it doesn't<br>
-// support TR1 tuple.  libc++ only provides std::tuple, in C++11 mode,<br>
-// and it can be used with some compilers that define __GNUC__.<br>
-# if (defined(__GNUC__) && !defined(__CUDACC__) && (GTEST_GCC_VER_ >= 40000) \<br>
-      && !GTEST_OS_QNX && !defined(_LIBCPP_VERSION)) \<br>
-      || (_MSC_VER >= 1600 && _MSC_VER < 1900)<br>
-#  define GTEST_ENV_HAS_TR1_TUPLE_ 1<br>
-# endif<br>
-<br>
-// C++11 specifies that <tuple> provides std::tuple. Use that if gtest is used<br>
-// in C++11 mode and libstdc++ isn't very old (binaries targeting OS X 10.6<br>
-// can build with clang but need to use gcc4.2's libstdc++).<br>
-# if GTEST_LANG_CXX11 && (!defined(__GLIBCXX__) || __GLIBCXX__ > 20110325)<br>
-#  define GTEST_ENV_HAS_STD_TUPLE_ 1<br>
-# endif<br>
-<br>
-# if GTEST_ENV_HAS_TR1_TUPLE_ || GTEST_ENV_HAS_STD_TUPLE_<br>
-#  define GTEST_USE_OWN_TR1_TUPLE 0<br>
-# else<br>
-#  define GTEST_USE_OWN_TR1_TUPLE 1<br>
-# endif<br>
-# endif  // GTEST_OS_SYMBIAN<br>
-#endif  // GTEST_USE_OWN_TR1_TUPLE<br>
-<br>
-// To avoid conditional compilation we make it gtest-port.h's responsibility<br>
-// to #include the header implementing tuple.<br>
-#if GTEST_HAS_STD_TUPLE_<br>
-# include <tuple>  // IWYU pragma: export<br>
-# define GTEST_TUPLE_NAMESPACE_ ::std<br>
-#endif  // GTEST_HAS_STD_TUPLE_<br>
-<br>
-// We include tr1::tuple even if std::tuple is available to define printers for<br>
-// them.<br>
-#if GTEST_HAS_TR1_TUPLE<br>
-# ifndef GTEST_TUPLE_NAMESPACE_<br>
-#  define GTEST_TUPLE_NAMESPACE_ ::std::tr1<br>
-# endif  // GTEST_TUPLE_NAMESPACE_<br>
-<br>
-# if GTEST_USE_OWN_TR1_TUPLE<br>
-#  include "gtest/internal/gtest-tuple.h"  // IWYU pragma: export  // NOLINT<br>
-# elif GTEST_OS_SYMBIAN<br>
-<br>
-// On Symbian, BOOST_HAS_TR1_TUPLE causes Boost's TR1 tuple library to<br>
-// use STLport's tuple implementation, which unfortunately doesn't<br>
-// work as the copy of STLport distributed with Symbian is incomplete.<br>
-// By making sure BOOST_HAS_TR1_TUPLE is undefined, we force Boost to<br>
-// use its own tuple implementation.<br>
-#  ifdef BOOST_HAS_TR1_TUPLE<br>
-#   undef BOOST_HAS_TR1_TUPLE<br>
-#  endif  // BOOST_HAS_TR1_TUPLE<br>
-<br>
-// This prevents <boost/tr1/detail/config.hpp>, which defines<br>
-// BOOST_HAS_TR1_TUPLE, from being #included by Boost's <tuple>.<br>
-#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED<br>
-#  include <tuple>  // IWYU pragma: export  // NOLINT<br>
-<br>
-# elif defined(__GNUC__) && (GTEST_GCC_VER_ >= 40000)<br>
-// GCC 4.0+ implements tr1/tuple in the <tr1/tuple> header.  This does<br>
-// not conform to the TR1 spec, which requires the header to be <tuple>.<br>
-<br>
-#  if !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302<br>
-// Until version 4.3.2, gcc has a bug that causes <tr1/functional>,<br>
-// which is #included by <tr1/tuple>, to not compile when RTTI is<br>
-// disabled.  _TR1_FUNCTIONAL is the header guard for<br>
-// <tr1/functional>.  Hence the following #define is used to prevent<br>
-// <tr1/functional> from being included.<br>
-#   define _TR1_FUNCTIONAL 1<br>
-#   include <tr1/tuple><br>
-#   undef _TR1_FUNCTIONAL  // Allows the user to #include<br>
-                        // <tr1/functional> if they choose to.<br>
-#  else<br>
-#   include <tr1/tuple>  // NOLINT<br>
-#  endif  // !GTEST_HAS_RTTI && GTEST_GCC_VER_ < 40302<br>
-<br>
-// VS 2010 now has tr1 support.<br>
-# elif _MSC_VER >= 1600<br>
-#  include <tuple>  // IWYU pragma: export  // NOLINT<br>
-<br>
-# else  // GTEST_USE_OWN_TR1_TUPLE<br>
-#  include <tr1/tuple>  // IWYU pragma: export  // NOLINT<br>
-# endif  // GTEST_USE_OWN_TR1_TUPLE<br>
-<br>
-#endif  // GTEST_HAS_TR1_TUPLE<br>
-<br>
 // Determines whether clone(2) is supported.<br>
 // Usually it will only be available on Linux, excluding<br>
 // Linux on the Itanium architecture.<br>
@@ -812,24 +582,21 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 #ifndef GTEST_HAS_STREAM_REDIRECTION<br>
 // By default, we assume that stream redirection is supported on all<br>
 // platforms except known mobile ones.<br>
-# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || \<br>
-    GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
+# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
 #  define GTEST_HAS_STREAM_REDIRECTION 0<br>
 # else<br>
 #  define GTEST_HAS_STREAM_REDIRECTION 1<br>
-# endif  // !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_SYMBIAN<br>
+# endif  // !GTEST_OS_WINDOWS_MOBILE<br>
 #endif  // GTEST_HAS_STREAM_REDIRECTION<br>
<br>
 // Determines whether to support death tests.<br>
-// Google Test does not support death tests for VC 7.1 and earlier as<br>
-// abort() in a VC 7.1 application compiled as GUI in debug config<br>
 // pops up a dialog window that cannot be suppressed programmatically.<br>
-#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS ||   \<br>
-     (GTEST_OS_MAC && !GTEST_OS_IOS) ||                         \<br>
-     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER >= 1400) ||          \<br>
-     GTEST_OS_WINDOWS_MINGW || GTEST_OS_AIX || GTEST_OS_HPUX || \<br>
-     GTEST_OS_OPENBSD || GTEST_OS_QNX || GTEST_OS_FREEBSD || \<br>
-     GTEST_OS_NETBSD || GTEST_OS_FUCHSIA)<br>
+#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS ||             \<br>
+     (GTEST_OS_MAC && !GTEST_OS_IOS) ||                                   \<br>
+     (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW ||  \<br>
+     GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \<br>
+     GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA ||           \<br>
+     GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU)<br>
 # define GTEST_HAS_DEATH_TEST 1<br>
 #endif<br>
<br>
@@ -837,26 +604,19 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
<br>
 // Typed tests need <typeinfo> and variadic macros, which GCC, VC++ 8.0,<br>
 // Sun Pro CC, IBM Visual Age, and HP aCC support.<br>
-#if defined(__GNUC__) || (_MSC_VER >= 1400) || defined(__SUNPRO_CC) || \<br>
+#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \<br>
     defined(__IBMCPP__) || defined(__HP_aCC)<br>
 # define GTEST_HAS_TYPED_TEST 1<br>
 # define GTEST_HAS_TYPED_TEST_P 1<br>
 #endif<br>
<br>
-// Determines whether to support Combine(). This only makes sense when<br>
-// value-parameterized tests are enabled.  The implementation doesn't<br>
-// work on Sun Studio since it doesn't understand templated conversion<br>
-// operators.<br>
-#if (GTEST_HAS_TR1_TUPLE || GTEST_HAS_STD_TUPLE_) && !defined(__SUNPRO_CC)<br>
-# define GTEST_HAS_COMBINE 1<br>
-#endif<br>
-<br>
 // Determines whether the system compiler uses UTF-16 for encoding wide strings.<br>
 #define GTEST_WIDE_STRING_USES_UTF16_ \<br>
-    (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_SYMBIAN || GTEST_OS_AIX)<br>
+  (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2)<br>
<br>
 // Determines whether test results can be streamed to a socket.<br>
-#if GTEST_OS_LINUX<br>
+#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \<br>
+    GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD<br>
 # define GTEST_CAN_STREAM_RESULTS_ 1<br>
 #endif<br>
<br>
@@ -898,12 +658,6 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 # define GTEST_ATTRIBUTE_UNUSED_<br>
 #endif<br>
<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_CXX11_EQUALS_DELETE_ = delete<br>
-#else  // GTEST_LANG_CXX11<br>
-# define GTEST_CXX11_EQUALS_DELETE_<br>
-#endif  // GTEST_LANG_CXX11<br>
-<br>
 // Use this annotation before a function that takes a printf format string.<br>
 #if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC)<br>
 # if defined(__MINGW_PRINTF_FORMAT)<br>
@@ -925,12 +679,12 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 // A macro to disallow operator=<br>
 // This should be used in the private: declarations for a class.<br>
 #define GTEST_DISALLOW_ASSIGN_(type) \<br>
-  void operator=(type const &) GTEST_CXX11_EQUALS_DELETE_<br>
+  void operator=(type const &) = delete<br>
<br>
 // A macro to disallow copy constructor and operator=<br>
 // This should be used in the private: declarations for a class.<br>
 #define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \<br>
-  type(type const &) GTEST_CXX11_EQUALS_DELETE_; \<br>
+  type(type const &) = delete; \<br>
   GTEST_DISALLOW_ASSIGN_(type)<br>
<br>
 // Tell the compiler to warn about unused return values for functions declared<br>
@@ -938,11 +692,11 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 // following the argument list:<br>
 //<br>
 //   Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_;<br>
-#if defined(__GNUC__) && (GTEST_GCC_VER_ >= 30400) && !defined(COMPILER_ICC)<br>
+#if defined(__GNUC__) && !defined(COMPILER_ICC)<br>
 # define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result))<br>
 #else<br>
 # define GTEST_MUST_USE_RESULT_<br>
-#endif  // __GNUC__ && (GTEST_GCC_VER_ >= 30400) && !COMPILER_ICC<br>
+#endif  // __GNUC__ && !COMPILER_ICC<br>
<br>
 // MS C++ compiler emits warning when a conditional expression is compile time<br>
 // constant. In some contexts this warning is false positive and needs to be<br>
@@ -971,13 +725,17 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 #  define GTEST_HAS_SEH 0<br>
 # endif<br>
<br>
-#define GTEST_IS_THREADSAFE \<br>
-    (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ \<br>
-     || (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) \<br>
-     || GTEST_HAS_PTHREAD)<br>
-<br>
 #endif  // GTEST_HAS_SEH<br>
<br>
+#ifndef GTEST_IS_THREADSAFE<br>
+<br>
+#define GTEST_IS_THREADSAFE                                                 \<br>
+  (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ ||                                     \<br>
+   (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \<br>
+   GTEST_HAS_PTHREAD)<br>
+<br>
+#endif  // GTEST_IS_THREADSAFE<br>
+<br>
 // GTEST_API_ qualifies all symbols that must be exported. The definitions below<br>
 // are guarded by #ifndef to give embedders a chance to define GTEST_API_ in<br>
 // gtest/internal/custom/gtest-port.h<br>
@@ -1044,6 +802,18 @@ typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION;<br>
 # define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
 #endif  // __clang__<br>
<br>
+// A function level attribute to disable HWAddressSanitizer instrumentation.<br>
+#if defined(__clang__)<br>
+# if __has_feature(hwaddress_sanitizer)<br>
+#  define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \<br>
+       __attribute__((no_sanitize("hwaddress")))<br>
+# else<br>
+#  define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
+# endif  // __has_feature(hwaddress_sanitizer)<br>
+#else<br>
+# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
+#endif  // __clang__<br>
+<br>
 // A function level attribute to disable ThreadSanitizer instrumentation.<br>
 #if defined(__clang__)<br>
 # if __has_feature(thread_sanitizer)<br>
@@ -1060,16 +830,13 @@ namespace testing {<br>
<br>
 class Message;<br>
<br>
-#if defined(GTEST_TUPLE_NAMESPACE_)<br>
-// Import tuple and friends into the ::testing namespace.<br>
-// It is part of our interface, having them in ::testing allows us to change<br>
-// their types as needed.<br>
-using GTEST_TUPLE_NAMESPACE_::get;<br>
-using GTEST_TUPLE_NAMESPACE_::make_tuple;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple_size;<br>
-using GTEST_TUPLE_NAMESPACE_::tuple_element;<br>
-#endif  // defined(GTEST_TUPLE_NAMESPACE_)<br>
+// Legacy imports for backwards compatibility.<br>
+// New code should use std:: names directly.<br>
+using std::get;<br>
+using std::make_tuple;<br>
+using std::tuple;<br>
+using std::tuple_element;<br>
+using std::tuple_size;<br>
<br>
 namespace internal {<br>
<br>
@@ -1078,158 +845,24 @@ namespace internal {<br>
 // Secret object, which is what we want.<br>
 class Secret;<br>
<br>
-// The GTEST_COMPILE_ASSERT_ macro can be used to verify that a compile time<br>
-// expression is true. For example, you could use it to verify the<br>
-// size of a static array:<br>
+// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile<br>
+// time expression is true (in new code, use static_assert instead). For<br>
+// example, you could use it to verify the size of a static array:<br>
 //<br>
 //   GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES,<br>
 //                         names_incorrect_size);<br>
 //<br>
-// or to make sure a struct is smaller than a certain size:<br>
-//<br>
-//   GTEST_COMPILE_ASSERT_(sizeof(foo) < 128, foo_too_large);<br>
-//<br>
-// The second argument to the macro is the name of the variable. If<br>
-// the expression is false, most compilers will issue a warning/error<br>
-// containing the name of the variable.<br>
-<br>
-#if GTEST_LANG_CXX11<br>
-# define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)<br>
-#else  // !GTEST_LANG_CXX11<br>
-template <bool><br>
-  struct CompileAssert {<br>
-};<br>
-<br>
-# define GTEST_COMPILE_ASSERT_(expr, msg) \<br>
-  typedef ::testing::internal::CompileAssert<(static_cast<bool>(expr))> \<br>
-      msg[static_cast<bool>(expr) ? 1 : -1] GTEST_ATTRIBUTE_UNUSED_<br>
-#endif  // !GTEST_LANG_CXX11<br>
-<br>
-// Implementation details of GTEST_COMPILE_ASSERT_:<br>
-//<br>
-// (In C++11, we simply use static_assert instead of the following)<br>
-//<br>
-// - GTEST_COMPILE_ASSERT_ works by defining an array type that has -1<br>
-//   elements (and thus is invalid) when the expression is false.<br>
-//<br>
-// - The simpler definition<br>
-//<br>
-//    #define GTEST_COMPILE_ASSERT_(expr, msg) typedef char msg[(expr) ? 1 : -1]<br>
-//<br>
-//   does not work, as gcc supports variable-length arrays whose sizes<br>
-//   are determined at run-time (this is gcc's extension and not part<br>
-//   of the C++ standard).  As a result, gcc fails to reject the<br>
-//   following code with the simple definition:<br>
-//<br>
-//     int foo;<br>
-//     GTEST_COMPILE_ASSERT_(foo, msg); // not supposed to compile as foo is<br>
-//                                      // not a compile-time constant.<br>
-//<br>
-// - By using the type CompileAssert<(bool(expr))>, we ensures that<br>
-//   expr is a compile-time constant.  (Template arguments must be<br>
-//   determined at compile-time.)<br>
-//<br>
-// - The outter parentheses in CompileAssert<(bool(expr))> are necessary<br>
-//   to work around a bug in gcc 3.4.4 and 4.0.1.  If we had written<br>
-//<br>
-//     CompileAssert<bool(expr)><br>
-//<br>
-//   instead, these compilers will refuse to compile<br>
-//<br>
-//     GTEST_COMPILE_ASSERT_(5 > 0, some_message);<br>
-//<br>
-//   (They seem to think the ">" in "5 > 0" marks the end of the<br>
-//   template argument list.)<br>
-//<br>
-// - The array size is (bool(expr) ? 1 : -1), instead of simply<br>
-//<br>
-//     ((expr) ? 1 : -1).<br>
-//<br>
-//   This is to avoid running into a bug in MS VC 7.1, which<br>
-//   causes ((0.0) ? 1 : -1) to incorrectly evaluate to 1.<br>
-<br>
-// StaticAssertTypeEqHelper is used by StaticAssertTypeEq defined in gtest.h.<br>
-//<br>
-// This template is declared, but intentionally undefined.<br>
-template <typename T1, typename T2><br>
-struct StaticAssertTypeEqHelper;<br>
-<br>
-template <typename T><br>
-struct StaticAssertTypeEqHelper<T, T> {<br>
-  enum { value = true };<br>
-};<br>
-<br>
-// Same as std::is_same<>.<br>
-template <typename T, typename U><br>
-struct IsSame {<br>
-  enum { value = false };<br>
-};<br>
-template <typename T><br>
-struct IsSame<T, T> {<br>
-  enum { value = true };<br>
-};<br>
+// The second argument to the macro must be a valid C++ identifier. If the<br>
+// expression is false, compiler will issue an error containing this identifier.<br>
+#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg)<br>
<br>
 // Evaluates to the number of elements in 'array'.<br>
 #define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0]))<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-typedef ::string string;<br>
-#else<br>
-typedef ::std::string string;<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-typedef ::wstring wstring;<br>
-#elif GTEST_HAS_STD_WSTRING<br>
-typedef ::std::wstring wstring;<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
 // A helper for suppressing warnings on constant condition.  It just<br>
 // returns 'condition'.<br>
 GTEST_API_ bool IsTrue(bool condition);<br>
<br>
-// Defines scoped_ptr.<br>
-<br>
-// This implementation of scoped_ptr is PARTIAL - it only contains<br>
-// enough stuff to satisfy Google Test's need.<br>
-template <typename T><br>
-class scoped_ptr {<br>
- public:<br>
-  typedef T element_type;<br>
-<br>
-  explicit scoped_ptr(T* p = NULL) : ptr_(p) {}<br>
-  ~scoped_ptr() { reset(); }<br>
-<br>
-  T& operator*() const { return *ptr_; }<br>
-  T* operator->() const { return ptr_; }<br>
-  T* get() const { return ptr_; }<br>
-<br>
-  T* release() {<br>
-    T* const ptr = ptr_;<br>
-    ptr_ = NULL;<br>
-    return ptr;<br>
-  }<br>
-<br>
-  void reset(T* p = NULL) {<br>
-    if (p != ptr_) {<br>
-      if (IsTrue(sizeof(T) > 0)) {  // Makes sure T is a complete type.<br>
-        delete ptr_;<br>
-      }<br>
-      ptr_ = p;<br>
-    }<br>
-  }<br>
-<br>
-  friend void swap(scoped_ptr& a, scoped_ptr& b) {<br>
-    using std::swap;<br>
-    swap(a.ptr_, b.ptr_);<br>
-  }<br>
-<br>
- private:<br>
-  T* ptr_;<br>
-<br>
-  GTEST_DISALLOW_COPY_AND_ASSIGN_(scoped_ptr);<br>
-};<br>
-<br>
 // Defines RE.<br>
<br>
 #if GTEST_USES_PCRE<br>
@@ -1247,25 +880,16 @@ class GTEST_API_ RE {<br>
   // Constructs an RE from a string.<br>
   RE(const ::std::string& regex) { Init(regex.c_str()); }  // NOLINT<br>
<br>
-# if GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  RE(const ::string& regex) { Init(regex.c_str()); }  // NOLINT<br>
-<br>
-# endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
   RE(const char* regex) { Init(regex); }  // NOLINT<br>
   ~RE();<br>
<br>
   // Returns the string representation of the regex.<br>
   const char* pattern() const { return pattern_; }<br>
<br>
-  // FullMatch(str, re) returns true iff regular expression re matches<br>
-  // the entire str.<br>
-  // PartialMatch(str, re) returns true iff regular expression re<br>
+  // FullMatch(str, re) returns true if and only if regular expression re<br>
+  // matches the entire str.<br>
+  // PartialMatch(str, re) returns true if and only if regular expression re<br>
   // matches a substring of str (including str itself).<br>
-  //<br>
-  // FIXME: make FullMatch() and PartialMatch() work<br>
-  // when str contains NUL characters.<br>
   static bool FullMatch(const ::std::string& str, const RE& re) {<br>
     return FullMatch(str.c_str(), re);<br>
   }<br>
@@ -1273,26 +897,11 @@ class GTEST_API_ RE {<br>
     return PartialMatch(str.c_str(), re);<br>
   }<br>
<br>
-# if GTEST_HAS_GLOBAL_STRING<br>
-<br>
-  static bool FullMatch(const ::string& str, const RE& re) {<br>
-    return FullMatch(str.c_str(), re);<br>
-  }<br>
-  static bool PartialMatch(const ::string& str, const RE& re) {<br>
-    return PartialMatch(str.c_str(), re);<br>
-  }<br>
-<br>
-# endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
   static bool FullMatch(const char* str, const RE& re);<br>
   static bool PartialMatch(const char* str, const RE& re);<br>
<br>
  private:<br>
   void Init(const char* regex);<br>
-<br>
-  // We use a const char* instead of an std::string, as Google Test used to be<br>
-  // used where std::string is not available.  FIXME: change to<br>
-  // std::string.<br>
   const char* pattern_;<br>
   bool is_valid_;<br>
<br>
@@ -1360,7 +969,7 @@ class GTEST_API_ GTestLog {<br>
                                   __FILE__, __LINE__).GetStream()<br>
<br>
 inline void LogToStderr() {}<br>
-inline void FlushInfoLog() { fflush(NULL); }<br>
+inline void FlushInfoLog() { fflush(nullptr); }<br>
<br>
 #endif  // !defined(GTEST_LOG_)<br>
<br>
@@ -1397,19 +1006,6 @@ inline void FlushInfoLog() { fflush(NULL); }<br>
     GTEST_LOG_(FATAL) << #posix_call << "failed with error " \<br>
                       << gtest_error<br>
<br>
-// Adds reference to a type if it is not a reference type,<br>
-// otherwise leaves it unchanged.  This is the same as<br>
-// tr1::add_reference, which is not widely available yet.<br>
-template <typename T><br>
-struct AddReference { typedef T& type; };  // NOLINT<br>
-template <typename T><br>
-struct AddReference<T&> { typedef T& type; };  // NOLINT<br>
-<br>
-// A handy wrapper around AddReference that works when the argument T<br>
-// depends on template parameters.<br>
-#define GTEST_ADD_REFERENCE_(T) \<br>
-    typename ::testing::internal::AddReference<T>::type<br>
-<br>
 // Transforms "T" into "const T&" according to standard reference collapsing<br>
 // rules (this is only needed as a backport for C++98 compilers that do not<br>
 // support reference collapsing). Specifically, it transforms:<br>
@@ -1430,28 +1026,6 @@ struct ConstRef<T&> { typedef T& type; };<br>
 #define GTEST_REFERENCE_TO_CONST_(T) \<br>
   typename ::testing::internal::ConstRef<T>::type<br>
<br>
-#if GTEST_HAS_STD_MOVE_<br>
-using std::forward;<br>
-using std::move;<br>
-<br>
-template <typename T><br>
-struct RvalueRef {<br>
-  typedef T&& type;<br>
-};<br>
-#else  // GTEST_HAS_STD_MOVE_<br>
-template <typename T><br>
-const T& move(const T& t) {<br>
-  return t;<br>
-}<br>
-template <typename T><br>
-GTEST_ADD_REFERENCE_(T) forward(GTEST_ADD_REFERENCE_(T) t) { return t; }<br>
-<br>
-template <typename T><br>
-struct RvalueRef {<br>
-  typedef const T& type;<br>
-};<br>
-#endif  // GTEST_HAS_STD_MOVE_<br>
-<br>
 // INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE.<br>
 //<br>
 // Use ImplicitCast_ as a safe version of static_cast for upcasting in<br>
@@ -1505,13 +1079,13 @@ inline To DownCast_(From* f) {  // so we only accept pointers<br>
   GTEST_INTENTIONAL_CONST_COND_PUSH_()<br>
   if (false) {<br>
   GTEST_INTENTIONAL_CONST_COND_POP_()<br>
-    const To to = NULL;<br>
-    ::testing::internal::ImplicitCast_<From*>(to);<br>
+  const To to = nullptr;<br>
+  ::testing::internal::ImplicitCast_<From*>(to);<br>
   }<br>
<br>
 #if GTEST_HAS_RTTI<br>
   // RTTI: debug mode only!<br>
-  GTEST_CHECK_(f == NULL || dynamic_cast<To>(f) != NULL);<br>
+  GTEST_CHECK_(f == nullptr || dynamic_cast<To>(f) != nullptr);<br>
 #endif<br>
   return static_cast<To>(f);<br>
 }<br>
@@ -1565,9 +1139,6 @@ std::vector<std::string> GetInjectableArgvs();<br>
 // Deprecated: pass the args vector by value instead.<br>
 void SetInjectableArgvs(const std::vector<std::string>* new_argvs);<br>
 void SetInjectableArgvs(const std::vector<std::string>& new_argvs);<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void SetInjectableArgvs(const std::vector< ::string>& new_argvs);<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
 void ClearInjectableArgvs();<br>
<br>
 #endif  // GTEST_HAS_DEATH_TEST<br>
@@ -1583,7 +1154,7 @@ inline void SleepMilliseconds(int n) {<br>
     0,                  // 0 seconds.<br>
     n * 1000L * 1000L,  // And n ms.<br>
   };<br>
-  nanosleep(&time, NULL);<br>
+  nanosleep(&time, nullptr);<br>
 }<br>
 # endif  // GTEST_HAS_PTHREAD<br>
<br>
@@ -1601,7 +1172,7 @@ inline void SleepMilliseconds(int n) {<br>
 class Notification {<br>
  public:<br>
   Notification() : notified_(false) {<br>
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));<br>
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));<br>
   }<br>
   ~Notification() {<br>
     pthread_mutex_destroy(&mutex_);<br>
@@ -1659,7 +1230,8 @@ class GTEST_API_ AutoHandle {<br>
   void Reset(Handle handle);<br>
<br>
  private:<br>
-  // Returns true iff the handle is a valid handle object that can be closed.<br>
+  // Returns true if and only if the handle is a valid handle object that can be<br>
+  // closed.<br>
   bool IsCloseable() const;<br>
<br>
   Handle handle_;<br>
@@ -1710,7 +1282,7 @@ class ThreadWithParamBase {<br>
 // pass into pthread_create().<br>
 extern "C" inline void* ThreadFuncWithCLinkage(void* thread) {<br>
   static_cast<ThreadWithParamBase*>(thread)->Run();<br>
-  return NULL;<br>
+  return nullptr;<br>
 }<br>
<br>
 // Helper class for testing Google Test's multi-threading constructs.<br>
@@ -1739,20 +1311,19 @@ class ThreadWithParam : public ThreadWithParamBase {<br>
     // The thread can be created only after all fields except thread_<br>
     // have been initialized.<br>
     GTEST_CHECK_POSIX_SUCCESS_(<br>
-        pthread_create(&thread_, 0, &ThreadFuncWithCLinkage, base));<br>
+        pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base));<br>
   }<br>
-  ~ThreadWithParam() { Join(); }<br>
+  ~ThreadWithParam() override { Join(); }<br>
<br>
   void Join() {<br>
     if (!finished_) {<br>
-      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, 0));<br>
+      GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr));<br>
       finished_ = true;<br>
     }<br>
   }<br>
<br>
-  virtual void Run() {<br>
-    if (thread_can_start_ != NULL)<br>
-      thread_can_start_->WaitForNotification();<br>
+  void Run() override {<br>
+    if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification();<br>
     func_(param_);<br>
   }<br>
<br>
@@ -1762,7 +1333,8 @@ class ThreadWithParam : public ThreadWithParamBase {<br>
   // When non-NULL, used to block execution until the controller thread<br>
   // notifies.<br>
   Notification* const thread_can_start_;<br>
-  bool finished_;  // true iff we know that the thread function has finished.<br>
+  bool finished_;  // true if and only if we know that the thread function has<br>
+                   // finished.<br>
   pthread_t thread_;  // The native thread object.<br>
<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam);<br>
@@ -2046,7 +1618,7 @@ class ThreadLocal : public ThreadLocalBase {<br>
     GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory);<br>
   };<br>
<br>
-  scoped_ptr<ValueHolderFactory> default_factory_;<br>
+  std::unique_ptr<ValueHolderFactory> default_factory_;<br>
<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);<br>
 };<br>
@@ -2115,7 +1687,7 @@ class MutexBase {<br>
 class Mutex : public MutexBase {<br>
  public:<br>
   Mutex() {<br>
-    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, NULL));<br>
+    GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr));<br>
     has_owner_ = false;<br>
   }<br>
   ~Mutex() {<br>
@@ -2213,7 +1785,7 @@ class GTEST_API_ ThreadLocal {<br>
   T* GetOrCreateValue() const {<br>
     ThreadLocalValueHolderBase* const holder =<br>
         static_cast<ThreadLocalValueHolderBase*>(pthread_getspecific(key_));<br>
-    if (holder != NULL) {<br>
+    if (holder != nullptr) {<br>
       return CheckedDowncastToActualType<ValueHolder>(holder)->pointer();<br>
     }<br>
<br>
@@ -2257,7 +1829,7 @@ class GTEST_API_ ThreadLocal {<br>
<br>
   // A key pthreads uses for looking up per-thread values.<br>
   const pthread_key_t key_;<br>
-  scoped_ptr<ValueHolderFactory> default_factory_;<br>
+  std::unique_ptr<ValueHolderFactory> default_factory_;<br>
<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal);<br>
 };<br>
@@ -2315,67 +1887,8 @@ class GTEST_API_ ThreadLocal {<br>
 // we cannot detect it.<br>
 GTEST_API_ size_t GetThreadCount();<br>
<br>
-// Passing non-POD classes through ellipsis (...) crashes the ARM<br>
-// compiler and generates a warning in Sun Studio before 12u4. The Nokia Symbian<br>
-// and the IBM XL C/C++ compiler try to instantiate a copy constructor<br>
-// for objects passed through ellipsis (...), failing for uncopyable<br>
-// objects.  We define this to ensure that only POD is passed through<br>
-// ellipsis on these systems.<br>
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__) || \<br>
-     (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x5130)<br>
-// We lose support for NULL detection where the compiler doesn't like<br>
-// passing non-POD classes through ellipsis (...).<br>
-# define GTEST_ELLIPSIS_NEEDS_POD_ 1<br>
-#else<br>
-# define GTEST_CAN_COMPARE_NULL 1<br>
-#endif<br>
-<br>
-// The Nokia Symbian and IBM XL C/C++ compilers cannot decide between<br>
-// const T& and const T* in a function template.  These compilers<br>
-// _can_ decide between class template specializations for T and T*,<br>
-// so a tr1::type_traits-like is_pointer works.<br>
-#if defined(__SYMBIAN32__) || defined(__IBMCPP__)<br>
-# define GTEST_NEEDS_IS_POINTER_ 1<br>
-#endif<br>
-<br>
-template <bool bool_value><br>
-struct bool_constant {<br>
-  typedef bool_constant<bool_value> type;<br>
-  static const bool value = bool_value;<br>
-};<br>
-template <bool bool_value> const bool bool_constant<bool_value>::value;<br>
-<br>
-typedef bool_constant<false> false_type;<br>
-typedef bool_constant<true> true_type;<br>
-<br>
-template <typename T, typename U><br>
-struct is_same : public false_type {};<br>
-<br>
-template <typename T><br>
-struct is_same<T, T> : public true_type {};<br>
-<br>
-<br>
-template <typename T><br>
-struct is_pointer : public false_type {};<br>
-<br>
-template <typename T><br>
-struct is_pointer<T*> : public true_type {};<br>
-<br>
-template <typename Iterator><br>
-struct IteratorTraits {<br>
-  typedef typename Iterator::value_type value_type;<br>
-};<br>
-<br>
-<br>
-template <typename T><br>
-struct IteratorTraits<T*> {<br>
-  typedef T value_type;<br>
-};<br>
-<br>
-template <typename T><br>
-struct IteratorTraits<const T*> {<br>
-  typedef T value_type;<br>
-};<br>
+template <bool B><br>
+using bool_constant = std::integral_constant<bool, B>;<br>
<br>
 #if GTEST_OS_WINDOWS<br>
 # define GTEST_PATH_SEP_ "\\"<br>
@@ -2535,12 +2048,12 @@ inline const char* GetEnv(const char* name) {<br>
 #if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
   // We are on Windows CE, which has no environment variables.<br>
   static_cast<void>(name);  // To prevent 'unused argument' warning.<br>
-  return NULL;<br>
+  return nullptr;<br>
 #elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9)<br>
   // Environment variables which we programmatically clear will be set to the<br>
   // empty string rather than unset (NULL).  Handle that case.<br>
   const char* const env = getenv(name);<br>
-  return (env != NULL && env[0] != '\0') ? env : NULL;<br>
+  return (env != nullptr && env[0] != '\0') ? env : nullptr;<br>
 #else<br>
   return getenv(name);<br>
 #endif<br>
@@ -2552,9 +2065,9 @@ GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
 // Windows CE has no C library. The abort() function is used in<br>
 // several places in Google Test. This implementation provides a reasonable<br>
 // imitation of standard behaviour.<br>
-void Abort();<br>
+[[noreturn]] void Abort();<br>
 #else<br>
-inline void Abort() { abort(); }<br>
+[[noreturn]] inline void Abort() { abort(); }<br>
 #endif  // GTEST_OS_WINDOWS_MOBILE<br>
<br>
 }  // namespace posix<br>
@@ -2564,13 +2077,12 @@ inline void Abort() { abort(); }<br>
 // MSVC-based platforms.  We map the GTEST_SNPRINTF_ macro to the appropriate<br>
 // function in order to achieve that.  We use macro definition here because<br>
 // snprintf is a variadic function.<br>
-#if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE<br>
+#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE<br>
 // MSVC 2005 and above support variadic macros.<br>
 # define GTEST_SNPRINTF_(buffer, size, format, ...) \<br>
      _snprintf_s(buffer, size, size, format, __VA_ARGS__)<br>
 #elif defined(_MSC_VER)<br>
-// Windows CE does not define _snprintf_s and MSVC prior to 2005 doesn't<br>
-// complain about _snprintf.<br>
+// Windows CE does not define _snprintf_s<br>
 # define GTEST_SNPRINTF_ _snprintf<br>
 #else<br>
 # define GTEST_SNPRINTF_ snprintf<br>
@@ -2684,9 +2196,6 @@ typedef TypeWithSize<8>::Int TimeInMillis;  // Represents time in milliseconds.<br>
 // Parses 'str' for a 32-bit signed integer.  If successful, writes the result<br>
 // to *value and returns true; otherwise leaves *value unchanged and returns<br>
 // false.<br>
-// FIXME: Find a better way to refactor flag and environment parsing<br>
-// out of both gtest-port.cc and gtest.cc to avoid exporting this utility<br>
-// function.<br>
 bool ParseInt32(const Message& src_text, const char* str, Int32* value);<br>
<br>
 // Parses a bool/Int32/string from the environment variable<br>
@@ -2699,4 +2208,24 @@ const char* StringFromGTestEnv(const char* flag, const char* default_val);<br>
 }  // namespace internal<br>
 }  // namespace testing<br>
<br>
+#if !defined(GTEST_INTERNAL_DEPRECATED)<br>
+<br>
+// Internal Macro to mark an API deprecated, for googletest usage only<br>
+// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or<br>
+// GTEST_INTERNAL_DEPRECATED(message) <return_type> myFunction(); Every usage of<br>
+// a deprecated entity will trigger a warning when compiled with<br>
+// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler).<br>
+// For msvc /W3 option will need to be used<br>
+// Note that for 'other' compilers this macro evaluates to nothing to prevent<br>
+// compilations errors.<br>
+#if defined(_MSC_VER)<br>
+#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message))<br>
+#elif defined(__GNUC__)<br>
+#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message)))<br>
+#else<br>
+#define GTEST_INTERNAL_DEPRECATED(message)<br>
+#endif<br>
+<br>
+#endif  // !defined(GTEST_INTERNAL_DEPRECATED)<br>
+<br>
 #endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
index 4c9b6262c3c10..82aaa63bf4657 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-string.h<br>
@@ -94,7 +94,8 @@ class GTEST_API_ String {<br>
   static const char* Utf16ToAnsi(LPCWSTR utf16_str);<br>
 #endif<br>
<br>
-  // Compares two C strings.  Returns true iff they have the same content.<br>
+  // Compares two C strings.  Returns true if and only if they have the same<br>
+  // content.<br>
   //<br>
   // Unlike strcmp(), this function can handle NULL argument(s).  A<br>
   // NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
@@ -107,16 +108,16 @@ class GTEST_API_ String {<br>
   // returned.<br>
   static std::string ShowWideCString(const wchar_t* wide_c_str);<br>
<br>
-  // Compares two wide C strings.  Returns true iff they have the same<br>
-  // content.<br>
+  // Compares two wide C strings.  Returns true if and only if they have the<br>
+  // same content.<br>
   //<br>
   // Unlike wcscmp(), this function can handle NULL argument(s).  A<br>
   // NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
   // including the empty string.<br>
   static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs);<br>
<br>
-  // Compares two C strings, ignoring case.  Returns true iff they<br>
-  // have the same content.<br>
+  // Compares two C strings, ignoring case.  Returns true if and only if<br>
+  // they have the same content.<br>
   //<br>
   // Unlike strcasecmp(), this function can handle NULL argument(s).<br>
   // A NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
@@ -124,8 +125,8 @@ class GTEST_API_ String {<br>
   static bool CaseInsensitiveCStringEquals(const char* lhs,<br>
                                            const char* rhs);<br>
<br>
-  // Compares two wide C strings, ignoring case.  Returns true iff they<br>
-  // have the same content.<br>
+  // Compares two wide C strings, ignoring case.  Returns true if and only if<br>
+  // they have the same content.<br>
   //<br>
   // Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
   // A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
@@ -139,8 +140,8 @@ class GTEST_API_ String {<br>
   static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
                                                const wchar_t* rhs);<br>
<br>
-  // Returns true iff the given string ends with the given suffix, ignoring<br>
-  // case. Any string is considered to end with an empty suffix.<br>
+  // Returns true if and only if the given string ends with the given suffix,<br>
+  // ignoring case. Any string is considered to end with an empty suffix.<br>
   static bool EndsWithCaseInsensitive(<br>
       const std::string& str, const std::string& suffix);<br>
<br>
@@ -150,6 +151,9 @@ class GTEST_API_ String {<br>
   // Formats an int value as "%X".<br>
   static std::string FormatHexInt(int value);<br>
<br>
+  // Formats an int value as "%X".<br>
+  static std::string FormatHexUInt32(UInt32 value);<br>
+<br>
   // Formats a byte as "%02X".<br>
   static std::string FormatByte(unsigned char value);<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
deleted file mode 100644<br>
index 78a3a6a01fac7..0000000000000<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-tuple.h<br>
+++ /dev/null<br>
@@ -1,1021 +0,0 @@<br>
-// This file was GENERATED by command:<br>
-//     pump.py gtest-tuple.h.pump<br>
-// DO NOT EDIT BY HAND!!!<br>
-<br>
-// Copyright 2009 Google Inc.<br>
-// All Rights Reserved.<br>
-//<br>
-// Redistribution and use in source and binary forms, with or without<br>
-// modification, are permitted provided that the following conditions are<br>
-// met:<br>
-//<br>
-//     * Redistributions of source code must retain the above copyright<br>
-// notice, this list of conditions and the following disclaimer.<br>
-//     * Redistributions in binary form must reproduce the above<br>
-// copyright notice, this list of conditions and the following disclaimer<br>
-// in the documentation and/or other materials provided with the<br>
-// distribution.<br>
-//     * Neither the name of Google Inc. nor the names of its<br>
-// contributors may be used to endorse or promote products derived from<br>
-// this software without specific prior written permission.<br>
-//<br>
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
-<br>
-<br>
-// Implements a subset of TR1 tuple needed by Google Test and Google Mock.<br>
-<br>
-// GOOGLETEST_CM0001 DO NOT DELETE<br>
-<br>
-#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
-#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
-<br>
-#include <utility>  // For ::std::pair.<br>
-<br>
-// The compiler used in Symbian has a bug that prevents us from declaring the<br>
-// tuple template as a friend (it complains that tuple is redefined).  This<br>
-// bypasses the bug by declaring the members that should otherwise be<br>
-// private as public.<br>
-// Sun Studio versions < 12 also have the above bug.<br>
-#if defined(__SYMBIAN32__) || (defined(__SUNPRO_CC) && __SUNPRO_CC < 0x590)<br>
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ public:<br>
-#else<br>
-# define GTEST_DECLARE_TUPLE_AS_FRIEND_ \<br>
-    template <GTEST_10_TYPENAMES_(U)> friend class tuple; \<br>
-   private:<br>
-#endif<br>
-<br>
-// Visual Studio 2010, 2012, and 2013 define symbols in std::tr1 that conflict<br>
-// with our own definitions. Therefore using our own tuple does not work on<br>
-// those compilers.<br>
-#if defined(_MSC_VER) && _MSC_VER >= 1600  /* 1600 is Visual Studio 2010 */<br>
-# error "gtest's tuple doesn't compile on Visual Studio 2010 or later. \<br>
-GTEST_USE_OWN_TR1_TUPLE must be set to 0 on those compilers."<br>
-#endif<br>
-<br>
-// GTEST_n_TUPLE_(T) is the type of an n-tuple.<br>
-#define GTEST_0_TUPLE_(T) tuple<><br>
-#define GTEST_1_TUPLE_(T) tuple<T##0, void, void, void, void, void, void, \<br>
-    void, void, void><br>
-#define GTEST_2_TUPLE_(T) tuple<T##0, T##1, void, void, void, void, void, \<br>
-    void, void, void><br>
-#define GTEST_3_TUPLE_(T) tuple<T##0, T##1, T##2, void, void, void, void, \<br>
-    void, void, void><br>
-#define GTEST_4_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, void, void, void, \<br>
-    void, void, void><br>
-#define GTEST_5_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, void, void, \<br>
-    void, void, void><br>
-#define GTEST_6_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, void, \<br>
-    void, void, void><br>
-#define GTEST_7_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
-    void, void, void><br>
-#define GTEST_8_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
-    T##7, void, void><br>
-#define GTEST_9_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
-    T##7, T##8, void><br>
-#define GTEST_10_TUPLE_(T) tuple<T##0, T##1, T##2, T##3, T##4, T##5, T##6, \<br>
-    T##7, T##8, T##9><br>
-<br>
-// GTEST_n_TYPENAMES_(T) declares a list of n typenames.<br>
-#define GTEST_0_TYPENAMES_(T)<br>
-#define GTEST_1_TYPENAMES_(T) typename T##0<br>
-#define GTEST_2_TYPENAMES_(T) typename T##0, typename T##1<br>
-#define GTEST_3_TYPENAMES_(T) typename T##0, typename T##1, typename T##2<br>
-#define GTEST_4_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3<br>
-#define GTEST_5_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4<br>
-#define GTEST_6_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4, typename T##5<br>
-#define GTEST_7_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4, typename T##5, typename T##6<br>
-#define GTEST_8_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4, typename T##5, typename T##6, typename T##7<br>
-#define GTEST_9_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4, typename T##5, typename T##6, \<br>
-    typename T##7, typename T##8<br>
-#define GTEST_10_TYPENAMES_(T) typename T##0, typename T##1, typename T##2, \<br>
-    typename T##3, typename T##4, typename T##5, typename T##6, \<br>
-    typename T##7, typename T##8, typename T##9<br>
-<br>
-// In theory, defining stuff in the ::std namespace is undefined<br>
-// behavior.  We can do this as we are playing the role of a standard<br>
-// library vendor.<br>
-namespace std {<br>
-namespace tr1 {<br>
-<br>
-template <typename T0 = void, typename T1 = void, typename T2 = void,<br>
-    typename T3 = void, typename T4 = void, typename T5 = void,<br>
-    typename T6 = void, typename T7 = void, typename T8 = void,<br>
-    typename T9 = void><br>
-class tuple;<br>
-<br>
-// Anything in namespace gtest_internal is Google Test's INTERNAL<br>
-// IMPLEMENTATION DETAIL and MUST NOT BE USED DIRECTLY in user code.<br>
-namespace gtest_internal {<br>
-<br>
-// ByRef<T>::type is T if T is a reference; otherwise it's const T&.<br>
-template <typename T><br>
-struct ByRef { typedef const T& type; };  // NOLINT<br>
-template <typename T><br>
-struct ByRef<T&> { typedef T& type; };  // NOLINT<br>
-<br>
-// A handy wrapper for ByRef.<br>
-#define GTEST_BY_REF_(T) typename ::std::tr1::gtest_internal::ByRef<T>::type<br>
-<br>
-// AddRef<T>::type is T if T is a reference; otherwise it's T&.  This<br>
-// is the same as tr1::add_reference<T>::type.<br>
-template <typename T><br>
-struct AddRef { typedef T& type; };  // NOLINT<br>
-template <typename T><br>
-struct AddRef<T&> { typedef T& type; };  // NOLINT<br>
-<br>
-// A handy wrapper for AddRef.<br>
-#define GTEST_ADD_REF_(T) typename ::std::tr1::gtest_internal::AddRef<T>::type<br>
-<br>
-// A helper for implementing get<k>().<br>
-template <int k> class Get;<br>
-<br>
-// A helper for implementing tuple_element<k, T>.  kIndexValid is true<br>
-// iff k < the number of fields in tuple type T.<br>
-template <bool kIndexValid, int kIndex, class Tuple><br>
-struct TupleElement;<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 0, GTEST_10_TUPLE_(T) > {<br>
-  typedef T0 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 1, GTEST_10_TUPLE_(T) > {<br>
-  typedef T1 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 2, GTEST_10_TUPLE_(T) > {<br>
-  typedef T2 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 3, GTEST_10_TUPLE_(T) > {<br>
-  typedef T3 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 4, GTEST_10_TUPLE_(T) > {<br>
-  typedef T4 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 5, GTEST_10_TUPLE_(T) > {<br>
-  typedef T5 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 6, GTEST_10_TUPLE_(T) > {<br>
-  typedef T6 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 7, GTEST_10_TUPLE_(T) > {<br>
-  typedef T7 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 8, GTEST_10_TUPLE_(T) > {<br>
-  typedef T8 type;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct TupleElement<true, 9, GTEST_10_TUPLE_(T) > {<br>
-  typedef T9 type;<br>
-};<br>
-<br>
-}  // namespace gtest_internal<br>
-<br>
-template <><br>
-class tuple<> {<br>
- public:<br>
-  tuple() {}<br>
-  tuple(const tuple& /* t */)  {}<br>
-  tuple& operator=(const tuple& /* t */) { return *this; }<br>
-};<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-class GTEST_1_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0) : f0_(f0) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_) {}<br>
-<br>
-  template <GTEST_1_TYPENAMES_(U)><br>
-  tuple(const GTEST_1_TUPLE_(U)& t) : f0_(t.f0_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_1_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_1_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_1_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_1_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-};<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-class GTEST_2_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1) : f0_(f0),<br>
-      f1_(f1) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_) {}<br>
-<br>
-  template <GTEST_2_TYPENAMES_(U)><br>
-  tuple(const GTEST_2_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_) {}<br>
-  template <typename U0, typename U1><br>
-  tuple(const ::std::pair<U0, U1>& p) : f0_(p.first), f1_(p.second) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_2_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_2_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-  template <typename U0, typename U1><br>
-  tuple& operator=(const ::std::pair<U0, U1>& p) {<br>
-    f0_ = p.first;<br>
-    f1_ = p.second;<br>
-    return *this;<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_2_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_2_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-};<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-class GTEST_3_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2) : f0_(f0), f1_(f1), f2_(f2) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}<br>
-<br>
-  template <GTEST_3_TYPENAMES_(U)><br>
-  tuple(const GTEST_3_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_3_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_3_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_3_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_3_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-};<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-class GTEST_4_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3) : f0_(f0), f1_(f1), f2_(f2),<br>
-      f3_(f3) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_) {}<br>
-<br>
-  template <GTEST_4_TYPENAMES_(U)><br>
-  tuple(const GTEST_4_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_4_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_4_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_4_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_4_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-};<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-class GTEST_5_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3,<br>
-      GTEST_BY_REF_(T4) f4) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_) {}<br>
-<br>
-  template <GTEST_5_TYPENAMES_(U)><br>
-  tuple(const GTEST_5_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_5_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_5_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_5_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_5_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-};<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-class GTEST_6_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
-      GTEST_BY_REF_(T5) f5) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
-      f5_(f5) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_), f5_(t.f5_) {}<br>
-<br>
-  template <GTEST_6_TYPENAMES_(U)><br>
-  tuple(const GTEST_6_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_6_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_6_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_6_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_6_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    f5_ = t.f5_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-  T5 f5_;<br>
-};<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-class GTEST_7_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6) : f0_(f0), f1_(f1), f2_(f2),<br>
-      f3_(f3), f4_(f4), f5_(f5), f6_(f6) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}<br>
-<br>
-  template <GTEST_7_TYPENAMES_(U)><br>
-  tuple(const GTEST_7_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_7_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_7_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_7_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_7_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    f5_ = t.f5_;<br>
-    f6_ = t.f6_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-  T5 f5_;<br>
-  T6 f6_;<br>
-};<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-class GTEST_8_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6,<br>
-      GTEST_BY_REF_(T7) f7) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
-      f5_(f5), f6_(f6), f7_(f7) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}<br>
-<br>
-  template <GTEST_8_TYPENAMES_(U)><br>
-  tuple(const GTEST_8_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_8_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_8_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_8_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_8_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    f5_ = t.f5_;<br>
-    f6_ = t.f6_;<br>
-    f7_ = t.f7_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-  T5 f5_;<br>
-  T6 f6_;<br>
-  T7 f7_;<br>
-};<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-class GTEST_9_TUPLE_(T) {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,<br>
-      GTEST_BY_REF_(T8) f8) : f0_(f0), f1_(f1), f2_(f2), f3_(f3), f4_(f4),<br>
-      f5_(f5), f6_(f6), f7_(f7), f8_(f8) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}<br>
-<br>
-  template <GTEST_9_TYPENAMES_(U)><br>
-  tuple(const GTEST_9_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_9_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_9_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_9_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_9_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    f5_ = t.f5_;<br>
-    f6_ = t.f6_;<br>
-    f7_ = t.f7_;<br>
-    f8_ = t.f8_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-  T5 f5_;<br>
-  T6 f6_;<br>
-  T7 f7_;<br>
-  T8 f8_;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-class tuple {<br>
- public:<br>
-  template <int k> friend class gtest_internal::Get;<br>
-<br>
-  tuple() : f0_(), f1_(), f2_(), f3_(), f4_(), f5_(), f6_(), f7_(), f8_(),<br>
-      f9_() {}<br>
-<br>
-  explicit tuple(GTEST_BY_REF_(T0) f0, GTEST_BY_REF_(T1) f1,<br>
-      GTEST_BY_REF_(T2) f2, GTEST_BY_REF_(T3) f3, GTEST_BY_REF_(T4) f4,<br>
-      GTEST_BY_REF_(T5) f5, GTEST_BY_REF_(T6) f6, GTEST_BY_REF_(T7) f7,<br>
-      GTEST_BY_REF_(T8) f8, GTEST_BY_REF_(T9) f9) : f0_(f0), f1_(f1), f2_(f2),<br>
-      f3_(f3), f4_(f4), f5_(f5), f6_(f6), f7_(f7), f8_(f8), f9_(f9) {}<br>
-<br>
-  tuple(const tuple& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_), f3_(t.f3_),<br>
-      f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_), f9_(t.f9_) {}<br>
-<br>
-  template <GTEST_10_TYPENAMES_(U)><br>
-  tuple(const GTEST_10_TUPLE_(U)& t) : f0_(t.f0_), f1_(t.f1_), f2_(t.f2_),<br>
-      f3_(t.f3_), f4_(t.f4_), f5_(t.f5_), f6_(t.f6_), f7_(t.f7_), f8_(t.f8_),<br>
-      f9_(t.f9_) {}<br>
-<br>
-  tuple& operator=(const tuple& t) { return CopyFrom(t); }<br>
-<br>
-  template <GTEST_10_TYPENAMES_(U)><br>
-  tuple& operator=(const GTEST_10_TUPLE_(U)& t) {<br>
-    return CopyFrom(t);<br>
-  }<br>
-<br>
-  GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-<br>
-  template <GTEST_10_TYPENAMES_(U)><br>
-  tuple& CopyFrom(const GTEST_10_TUPLE_(U)& t) {<br>
-    f0_ = t.f0_;<br>
-    f1_ = t.f1_;<br>
-    f2_ = t.f2_;<br>
-    f3_ = t.f3_;<br>
-    f4_ = t.f4_;<br>
-    f5_ = t.f5_;<br>
-    f6_ = t.f6_;<br>
-    f7_ = t.f7_;<br>
-    f8_ = t.f8_;<br>
-    f9_ = t.f9_;<br>
-    return *this;<br>
-  }<br>
-<br>
-  T0 f0_;<br>
-  T1 f1_;<br>
-  T2 f2_;<br>
-  T3 f3_;<br>
-  T4 f4_;<br>
-  T5 f5_;<br>
-  T6 f6_;<br>
-  T7 f7_;<br>
-  T8 f8_;<br>
-  T9 f9_;<br>
-};<br>
-<br>
-// 6.1.3.2 Tuple creation functions.<br>
-<br>
-// Known limitations: we don't support passing an<br>
-// std::tr1::reference_wrapper<T> to make_tuple().  And we don't<br>
-// implement tie().<br>
-<br>
-inline tuple<> make_tuple() { return tuple<>(); }<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-inline GTEST_1_TUPLE_(T) make_tuple(const T0& f0) {<br>
-  return GTEST_1_TUPLE_(T)(f0);<br>
-}<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-inline GTEST_2_TUPLE_(T) make_tuple(const T0& f0, const T1& f1) {<br>
-  return GTEST_2_TUPLE_(T)(f0, f1);<br>
-}<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-inline GTEST_3_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2) {<br>
-  return GTEST_3_TUPLE_(T)(f0, f1, f2);<br>
-}<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-inline GTEST_4_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3) {<br>
-  return GTEST_4_TUPLE_(T)(f0, f1, f2, f3);<br>
-}<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-inline GTEST_5_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4) {<br>
-  return GTEST_5_TUPLE_(T)(f0, f1, f2, f3, f4);<br>
-}<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-inline GTEST_6_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4, const T5& f5) {<br>
-  return GTEST_6_TUPLE_(T)(f0, f1, f2, f3, f4, f5);<br>
-}<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-inline GTEST_7_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6) {<br>
-  return GTEST_7_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6);<br>
-}<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-inline GTEST_8_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7) {<br>
-  return GTEST_8_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7);<br>
-}<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-inline GTEST_9_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,<br>
-    const T8& f8) {<br>
-  return GTEST_9_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8);<br>
-}<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-inline GTEST_10_TUPLE_(T) make_tuple(const T0& f0, const T1& f1, const T2& f2,<br>
-    const T3& f3, const T4& f4, const T5& f5, const T6& f6, const T7& f7,<br>
-    const T8& f8, const T9& f9) {<br>
-  return GTEST_10_TUPLE_(T)(f0, f1, f2, f3, f4, f5, f6, f7, f8, f9);<br>
-}<br>
-<br>
-// 6.1.3.3 Tuple helper classes.<br>
-<br>
-template <typename Tuple> struct tuple_size;<br>
-<br>
-template <GTEST_0_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_0_TUPLE_(T) > {<br>
-  static const int value = 0;<br>
-};<br>
-<br>
-template <GTEST_1_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_1_TUPLE_(T) > {<br>
-  static const int value = 1;<br>
-};<br>
-<br>
-template <GTEST_2_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_2_TUPLE_(T) > {<br>
-  static const int value = 2;<br>
-};<br>
-<br>
-template <GTEST_3_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_3_TUPLE_(T) > {<br>
-  static const int value = 3;<br>
-};<br>
-<br>
-template <GTEST_4_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_4_TUPLE_(T) > {<br>
-  static const int value = 4;<br>
-};<br>
-<br>
-template <GTEST_5_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_5_TUPLE_(T) > {<br>
-  static const int value = 5;<br>
-};<br>
-<br>
-template <GTEST_6_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_6_TUPLE_(T) > {<br>
-  static const int value = 6;<br>
-};<br>
-<br>
-template <GTEST_7_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_7_TUPLE_(T) > {<br>
-  static const int value = 7;<br>
-};<br>
-<br>
-template <GTEST_8_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_8_TUPLE_(T) > {<br>
-  static const int value = 8;<br>
-};<br>
-<br>
-template <GTEST_9_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_9_TUPLE_(T) > {<br>
-  static const int value = 9;<br>
-};<br>
-<br>
-template <GTEST_10_TYPENAMES_(T)><br>
-struct tuple_size<GTEST_10_TUPLE_(T) > {<br>
-  static const int value = 10;<br>
-};<br>
-<br>
-template <int k, class Tuple><br>
-struct tuple_element {<br>
-  typedef typename gtest_internal::TupleElement<<br>
-      k < (tuple_size<Tuple>::value), k, Tuple>::type type;<br>
-};<br>
-<br>
-#define GTEST_TUPLE_ELEMENT_(k, Tuple) typename tuple_element<k, Tuple >::type<br>
-<br>
-// 6.1.3.4 Element access.<br>
-<br>
-namespace gtest_internal {<br>
-<br>
-template <><br>
-class Get<0> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))<br>
-  Field(Tuple& t) { return t.f0_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(0, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f0_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<1> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))<br>
-  Field(Tuple& t) { return t.f1_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(1, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f1_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<2> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))<br>
-  Field(Tuple& t) { return t.f2_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(2, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f2_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<3> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))<br>
-  Field(Tuple& t) { return t.f3_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(3, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f3_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<4> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))<br>
-  Field(Tuple& t) { return t.f4_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(4, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f4_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<5> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))<br>
-  Field(Tuple& t) { return t.f5_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(5, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f5_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<6> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))<br>
-  Field(Tuple& t) { return t.f6_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(6, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f6_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<7> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))<br>
-  Field(Tuple& t) { return t.f7_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(7, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f7_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<8> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))<br>
-  Field(Tuple& t) { return t.f8_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(8, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f8_; }<br>
-};<br>
-<br>
-template <><br>
-class Get<9> {<br>
- public:<br>
-  template <class Tuple><br>
-  static GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))<br>
-  Field(Tuple& t) { return t.f9_; }  // NOLINT<br>
-<br>
-  template <class Tuple><br>
-  static GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(9, Tuple))<br>
-  ConstField(const Tuple& t) { return t.f9_; }<br>
-};<br>
-<br>
-}  // namespace gtest_internal<br>
-<br>
-template <int k, GTEST_10_TYPENAMES_(T)><br>
-GTEST_ADD_REF_(GTEST_TUPLE_ELEMENT_(k, GTEST_10_TUPLE_(T)))<br>
-get(GTEST_10_TUPLE_(T)& t) {<br>
-  return gtest_internal::Get<k>::Field(t);<br>
-}<br>
-<br>
-template <int k, GTEST_10_TYPENAMES_(T)><br>
-GTEST_BY_REF_(GTEST_TUPLE_ELEMENT_(k,  GTEST_10_TUPLE_(T)))<br>
-get(const GTEST_10_TUPLE_(T)& t) {<br>
-  return gtest_internal::Get<k>::ConstField(t);<br>
-}<br>
-<br>
-// 6.1.3.5 Relational operators<br>
-<br>
-// We only implement == and !=, as we don't have a need for the rest yet.<br>
-<br>
-namespace gtest_internal {<br>
-<br>
-// SameSizeTuplePrefixComparator<k, k>::Eq(t1, t2) returns true if the<br>
-// first k fields of t1 equals the first k fields of t2.<br>
-// SameSizeTuplePrefixComparator(k1, k2) would be a compiler error if<br>
-// k1 != k2.<br>
-template <int kSize1, int kSize2><br>
-struct SameSizeTuplePrefixComparator;<br>
-<br>
-template <><br>
-struct SameSizeTuplePrefixComparator<0, 0> {<br>
-  template <class Tuple1, class Tuple2><br>
-  static bool Eq(const Tuple1& /* t1 */, const Tuple2& /* t2 */) {<br>
-    return true;<br>
-  }<br>
-};<br>
-<br>
-template <int k><br>
-struct SameSizeTuplePrefixComparator<k, k> {<br>
-  template <class Tuple1, class Tuple2><br>
-  static bool Eq(const Tuple1& t1, const Tuple2& t2) {<br>
-    return SameSizeTuplePrefixComparator<k - 1, k - 1>::Eq(t1, t2) &&<br>
-        ::std::tr1::get<k - 1>(t1) == ::std::tr1::get<k - 1>(t2);<br>
-  }<br>
-};<br>
-<br>
-}  // namespace gtest_internal<br>
-<br>
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)><br>
-inline bool operator==(const GTEST_10_TUPLE_(T)& t,<br>
-                       const GTEST_10_TUPLE_(U)& u) {<br>
-  return gtest_internal::SameSizeTuplePrefixComparator<<br>
-      tuple_size<GTEST_10_TUPLE_(T) >::value,<br>
-      tuple_size<GTEST_10_TUPLE_(U) >::value>::Eq(t, u);<br>
-}<br>
-<br>
-template <GTEST_10_TYPENAMES_(T), GTEST_10_TYPENAMES_(U)><br>
-inline bool operator!=(const GTEST_10_TUPLE_(T)& t,<br>
-                       const GTEST_10_TUPLE_(U)& u) { return !(t == u); }<br>
-<br>
-// 6.1.4 Pairs.<br>
-// Unimplemented.<br>
-<br>
-}  // namespace tr1<br>
-}  // namespace std<br>
-<br>
-#undef GTEST_0_TUPLE_<br>
-#undef GTEST_1_TUPLE_<br>
-#undef GTEST_2_TUPLE_<br>
-#undef GTEST_3_TUPLE_<br>
-#undef GTEST_4_TUPLE_<br>
-#undef GTEST_5_TUPLE_<br>
-#undef GTEST_6_TUPLE_<br>
-#undef GTEST_7_TUPLE_<br>
-#undef GTEST_8_TUPLE_<br>
-#undef GTEST_9_TUPLE_<br>
-#undef GTEST_10_TUPLE_<br>
-<br>
-#undef GTEST_0_TYPENAMES_<br>
-#undef GTEST_1_TYPENAMES_<br>
-#undef GTEST_2_TYPENAMES_<br>
-#undef GTEST_3_TYPENAMES_<br>
-#undef GTEST_4_TYPENAMES_<br>
-#undef GTEST_5_TYPENAMES_<br>
-#undef GTEST_6_TYPENAMES_<br>
-#undef GTEST_7_TYPENAMES_<br>
-#undef GTEST_8_TYPENAMES_<br>
-#undef GTEST_9_TYPENAMES_<br>
-#undef GTEST_10_TYPENAMES_<br>
-<br>
-#undef GTEST_DECLARE_TUPLE_AS_FRIEND_<br>
-#undef GTEST_BY_REF_<br>
-#undef GTEST_ADD_REF_<br>
-#undef GTEST_TUPLE_ELEMENT_<br>
-<br>
-#endif  // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TUPLE_H_<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
index 28e411245361c..3d7542d1fb350 100644<br>
--- a/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
+++ b/llvm/utils/unittest/googletest/include/gtest/internal/gtest-type-util.h<br>
@@ -31,12 +31,11 @@<br>
 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
<br>
-<br>
 // Type utilities needed for implementing typed and type-parameterized<br>
 // tests.  This file is generated by a SCRIPT.  DO NOT EDIT BY HAND!<br>
 //<br>
 // Currently we support at most 50 types in a list, and at most 50<br>
-// type-parameterized tests in one type-parameterized test case.<br>
+// type-parameterized tests in one type-parameterized test suite.<br>
 // Please contact <a href="mailto:googletestframework@googlegroups.com" target="_blank">googletestframework@googlegroups.com</a> if you need<br>
 // more.<br>
<br>
@@ -89,7 +88,7 @@ std::string GetTypeName() {<br>
 #   if GTEST_HAS_CXXABI_H_<br>
   using abi::__cxa_demangle;<br>
 #   endif  // GTEST_HAS_CXXABI_H_<br>
-  char* const readable_name = __cxa_demangle(name, 0, 0, &status);<br>
+  char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status);<br>
   const std::string name_str(status == 0 ? readable_name : name);<br>
   free(readable_name);<br>
   return CanonicalizeForStdLibVersioning(name_str);<br>
@@ -106,18 +105,6 @@ std::string GetTypeName() {<br>
<br>
 #if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P<br>
<br>
-// AssertyTypeEq<T1, T2>::type is defined iff T1 and T2 are the same<br>
-// type.  This can be used as a compile-time assertion to ensure that<br>
-// two types are equal.<br>
-<br>
-template <typename T1, typename T2><br>
-struct AssertTypeEq;<br>
-<br>
-template <typename T><br>
-struct AssertTypeEq<T, T> {<br>
-  typedef bool type;<br>
-};<br>
-<br>
 // A unique type used as the default value for the arguments of class<br>
 // template Types.  This allows us to simulate variadic templates<br>
 // (e.g. Types<int>, Type<int, double>, and etc), which C++ doesn't<br>
@@ -3312,8 +3299,8 @@ struct Templates<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14,<br>
 };<br>
<br>
 // The TypeList template makes it possible to use either a single type<br>
-// or a Types<...> list in TYPED_TEST_CASE() and<br>
-// INSTANTIATE_TYPED_TEST_CASE_P().<br>
+// or a Types<...> list in TYPED_TEST_SUITE() and<br>
+// INSTANTIATE_TYPED_TEST_SUITE_P().<br>
<br>
 template <typename T><br>
 struct TypeList {<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-all.cc b/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
index b217a18006b0c..ad292905cf381 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-all.cc<br>
@@ -41,6 +41,7 @@<br>
 #include "src/gtest.cc"<br>
 #include "src/gtest-death-test.cc"<br>
 #include "src/gtest-filepath.cc"<br>
+#include "src/gtest-matchers.cc"<br>
 #include "src/gtest-port.cc"<br>
 #include "src/gtest-printers.cc"<br>
 #include "src/gtest-test-part.cc"<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-death-test.cc b/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
index 09083551612e3..da09a1cfc23a5 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-death-test.cc<br>
@@ -31,6 +31,9 @@<br>
 // This file implements death tests.<br>
<br>
 #include "gtest/gtest-death-test.h"<br>
+<br>
+#include <utility><br>
+<br>
 #include "gtest/internal/gtest-port.h"<br>
 #include "gtest/internal/custom/gtest.h"<br>
<br>
@@ -62,10 +65,16 @@<br>
 # endif  // GTEST_OS_QNX<br>
<br>
 # if GTEST_OS_FUCHSIA<br>
+#  include <lib/fdio/fd.h><br>
 #  include <lib/fdio/io.h><br>
 #  include <lib/fdio/spawn.h><br>
+#  include <lib/zx/channel.h><br>
+#  include <lib/zx/port.h><br>
+#  include <lib/zx/process.h><br>
+#  include <lib/zx/socket.h><br>
 #  include <zircon/processargs.h><br>
 #  include <zircon/syscalls.h><br>
+#  include <zircon/syscalls/policy.h><br>
 #  include <zircon/syscalls/port.h><br>
 # endif  // GTEST_OS_FUCHSIA<br>
<br>
@@ -113,8 +122,8 @@ GTEST_DEFINE_string_(<br>
     "Indicates the file, line number, temporal index of "<br>
     "the single death test to run, and a file descriptor to "<br>
     "which a success code may be sent, all separated by "<br>
-    "the '|' characters.  This flag is specified if and only if the current "<br>
-    "process is a sub-process launched for running a thread-safe "<br>
+    "the '|' characters.  This flag is specified if and only if the "<br>
+    "current process is a sub-process launched for running a thread-safe "<br>
     "death test.  FOR INTERNAL USE ONLY.");<br>
 }  // namespace internal<br>
<br>
@@ -266,8 +275,6 @@ static const int kFuchsiaReadPipeFd = 3;<br>
 // statement, which is not allowed; THREW means that the test statement<br>
 // returned control by throwing an exception.  IN_PROGRESS means the test<br>
 // has not yet concluded.<br>
-// FIXME: Unify names and possibly values for<br>
-// AbortReason, DeathTestOutcome, and flag characters above.<br>
 enum DeathTestOutcome { IN_PROGRESS, DIED, LIVED, RETURNED, THREW };<br>
<br>
 // Routine for aborting the program which is safe to call from an<br>
@@ -281,7 +288,7 @@ static void DeathTestAbort(const std::string& message) {<br>
   // the heap for any additional non-minuscule memory requirements.<br>
   const InternalRunDeathTestFlag* const flag =<br>
       GetUnitTestImpl()->internal_run_death_test_flag();<br>
-  if (flag != NULL) {<br>
+  if (flag != nullptr) {<br>
     FILE* parent = posix::FDOpen(flag->write_fd(), "w");<br>
     fputc(kDeathTestInternalError, parent);<br>
     fprintf(parent, "%s", message.c_str());<br>
@@ -361,7 +368,7 @@ static void FailFromInternalError(int fd) {<br>
 // for the current test.<br>
 DeathTest::DeathTest() {<br>
   TestInfo* const info = GetUnitTestImpl()->current_test_info();<br>
-  if (info == NULL) {<br>
+  if (info == nullptr) {<br>
     DeathTestAbort("Cannot run a death test outside of a TEST or "<br>
                    "TEST_F construct");<br>
   }<br>
@@ -369,10 +376,11 @@ DeathTest::DeathTest() {<br>
<br>
 // Creates and returns a death test by dispatching to the current<br>
 // death test factory.<br>
-bool DeathTest::Create(const char* statement, const RE* regex,<br>
-                       const char* file, int line, DeathTest** test) {<br>
+bool DeathTest::Create(const char* statement,<br>
+                       Matcher<const std::string&> matcher, const char* file,<br>
+                       int line, DeathTest** test) {<br>
   return GetUnitTestImpl()->death_test_factory()->Create(<br>
-      statement, regex, file, line, test);<br>
+      statement, std::move(matcher), file, line, test);<br>
 }<br>
<br>
 const char* DeathTest::LastMessage() {<br>
@@ -388,9 +396,9 @@ std::string DeathTest::last_death_test_message_;<br>
 // Provides cross platform implementation for some death functionality.<br>
 class DeathTestImpl : public DeathTest {<br>
  protected:<br>
-  DeathTestImpl(const char* a_statement, const RE* a_regex)<br>
+  DeathTestImpl(const char* a_statement, Matcher<const std::string&> matcher)<br>
       : statement_(a_statement),<br>
-        regex_(a_regex),<br>
+        matcher_(std::move(matcher)),<br>
         spawned_(false),<br>
         status_(-1),<br>
         outcome_(IN_PROGRESS),<br>
@@ -398,13 +406,12 @@ class DeathTestImpl : public DeathTest {<br>
         write_fd_(-1) {}<br>
<br>
   // read_fd_ is expected to be closed and cleared by a derived class.<br>
-  ~DeathTestImpl() { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }<br>
+  ~DeathTestImpl() override { GTEST_DEATH_TEST_CHECK_(read_fd_ == -1); }<br>
<br>
-  void Abort(AbortReason reason);<br>
-  virtual bool Passed(bool status_ok);<br>
+  void Abort(AbortReason reason) override;<br>
+  bool Passed(bool status_ok) override;<br>
<br>
   const char* statement() const { return statement_; }<br>
-  const RE* regex() const { return regex_; }<br>
   bool spawned() const { return spawned_; }<br>
   void set_spawned(bool is_spawned) { spawned_ = is_spawned; }<br>
   int status() const { return status_; }<br>
@@ -422,13 +429,15 @@ class DeathTestImpl : public DeathTest {<br>
   // case of unexpected codes.<br>
   void ReadAndInterpretStatusByte();<br>
<br>
+  // Returns stderr output from the child process.<br>
+  virtual std::string GetErrorLogs();<br>
+<br>
  private:<br>
   // The textual content of the code this object is testing.  This class<br>
   // doesn't own this string and should not attempt to delete it.<br>
   const char* const statement_;<br>
-  // The regular expression which test output must match.  DeathTestImpl<br>
-  // doesn't own this object and should not attempt to delete it.<br>
-  const RE* const regex_;<br>
+  // A matcher that's expected to match the stderr output by the child process.<br>
+  Matcher<const std::string&> matcher_;<br>
   // True if the death test child process has been successfully spawned.<br>
   bool spawned_;<br>
   // The exit status of the child process.<br>
@@ -490,6 +499,10 @@ void DeathTestImpl::ReadAndInterpretStatusByte() {<br>
   set_read_fd(-1);<br>
 }<br>
<br>
+std::string DeathTestImpl::GetErrorLogs() {<br>
+  return GetCapturedStderr();<br>
+}<br>
+<br>
 // Signals that the death test code which should have exited, didn't.<br>
 // Should be called only in a death test child process.<br>
 // Writes a status byte to the child's status file descriptor, then<br>
@@ -543,22 +556,21 @@ static ::std::string FormatDeathTestOutput(const ::std::string& output) {<br>
 //             in the format specified by wait(2). On Windows, this is the<br>
 //             value supplied to the ExitProcess() API or a numeric code<br>
 //             of the exception that terminated the program.<br>
-//   regex:    A regular expression object to be applied to<br>
-//             the test's captured standard error output; the death test<br>
-//             fails if it does not match.<br>
+//   matcher_: A matcher that's expected to match the stderr output by the child<br>
+//             process.<br>
 //<br>
 // Argument:<br>
 //   status_ok: true if exit_status is acceptable in the context of<br>
 //              this particular death test, which fails if it is false<br>
 //<br>
-// Returns true iff all of the above conditions are met.  Otherwise, the<br>
-// first failing condition, in the order given above, is the one that is<br>
+// Returns true if and only if all of the above conditions are met.  Otherwise,<br>
+// the first failing condition, in the order given above, is the one that is<br>
 // reported. Also sets the last death test message string.<br>
 bool DeathTestImpl::Passed(bool status_ok) {<br>
   if (!spawned())<br>
     return false;<br>
<br>
-  const std::string error_message = GetCapturedStderr();<br>
+  const std::string error_message = GetErrorLogs();<br>
<br>
   bool success = false;<br>
   Message buffer;<br>
@@ -579,18 +591,15 @@ bool DeathTestImpl::Passed(bool status_ok) {<br>
       break;<br>
     case DIED:<br>
       if (status_ok) {<br>
-# if GTEST_USES_PCRE<br>
-        // PCRE regexes support embedded NULs.<br>
-        const bool matched = RE::PartialMatch(error_message, *regex());<br>
-# else<br>
-        const bool matched = RE::PartialMatch(error_message.c_str(), *regex());<br>
-# endif  // GTEST_USES_PCRE<br>
-        if (matched) {<br>
+        if (matcher_.Matches(error_message)) {<br>
           success = true;<br>
         } else {<br>
+          std::ostringstream stream;<br>
+          matcher_.DescribeTo(&stream);<br>
           buffer << "    Result: died but not with expected error.\n"<br>
-                 << "  Expected: " << regex()->pattern() << "\n"<br>
-                 << "Actual msg:\n" << FormatDeathTestOutput(error_message);<br>
+                 << "  Expected: " << stream.str() << "\n"<br>
+                 << "Actual msg:\n"<br>
+                 << FormatDeathTestOutput(error_message);<br>
         }<br>
       } else {<br>
         buffer << "    Result: died but not with expected exit code:\n"<br>
@@ -639,11 +648,11 @@ bool DeathTestImpl::Passed(bool status_ok) {<br>
 //<br>
 class WindowsDeathTest : public DeathTestImpl {<br>
  public:<br>
-  WindowsDeathTest(const char* a_statement,<br>
-                   const RE* a_regex,<br>
-                   const char* file,<br>
-                   int line)<br>
-      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}<br>
+  WindowsDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+                   const char* file, int line)<br>
+      : DeathTestImpl(a_statement, std::move(matcher)),<br>
+        file_(file),<br>
+        line_(line) {}<br>
<br>
   // All of these virtual functions are inherited from DeathTest.<br>
   virtual int Wait();<br>
@@ -720,7 +729,7 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
   const TestInfo* const info = impl->current_test_info();<br>
   const int death_test_index = info->result()->death_test_count();<br>
<br>
-  if (flag != NULL) {<br>
+  if (flag != nullptr) {<br>
     // ParseInternalRunDeathTestFlag() has performed all the necessary<br>
     // processing.<br>
     set_write_fd(flag->write_fd());<br>
@@ -729,8 +738,8 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
<br>
   // WindowsDeathTest uses an anonymous pipe to communicate results of<br>
   // a death test.<br>
-  SECURITY_ATTRIBUTES handles_are_inheritable = {<br>
-    sizeof(SECURITY_ATTRIBUTES), NULL, TRUE };<br>
+  SECURITY_ATTRIBUTES handles_are_inheritable = {sizeof(SECURITY_ATTRIBUTES),<br>
+                                                 nullptr, TRUE};<br>
   HANDLE read_handle, write_handle;<br>
   GTEST_DEATH_TEST_CHECK_(<br>
       ::CreatePipe(&read_handle, &write_handle, &handles_are_inheritable,<br>
@@ -741,13 +750,13 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
   write_handle_.Reset(write_handle);<br>
   event_handle_.Reset(::CreateEvent(<br>
       &handles_are_inheritable,<br>
-      TRUE,    // The event will automatically reset to non-signaled state.<br>
-      FALSE,   // The initial state is non-signalled.<br>
-      NULL));  // The even is unnamed.<br>
-  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != NULL);<br>
-  const std::string filter_flag =<br>
-      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "=" +<br>
-      info->test_case_name() + "." + info->name();<br>
+      TRUE,       // The event will automatically reset to non-signaled state.<br>
+      FALSE,      // The initial state is non-signalled.<br>
+      nullptr));  // The even is unnamed.<br>
+  GTEST_DEATH_TEST_CHECK_(event_handle_.Get() != nullptr);<br>
+  const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+                                  kFilterFlag + "=" + info->test_suite_name() +<br>
+                                  "." + info->name();<br>
   const std::string internal_flag =<br>
       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag +<br>
       "=" + file_ + "|" + StreamableToString(line_) + "|" +<br>
@@ -760,10 +769,9 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
       "|" + StreamableToString(reinterpret_cast<size_t>(event_handle_.Get()));<br>
<br>
   char executable_path[_MAX_PATH + 1];  // NOLINT<br>
-  GTEST_DEATH_TEST_CHECK_(<br>
-      _MAX_PATH + 1 != ::GetModuleFileNameA(NULL,<br>
-                                            executable_path,<br>
-                                            _MAX_PATH));<br>
+  GTEST_DEATH_TEST_CHECK_(_MAX_PATH + 1 != ::GetModuleFileNameA(nullptr,<br>
+                                                                executable_path,<br>
+                                                                _MAX_PATH));<br>
<br>
   std::string command_line =<br>
       std::string(::GetCommandLineA()) + " " + filter_flag + " \"" +<br>
@@ -784,17 +792,16 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
   startup_info.hStdError = ::GetStdHandle(STD_ERROR_HANDLE);<br>
<br>
   PROCESS_INFORMATION process_info;<br>
-  GTEST_DEATH_TEST_CHECK_(::CreateProcessA(<br>
-      executable_path,<br>
-      const_cast<char*>(command_line.c_str()),<br>
-      NULL,   // Retuned process handle is not inheritable.<br>
-      NULL,   // Retuned thread handle is not inheritable.<br>
-      TRUE,   // Child inherits all inheritable handles (for write_handle_).<br>
-      0x0,    // Default creation flags.<br>
-      NULL,   // Inherit the parent's environment.<br>
-      UnitTest::GetInstance()->original_working_dir(),<br>
-      &startup_info,<br>
-      &process_info) != FALSE);<br>
+  GTEST_DEATH_TEST_CHECK_(<br>
+      ::CreateProcessA(<br>
+          executable_path, const_cast<char*>(command_line.c_str()),<br>
+          nullptr,  // Retuned process handle is not inheritable.<br>
+          nullptr,  // Retuned thread handle is not inheritable.<br>
+          TRUE,  // Child inherits all inheritable handles (for write_handle_).<br>
+          0x0,   // Default creation flags.<br>
+          nullptr,  // Inherit the parent's environment.<br>
+          UnitTest::GetInstance()->original_working_dir(), &startup_info,<br>
+          &process_info) != FALSE);<br>
   child_handle_.Reset(process_info.hProcess);<br>
   ::CloseHandle(process_info.hThread);<br>
   set_spawned(true);<br>
@@ -805,38 +812,34 @@ DeathTest::TestRole WindowsDeathTest::AssumeRole() {<br>
<br>
 class FuchsiaDeathTest : public DeathTestImpl {<br>
  public:<br>
-  FuchsiaDeathTest(const char* a_statement,<br>
-                   const RE* a_regex,<br>
-                   const char* file,<br>
-                   int line)<br>
-      : DeathTestImpl(a_statement, a_regex), file_(file), line_(line) {}<br>
-  virtual ~FuchsiaDeathTest() {<br>
-    zx_status_t status = zx_handle_close(child_process_);<br>
-    GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
-    status = zx_handle_close(port_);<br>
-    GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
-  }<br>
+  FuchsiaDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+                   const char* file, int line)<br>
+      : DeathTestImpl(a_statement, std::move(matcher)),<br>
+        file_(file),<br>
+        line_(line) {}<br>
<br>
   // All of these virtual functions are inherited from DeathTest.<br>
-  virtual int Wait();<br>
-  virtual TestRole AssumeRole();<br>
+  int Wait() override;<br>
+  TestRole AssumeRole() override;<br>
+  std::string GetErrorLogs() override;<br>
<br>
  private:<br>
   // The name of the file in which the death test is located.<br>
   const char* const file_;<br>
   // The line number on which the death test is located.<br>
   const int line_;<br>
+  // The stderr data captured by the child process.<br>
+  std::string captured_stderr_;<br>
<br>
-  zx_handle_t child_process_ = ZX_HANDLE_INVALID;<br>
-  zx_handle_t port_ = ZX_HANDLE_INVALID;<br>
+  zx::process child_process_;<br>
+  zx::channel exception_channel_;<br>
+  zx::socket stderr_socket_;<br>
 };<br>
<br>
 // Utility class for accumulating command-line arguments.<br>
 class Arguments {<br>
  public:<br>
-  Arguments() {<br>
-    args_.push_back(NULL);<br>
-  }<br>
+  Arguments() { args_.push_back(nullptr); }<br>
<br>
   ~Arguments() {<br>
     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();<br>
@@ -872,51 +875,88 @@ class Arguments {<br>
 // status, or 0 if no child process exists.  As a side effect, sets the<br>
 // outcome data member.<br>
 int FuchsiaDeathTest::Wait() {<br>
+  const int kProcessKey = 0;<br>
+  const int kSocketKey = 1;<br>
+  const int kExceptionKey = 2;<br>
+<br>
   if (!spawned())<br>
     return 0;<br>
<br>
-  // Register to wait for the child process to terminate.<br>
+  // Create a port to wait for socket/task/exception events.<br>
   zx_status_t status_zx;<br>
-  status_zx = zx_object_wait_async(child_process_,<br>
-                                   port_,<br>
-                                   0 /* key */,<br>
-                                   ZX_PROCESS_TERMINATED,<br>
-                                   ZX_WAIT_ASYNC_ONCE);<br>
+  zx::port port;<br>
+  status_zx = zx::port::create(0, &port);<br>
   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
-  // Wait for it to terminate, or an exception to be received.<br>
-  zx_port_packet_t packet;<br>
-  status_zx = zx_port_wait(port_, ZX_TIME_INFINITE, &packet);<br>
+  // Register to wait for the child process to terminate.<br>
+  status_zx = child_process_.wait_async(<br>
+      port, kProcessKey, ZX_PROCESS_TERMINATED, ZX_WAIT_ASYNC_ONCE);<br>
   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
-  if (ZX_PKT_IS_EXCEPTION(packet.type)) {<br>
-    // Process encountered an exception. Kill it directly rather than letting<br>
-    // other handlers process the event.<br>
-    status_zx = zx_task_kill(child_process_);<br>
-    GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+  // Register to wait for the socket to be readable or closed.<br>
+  status_zx = stderr_socket_.wait_async(<br>
+      port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED,<br>
+      ZX_WAIT_ASYNC_ONCE);<br>
+  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
-    // Now wait for |child_process_| to terminate.<br>
-    zx_signals_t signals = 0;<br>
-    status_zx = zx_object_wait_one(<br>
-        child_process_, ZX_PROCESS_TERMINATED, ZX_TIME_INFINITE, &signals);<br>
+  // Register to wait for an exception.<br>
+  status_zx = exception_channel_.wait_async(<br>
+      port, kExceptionKey, ZX_CHANNEL_READABLE, ZX_WAIT_ASYNC_ONCE);<br>
+  GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+<br>
+  bool process_terminated = false;<br>
+  bool socket_closed = false;<br>
+  do {<br>
+    zx_port_packet_t packet = {};<br>
+    status_zx = port.wait(zx::time::infinite(), &packet);<br>
     GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
-    GTEST_DEATH_TEST_CHECK_(signals & ZX_PROCESS_TERMINATED);<br>
-  } else {<br>
-    // Process terminated.<br>
-    GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
-    GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);<br>
-  }<br>
+<br>
+    if (packet.key == kExceptionKey) {<br>
+      // Process encountered an exception. Kill it directly rather than<br>
+      // letting other handlers process the event. We will get a kProcessKey<br>
+      // event when the process actually terminates.<br>
+      status_zx = child_process_.kill();<br>
+      GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+    } else if (packet.key == kProcessKey) {<br>
+      // Process terminated.<br>
+      GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
+      GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_PROCESS_TERMINATED);<br>
+      process_terminated = true;<br>
+    } else if (packet.key == kSocketKey) {<br>
+      GTEST_DEATH_TEST_CHECK_(ZX_PKT_IS_SIGNAL_ONE(packet.type));<br>
+      if (packet.signal.observed & ZX_SOCKET_READABLE) {<br>
+        // Read data from the socket.<br>
+        constexpr size_t kBufferSize = 1024;<br>
+        do {<br>
+          size_t old_length = captured_stderr_.length();<br>
+          size_t bytes_read = 0;<br>
+          captured_stderr_.resize(old_length + kBufferSize);<br>
+          status_zx = stderr_socket_.read(<br>
+              0, &captured_stderr_.front() + old_length, kBufferSize,<br>
+              &bytes_read);<br>
+          captured_stderr_.resize(old_length + bytes_read);<br>
+        } while (status_zx == ZX_OK);<br>
+        if (status_zx == ZX_ERR_PEER_CLOSED) {<br>
+          socket_closed = true;<br>
+        } else {<br>
+          GTEST_DEATH_TEST_CHECK_(status_zx == ZX_ERR_SHOULD_WAIT);<br>
+          status_zx = stderr_socket_.wait_async(<br>
+              port, kSocketKey, ZX_SOCKET_READABLE | ZX_SOCKET_PEER_CLOSED,<br>
+              ZX_WAIT_ASYNC_ONCE);<br>
+          GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
+        }<br>
+      } else {<br>
+        GTEST_DEATH_TEST_CHECK_(packet.signal.observed & ZX_SOCKET_PEER_CLOSED);<br>
+        socket_closed = true;<br>
+      }<br>
+    }<br>
+  } while (!process_terminated && !socket_closed);<br>
<br>
   ReadAndInterpretStatusByte();<br>
<br>
   zx_info_process_t buffer;<br>
-  status_zx = zx_object_get_info(<br>
-      child_process_,<br>
-      ZX_INFO_PROCESS,<br>
-      &buffer,<br>
-      sizeof(buffer),<br>
-      nullptr,<br>
-      nullptr);<br>
+  status_zx = child_process_.get_info(<br>
+      ZX_INFO_PROCESS, &buffer, sizeof(buffer), nullptr, nullptr);<br>
   GTEST_DEATH_TEST_CHECK_(status_zx == ZX_OK);<br>
<br>
   GTEST_DEATH_TEST_CHECK_(buffer.exited);<br>
@@ -936,21 +976,20 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
   const TestInfo* const info = impl->current_test_info();<br>
   const int death_test_index = info->result()->death_test_count();<br>
<br>
-  if (flag != NULL) {<br>
+  if (flag != nullptr) {<br>
     // ParseInternalRunDeathTestFlag() has performed all the necessary<br>
     // processing.<br>
     set_write_fd(kFuchsiaReadPipeFd);<br>
     return EXECUTE_TEST;<br>
   }<br>
<br>
-  CaptureStderr();<br>
   // Flush the log buffers since the log streams are shared with the child.<br>
   FlushInfoLog();<br>
<br>
   // Build the child process command line.<br>
-  const std::string filter_flag =<br>
-      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="<br>
-      + info->test_case_name() + "." + info->name();<br>
+  const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+                                  kFilterFlag + "=" + info->test_suite_name() +<br>
+                                  "." + info->name();<br>
   const std::string internal_flag =<br>
       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="<br>
       + file_ + "|"<br>
@@ -964,35 +1003,68 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
   // Build the pipe for communication with the child.<br>
   zx_status_t status;<br>
   zx_handle_t child_pipe_handle;<br>
-  uint32_t type;<br>
-  status = fdio_pipe_half(&child_pipe_handle, &type);<br>
-  GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
-  set_read_fd(status);<br>
+  int child_pipe_fd;<br>
+  status = fdio_pipe_half(&child_pipe_fd, &child_pipe_handle);<br>
+  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
+  set_read_fd(child_pipe_fd);<br>
<br>
   // Set the pipe handle for the child.<br>
-  fdio_spawn_action_t add_handle_action = {};<br>
-  add_handle_action.action = FDIO_SPAWN_ACTION_ADD_HANDLE;<br>
-  <a href="http://add_handle_action.h.id" rel="noreferrer" target="_blank">add_handle_action.h.id</a> = PA_HND(type, kFuchsiaReadPipeFd);<br>
-  add_handle_action.h.handle = child_pipe_handle;<br>
+  fdio_spawn_action_t spawn_actions[2] = {};<br>
+  fdio_spawn_action_t* add_handle_action = &spawn_actions[0];<br>
+  add_handle_action->action = FDIO_SPAWN_ACTION_ADD_HANDLE;<br>
+  add_handle_action-><a href="http://h.id" rel="noreferrer" target="_blank">h.id</a> = PA_HND(PA_FD, kFuchsiaReadPipeFd);<br>
+  add_handle_action->h.handle = child_pipe_handle;<br>
+<br>
+  // Create a socket pair will be used to receive the child process' stderr.<br>
+  zx::socket stderr_producer_socket;<br>
+  status =<br>
+      zx::socket::create(0, &stderr_producer_socket, &stderr_socket_);<br>
+  GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
+  int stderr_producer_fd = -1;<br>
+  status =<br>
+      fdio_fd_create(stderr_producer_socket.release(), &stderr_producer_fd);<br>
+  GTEST_DEATH_TEST_CHECK_(status >= 0);<br>
<br>
-  // Spawn the child process.<br>
-  status = fdio_spawn_etc(ZX_HANDLE_INVALID, FDIO_SPAWN_CLONE_ALL,<br>
-                          args.Argv()[0], args.Argv(), nullptr, 1,<br>
-                          &add_handle_action, &child_process_, nullptr);<br>
+  // Make the stderr socket nonblocking.<br>
+  GTEST_DEATH_TEST_CHECK_(fcntl(stderr_producer_fd, F_SETFL, 0) == 0);<br>
+<br>
+  fdio_spawn_action_t* add_stderr_action = &spawn_actions[1];<br>
+  add_stderr_action->action = FDIO_SPAWN_ACTION_CLONE_FD;<br>
+  add_stderr_action->fd.local_fd = stderr_producer_fd;<br>
+  add_stderr_action->fd.target_fd = STDERR_FILENO;<br>
+<br>
+  // Create a child job.<br>
+  zx_handle_t child_job = ZX_HANDLE_INVALID;<br>
+  status = zx_job_create(zx_job_default(), 0, & child_job);<br>
+  GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
+  zx_policy_basic_t policy;<br>
+  policy.condition = ZX_POL_NEW_ANY;<br>
+  policy.policy = ZX_POL_ACTION_ALLOW;<br>
+  status = zx_job_set_policy(<br>
+      child_job, ZX_JOB_POL_RELATIVE, ZX_JOB_POL_BASIC, &policy, 1);<br>
   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
<br>
-  // Create an exception port and attach it to the |child_process_|, to allow<br>
+  // Create an exception channel attached to the |child_job|, to allow<br>
   // us to suppress the system default exception handler from firing.<br>
-  status = zx_port_create(0, &port_);<br>
+  status =<br>
+      zx_task_create_exception_channel(<br>
+          child_job, 0, exception_channel_.reset_and_get_address());<br>
   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
-  status = zx_task_bind_exception_port(<br>
-      child_process_, port_, 0 /* key */, 0 /*options */);<br>
+<br>
+  // Spawn the child process.<br>
+  status = fdio_spawn_etc(<br>
+      child_job, FDIO_SPAWN_CLONE_ALL, args.Argv()[0], args.Argv(), nullptr,<br>
+      2, spawn_actions, child_process_.reset_and_get_address(), nullptr);<br>
   GTEST_DEATH_TEST_CHECK_(status == ZX_OK);<br>
<br>
   set_spawned(true);<br>
   return OVERSEE_TEST;<br>
 }<br>
<br>
+std::string FuchsiaDeathTest::GetErrorLogs() {<br>
+  return captured_stderr_;<br>
+}<br>
+<br>
 #else  // We are neither on Windows, nor on Fuchsia.<br>
<br>
 // ForkingDeathTest provides implementations for most of the abstract<br>
@@ -1000,10 +1072,10 @@ DeathTest::TestRole FuchsiaDeathTest::AssumeRole() {<br>
 // left undefined.<br>
 class ForkingDeathTest : public DeathTestImpl {<br>
  public:<br>
-  ForkingDeathTest(const char* statement, const RE* regex);<br>
+  ForkingDeathTest(const char* statement, Matcher<const std::string&> matcher);<br>
<br>
   // All of these virtual functions are inherited from DeathTest.<br>
-  virtual int Wait();<br>
+  int Wait() override;<br>
<br>
  protected:<br>
   void set_child_pid(pid_t child_pid) { child_pid_ = child_pid; }<br>
@@ -1014,9 +1086,9 @@ class ForkingDeathTest : public DeathTestImpl {<br>
 };<br>
<br>
 // Constructs a ForkingDeathTest.<br>
-ForkingDeathTest::ForkingDeathTest(const char* a_statement, const RE* a_regex)<br>
-    : DeathTestImpl(a_statement, a_regex),<br>
-      child_pid_(-1) {}<br>
+ForkingDeathTest::ForkingDeathTest(const char* a_statement,<br>
+                                   Matcher<const std::string&> matcher)<br>
+    : DeathTestImpl(a_statement, std::move(matcher)), child_pid_(-1) {}<br>
<br>
 // Waits for the child in a death test to exit, returning its exit<br>
 // status, or 0 if no child process exists.  As a side effect, sets the<br>
@@ -1037,9 +1109,9 @@ int ForkingDeathTest::Wait() {<br>
 // in the child process.<br>
 class NoExecDeathTest : public ForkingDeathTest {<br>
  public:<br>
-  NoExecDeathTest(const char* a_statement, const RE* a_regex) :<br>
-      ForkingDeathTest(a_statement, a_regex) { }<br>
-  virtual TestRole AssumeRole();<br>
+  NoExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher)<br>
+      : ForkingDeathTest(a_statement, std::move(matcher)) {}<br>
+  TestRole AssumeRole() override;<br>
 };<br>
<br>
 // The AssumeRole process for a fork-and-run death test.  It implements a<br>
@@ -1092,10 +1164,13 @@ DeathTest::TestRole NoExecDeathTest::AssumeRole() {<br>
 // only this specific death test to be run.<br>
 class ExecDeathTest : public ForkingDeathTest {<br>
  public:<br>
-  ExecDeathTest(const char* a_statement, const RE* a_regex,<br>
-                const char* file, int line) :<br>
-      ForkingDeathTest(a_statement, a_regex), file_(file), line_(line) { }<br>
-  virtual TestRole AssumeRole();<br>
+  ExecDeathTest(const char* a_statement, Matcher<const std::string&> matcher,<br>
+                const char* file, int line)<br>
+      : ForkingDeathTest(a_statement, std::move(matcher)),<br>
+        file_(file),<br>
+        line_(line) {}<br>
+  TestRole AssumeRole() override;<br>
+<br>
  private:<br>
   static ::std::vector<std::string> GetArgvsForDeathTestChildProcess() {<br>
     ::std::vector<std::string> args = GetInjectableArgvs();<br>
@@ -1115,9 +1190,7 @@ class ExecDeathTest : public ForkingDeathTest {<br>
 // Utility class for accumulating command-line arguments.<br>
 class Arguments {<br>
  public:<br>
-  Arguments() {<br>
-    args_.push_back(NULL);<br>
-  }<br>
+  Arguments() { args_.push_back(nullptr); }<br>
<br>
   ~Arguments() {<br>
     for (std::vector<char*>::iterator i = args_.begin(); i != args_.end();<br>
@@ -1211,6 +1284,9 @@ static int ExecDeathTestChildMain(void* child_arg) {<br>
 // correct answer.<br>
 static void StackLowerThanAddress(const void* ptr,<br>
                                   bool* result) GTEST_NO_INLINE_;<br>
+// HWAddressSanitizer add a random tag to the MSB of the local variable address,<br>
+// making comparison result unpredictable.<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
 static void StackLowerThanAddress(const void* ptr, bool* result) {<br>
   int dummy;<br>
   *result = (&dummy < ptr);<br>
@@ -1218,6 +1294,7 @@ static void StackLowerThanAddress(const void* ptr, bool* result) {<br>
<br>
 // Make sure AddressSanitizer does not tamper with the stack here.<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
 static bool StackGrowsDown() {<br>
   int dummy;<br>
   bool result;<br>
@@ -1262,7 +1339,8 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
                                         fd_flags | FD_CLOEXEC));<br>
   struct inheritance inherit = {0};<br>
   // spawn is a system call.<br>
-  child_pid = spawn(args.argv[0], 0, NULL, &inherit, args.argv, GetEnviron());<br>
+  child_pid =<br>
+      spawn(args.argv[0], 0, nullptr, &inherit, args.argv, GetEnviron());<br>
   // Restores the current working directory.<br>
   GTEST_DEATH_TEST_CHECK_(fchdir(cwd_fd) != -1);<br>
   GTEST_DEATH_TEST_CHECK_SYSCALL_(close(cwd_fd));<br>
@@ -1286,9 +1364,9 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
<br>
   if (!use_fork) {<br>
     static const bool stack_grows_down = StackGrowsDown();<br>
-    const size_t stack_size = getpagesize();<br>
+    const auto stack_size = static_cast<size_t>(getpagesize());<br>
     // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.<br>
-    void* const stack = mmap(NULL, stack_size, PROT_READ | PROT_WRITE,<br>
+    void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,<br>
                              MAP_ANON | MAP_PRIVATE, -1, 0);<br>
     GTEST_DEATH_TEST_CHECK_(stack != MAP_FAILED);<br>
<br>
@@ -1302,8 +1380,9 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
     void* const stack_top =<br>
         static_cast<char*>(stack) +<br>
             (stack_grows_down ? stack_size - kMaxStackAlignment : 0);<br>
-    GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment &&<br>
-        reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0);<br>
+    GTEST_DEATH_TEST_CHECK_(<br>
+        static_cast<size_t>(stack_size) > kMaxStackAlignment &&<br>
+        reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);<br>
<br>
     child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);<br>
<br>
@@ -1320,7 +1399,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {<br>
 #  endif  // GTEST_OS_QNX<br>
 #  if GTEST_OS_LINUX<br>
   GTEST_DEATH_TEST_CHECK_SYSCALL_(<br>
-      sigaction(SIGPROF, &saved_sigprof_action, NULL));<br>
+      sigaction(SIGPROF, &saved_sigprof_action, nullptr));<br>
 #  endif  // GTEST_OS_LINUX<br>
<br>
   GTEST_DEATH_TEST_CHECK_(child_pid != -1);<br>
@@ -1338,7 +1417,7 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
   const TestInfo* const info = impl->current_test_info();<br>
   const int death_test_index = info->result()->death_test_count();<br>
<br>
-  if (flag != NULL) {<br>
+  if (flag != nullptr) {<br>
     set_write_fd(flag->write_fd());<br>
     return EXECUTE_TEST;<br>
   }<br>
@@ -1349,9 +1428,9 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
   // it be closed when the child process does an exec:<br>
   GTEST_DEATH_TEST_CHECK_(fcntl(pipe_fd[1], F_SETFD, 0) != -1);<br>
<br>
-  const std::string filter_flag =<br>
-      std::string("--") + GTEST_FLAG_PREFIX_ + kFilterFlag + "="<br>
-      + info->test_case_name() + "." + info->name();<br>
+  const std::string filter_flag = std::string("--") + GTEST_FLAG_PREFIX_ +<br>
+                                  kFilterFlag + "=" + info->test_suite_name() +<br>
+                                  "." + info->name();<br>
   const std::string internal_flag =<br>
       std::string("--") + GTEST_FLAG_PREFIX_ + kInternalRunDeathTestFlag + "="<br>
       + file_ + "|" + StreamableToString(line_) + "|"<br>
@@ -1384,7 +1463,8 @@ DeathTest::TestRole ExecDeathTest::AssumeRole() {<br>
 // by the "test" argument to its address.  If the test should be<br>
 // skipped, sets that pointer to NULL.  Returns true, unless the<br>
 // flag is set to an invalid value.<br>
-bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
+bool DefaultDeathTestFactory::Create(const char* statement,<br>
+                                     Matcher<const std::string&> matcher,<br>
                                      const char* file, int line,<br>
                                      DeathTest** test) {<br>
   UnitTestImpl* const impl = GetUnitTestImpl();<br>
@@ -1393,7 +1473,7 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
   const int death_test_index = impl->current_test_info()<br>
       ->increment_death_test_count();<br>
<br>
-  if (flag != NULL) {<br>
+  if (flag != nullptr) {<br>
     if (death_test_index > flag->index()) {<br>
       DeathTest::set_last_death_test_message(<br>
           "Death test count (" + StreamableToString(death_test_index)<br>
@@ -1404,7 +1484,7 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
<br>
     if (!(flag->file() == file && flag->line() == line &&<br>
           flag->index() == death_test_index)) {<br>
-      *test = NULL;<br>
+      *test = nullptr;<br>
       return true;<br>
     }<br>
   }<br>
@@ -1413,22 +1493,22 @@ bool DefaultDeathTestFactory::Create(const char* statement, const RE* regex,<br>
<br>
   if (GTEST_FLAG(death_test_style) == "threadsafe" ||<br>
       GTEST_FLAG(death_test_style) == "fast") {<br>
-    *test = new WindowsDeathTest(statement, regex, file, line);<br>
+    *test = new WindowsDeathTest(statement, std::move(matcher), file, line);<br>
   }<br>
<br>
 # elif GTEST_OS_FUCHSIA<br>
<br>
   if (GTEST_FLAG(death_test_style) == "threadsafe" ||<br>
       GTEST_FLAG(death_test_style) == "fast") {<br>
-    *test = new FuchsiaDeathTest(statement, regex, file, line);<br>
+    *test = new FuchsiaDeathTest(statement, std::move(matcher), file, line);<br>
   }<br>
<br>
 # else<br>
<br>
   if (GTEST_FLAG(death_test_style) == "threadsafe") {<br>
-    *test = new ExecDeathTest(statement, regex, file, line);<br>
+    *test = new ExecDeathTest(statement, std::move(matcher), file, line);<br>
   } else if (GTEST_FLAG(death_test_style) == "fast") {<br>
-    *test = new NoExecDeathTest(statement, regex);<br>
+    *test = new NoExecDeathTest(statement, std::move(matcher));<br>
   }<br>
<br>
 # endif  // GTEST_OS_WINDOWS<br>
@@ -1458,8 +1538,6 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,<br>
                    StreamableToString(parent_process_id));<br>
   }<br>
<br>
-  // FIXME: Replace the following check with a<br>
-  // compile-time assertion when available.<br>
   GTEST_CHECK_(sizeof(HANDLE) <= sizeof(size_t));<br>
<br>
   const HANDLE write_handle =<br>
@@ -1515,7 +1593,7 @@ static int GetStatusFileDescriptor(unsigned int parent_process_id,<br>
 // initialized from the GTEST_FLAG(internal_run_death_test) flag if<br>
 // the flag is specified; otherwise returns NULL.<br>
 InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag() {<br>
-  if (GTEST_FLAG(internal_run_death_test) == "") return NULL;<br>
+  if (GTEST_FLAG(internal_run_death_test) == "") return nullptr;<br>
<br>
   // GTEST_HAS_DEATH_TEST implies that we have ::std::string, so we<br>
   // can use it here.<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-filepath.cc b/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
index a7e65c082a75f..bd7b99ff03e49 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-filepath.cc<br>
@@ -38,9 +38,6 @@<br>
 #elif GTEST_OS_WINDOWS<br>
 # include <direct.h><br>
 # include <io.h><br>
-#elif GTEST_OS_SYMBIAN<br>
-// Symbian OpenC has PATH_MAX in sys/syslimits.h<br>
-# include <sys/syslimits.h><br>
 #else<br>
 # include <limits.h><br>
 # include <climits>  // Some Linux distributions define PATH_MAX here.<br>
@@ -95,13 +92,14 @@ static bool IsPathSeparator(char c) {<br>
<br>
 // Returns the current working directory, or "" if unsuccessful.<br>
 FilePath FilePath::GetCurrentDir() {<br>
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
-  // Windows CE doesn't have a current directory, so we just return<br>
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || \<br>
+    GTEST_OS_WINDOWS_RT || ARDUINO || defined(ESP_PLATFORM)<br>
+  // These platforms do not have a current directory, so we just return<br>
   // something reasonable.<br>
   return FilePath(kCurrentDirectoryString);<br>
 #elif GTEST_OS_WINDOWS<br>
   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };<br>
-  return FilePath(_getcwd(cwd, sizeof(cwd)) == NULL ? "" : cwd);<br>
+  return FilePath(_getcwd(cwd, sizeof(cwd)) == nullptr ? "" : cwd);<br>
 #else<br>
   char cwd[GTEST_PATH_MAX_ + 1] = { '\0' };<br>
   char* result = getcwd(cwd, sizeof(cwd));<br>
@@ -109,9 +107,9 @@ FilePath FilePath::GetCurrentDir() {<br>
   // getcwd will likely fail in NaCl due to the sandbox, so return something<br>
   // reasonable. The user may have provided a shim implementation for getcwd,<br>
   // however, so fallback only when failure is detected.<br>
-  return FilePath(result == NULL ? kCurrentDirectoryString : cwd);<br>
+  return FilePath(result == nullptr ? kCurrentDirectoryString : cwd);<br>
 # endif  // GTEST_OS_NACL<br>
-  return FilePath(result == NULL ? "" : cwd);<br>
+  return FilePath(result == nullptr ? "" : cwd);<br>
 #endif  // GTEST_OS_WINDOWS_MOBILE<br>
 }<br>
<br>
@@ -136,8 +134,8 @@ const char* FilePath::FindLastPathSeparator() const {<br>
 #if GTEST_HAS_ALT_PATH_SEP_<br>
   const char* const last_alt_sep = strrchr(c_str(), kAlternatePathSeparator);<br>
   // Comparing two pointers of which only one is NULL is undefined.<br>
-  if (last_alt_sep != NULL &&<br>
-      (last_sep == NULL || last_alt_sep > last_sep)) {<br>
+  if (last_alt_sep != nullptr &&<br>
+      (last_sep == nullptr || last_alt_sep > last_sep)) {<br>
     return last_alt_sep;<br>
   }<br>
 #endif<br>
@@ -165,7 +163,7 @@ FilePath FilePath::RemoveFileName() const {<br>
   const char* const last_sep = FindLastPathSeparator();<br>
   std::string dir;<br>
   if (last_sep) {<br>
-    dir = std::string(c_str(), last_sep + 1 - c_str());<br>
+    dir = std::string(c_str(), static_cast<size_t>(last_sep + 1 - c_str()));<br>
   } else {<br>
     dir = kCurrentDirectoryString;<br>
   }<br>
@@ -250,9 +248,6 @@ bool FilePath::DirectoryExists() const {<br>
 // root directory per disk drive.)<br>
 bool FilePath::IsRootDirectory() const {<br>
 #if GTEST_OS_WINDOWS<br>
-  // FIXME: on Windows a network share like<br>
-  // \\server\share can be a root directory, although it cannot be the<br>
-  // current directory.  Handle this properly.<br>
   return pathname_.length() == 3 && IsAbsolutePath();<br>
 #else<br>
   return pathname_.length() == 1 && IsPathSeparator(pathname_.c_str()[0]);<br>
@@ -324,7 +319,7 @@ bool FilePath::CreateFolder() const {<br>
 #if GTEST_OS_WINDOWS_MOBILE<br>
   FilePath removed_sep(this->RemoveTrailingPathSeparator());<br>
   LPCWSTR unicode = String::AnsiToUtf16(removed_sep.c_str());<br>
-  int result = CreateDirectory(unicode, NULL) ? 0 : -1;<br>
+  int result = CreateDirectory(unicode, nullptr) ? 0 : -1;<br>
   delete [] unicode;<br>
 #elif GTEST_OS_WINDOWS<br>
   int result = _mkdir(pathname_.c_str());<br>
@@ -350,9 +345,8 @@ FilePath FilePath::RemoveTrailingPathSeparator() const {<br>
 // Removes any redundant separators that might be in the pathname.<br>
 // For example, "bar///foo" becomes "bar/foo". Does not eliminate other<br>
 // redundancies that might be in a pathname involving "." or "..".<br>
-// FIXME: handle Windows network shares (e.g. \\server\share).<br>
 void FilePath::Normalize() {<br>
-  if (pathname_.c_str() == NULL) {<br>
+  if (pathname_.c_str() == nullptr) {<br>
     pathname_ = "";<br>
     return;<br>
   }<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-internal-inl.h b/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
index 479004149b48c..8ed70daab0943 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-internal-inl.h<br>
@@ -42,6 +42,7 @@<br>
 #include <string.h>  // For memmove.<br>
<br>
 #include <algorithm><br>
+#include <memory><br>
 #include <string><br>
 #include <vector><br>
<br>
@@ -98,14 +99,14 @@ const char kFlagfileFlag[] = "flagfile";<br>
 // A valid random seed must be in [1, kMaxRandomSeed].<br>
 const int kMaxRandomSeed = 99999;<br>
<br>
-// g_help_flag is true iff the --help flag or an equivalent form is<br>
-// specified on the command line.<br>
+// g_help_flag is true if and only if the --help flag or an equivalent form<br>
+// is specified on the command line.<br>
 GTEST_API_ extern bool g_help_flag;<br>
<br>
 // Returns the current time in milliseconds.<br>
 GTEST_API_ TimeInMillis GetTimeInMillis();<br>
<br>
-// Returns true iff Google Test should use colors in the output.<br>
+// Returns true if and only if Google Test should use colors in the output.<br>
 GTEST_API_ bool ShouldUseColor(bool stdout_is_tty);<br>
<br>
 // Formats the given time in milliseconds as seconds.<br>
@@ -230,7 +231,7 @@ GTEST_API_ std::string CodePointToUtf8(UInt32 code_point);<br>
<br>
 // Converts a wide string to a narrow string in UTF-8 encoding.<br>
 // The wide string is assumed to have the following encoding:<br>
-//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)<br>
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)<br>
 //   UTF-32 if sizeof(wchar_t) == 4 (on Linux)<br>
 // Parameter str points to a null-terminated wide string.<br>
 // Parameter num_chars may additionally limit the number<br>
@@ -265,8 +266,8 @@ GTEST_API_ bool ShouldShard(const char* total_shards_str,<br>
 GTEST_API_ Int32 Int32FromEnvOrDie(const char* env_var, Int32 default_val);<br>
<br>
 // Given the total number of shards, the shard index, and the test id,<br>
-// returns true iff the test should be run on this shard. The test id is<br>
-// some arbitrary but unique non-negative integer assigned to each test<br>
+// returns true if and only if the test should be run on this shard. The test id<br>
+// is some arbitrary but unique non-negative integer assigned to each test<br>
 // method. Assumes that 0 <= shard_index < total_shards.<br>
 GTEST_API_ bool ShouldRunTestOnShard(<br>
     int total_shards, int shard_index, int test_id);<br>
@@ -297,7 +298,8 @@ void ForEach(const Container& c, Functor functor) {<br>
 // in range [0, v.size()).<br>
 template <typename E><br>
 inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {<br>
-  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i];<br>
+  return (i < 0 || i >= static_cast<int>(v.size())) ? default_value<br>
+                                                    : v[static_cast<size_t>(i)];<br>
 }<br>
<br>
 // Performs an in-place shuffle of a range of the vector's elements.<br>
@@ -319,8 +321,11 @@ void ShuffleRange(internal::Random* random, int begin, int end,<br>
   // <a href="http://en.wikipedia.org/wiki/Fisher-Yates_shuffle" rel="noreferrer" target="_blank">http://en.wikipedia.org/wiki/Fisher-Yates_shuffle</a><br>
   for (int range_width = end - begin; range_width >= 2; range_width--) {<br>
     const int last_in_range = begin + range_width - 1;<br>
-    const int selected = begin + random->Generate(range_width);<br>
-    std::swap((*v)[selected], (*v)[last_in_range]);<br>
+    const int selected =<br>
+        begin +<br>
+        static_cast<int>(random->Generate(static_cast<UInt32>(range_width)));<br>
+    std::swap((*v)[static_cast<size_t>(selected)],<br>
+              (*v)[static_cast<size_t>(last_in_range)]);<br>
   }<br>
 }<br>
<br>
@@ -347,7 +352,7 @@ class TestPropertyKeyIs {<br>
   // TestPropertyKeyIs has NO default constructor.<br>
   explicit TestPropertyKeyIs(const std::string& key) : key_(key) {}<br>
<br>
-  // Returns true iff the test name of test property matches on key_.<br>
+  // Returns true if and only if the test name of test property matches on key_.<br>
   bool operator()(const TestProperty& test_property) const {<br>
     return test_property.key() == key_;<br>
   }<br>
@@ -380,17 +385,17 @@ class GTEST_API_ UnitTestOptions {<br>
<br>
   // Functions for processing the gtest_filter flag.<br>
<br>
-  // Returns true iff the wildcard pattern matches the string.  The<br>
-  // first ':' or '\0' character in pattern marks the end of it.<br>
+  // Returns true if and only if the wildcard pattern matches the string.<br>
+  // The first ':' or '\0' character in pattern marks the end of it.<br>
   //<br>
   // This recursive algorithm isn't very efficient, but is clear and<br>
   // works well enough for matching test names, which are short.<br>
   static bool PatternMatchesString(const char *pattern, const char *str);<br>
<br>
-  // Returns true iff the user-specified filter matches the test case<br>
-  // name and the test name.<br>
-  static bool FilterMatchesTest(const std::string &test_case_name,<br>
-                                const std::string &test_name);<br>
+  // Returns true if and only if the user-specified filter matches the test<br>
+  // suite name and the test name.<br>
+  static bool FilterMatchesTest(const std::string& test_suite_name,<br>
+                                const std::string& test_name);<br>
<br>
 #if GTEST_OS_WINDOWS<br>
   // Function for supporting the gtest_catch_exception flag.<br>
@@ -442,8 +447,8 @@ class OsStackTraceGetter : public OsStackTraceGetterInterface {<br>
  public:<br>
   OsStackTraceGetter() {}<br>
<br>
-  virtual std::string CurrentStackTrace(int max_depth, int skip_count);<br>
-  virtual void UponLeavingGTest();<br>
+  std::string CurrentStackTrace(int max_depth, int skip_count) override;<br>
+  void UponLeavingGTest() override;<br>
<br>
  private:<br>
 #if GTEST_HAS_ABSL<br>
@@ -474,7 +479,7 @@ class DefaultGlobalTestPartResultReporter<br>
   explicit DefaultGlobalTestPartResultReporter(UnitTestImpl* unit_test);<br>
   // Implements the TestPartResultReporterInterface. Reports the test part<br>
   // result in the current test.<br>
-  virtual void ReportTestPartResult(const TestPartResult& result);<br>
+  void ReportTestPartResult(const TestPartResult& result) override;<br>
<br>
  private:<br>
   UnitTestImpl* const unit_test_;<br>
@@ -490,7 +495,7 @@ class DefaultPerThreadTestPartResultReporter<br>
   explicit DefaultPerThreadTestPartResultReporter(UnitTestImpl* unit_test);<br>
   // Implements the TestPartResultReporterInterface. The implementation just<br>
   // delegates to the current global test part result reporter of *unit_test_.<br>
-  virtual void ReportTestPartResult(const TestPartResult& result);<br>
+  void ReportTestPartResult(const TestPartResult& result) override;<br>
<br>
  private:<br>
   UnitTestImpl* const unit_test_;<br>
@@ -528,22 +533,25 @@ class GTEST_API_ UnitTestImpl {<br>
   void SetTestPartResultReporterForCurrentThread(<br>
       TestPartResultReporterInterface* reporter);<br>
<br>
-  // Gets the number of successful test cases.<br>
-  int successful_test_case_count() const;<br>
+  // Gets the number of successful test suites.<br>
+  int successful_test_suite_count() const;<br>
<br>
-  // Gets the number of failed test cases.<br>
-  int failed_test_case_count() const;<br>
+  // Gets the number of failed test suites.<br>
+  int failed_test_suite_count() const;<br>
<br>
-  // Gets the number of all test cases.<br>
-  int total_test_case_count() const;<br>
+  // Gets the number of all test suites.<br>
+  int total_test_suite_count() const;<br>
<br>
-  // Gets the number of all test cases that contain at least one test<br>
+  // Gets the number of all test suites that contain at least one test<br>
   // that should run.<br>
-  int test_case_to_run_count() const;<br>
+  int test_suite_to_run_count() const;<br>
<br>
   // Gets the number of successful tests.<br>
   int successful_test_count() const;<br>
<br>
+  // Gets the number of skipped tests.<br>
+  int skipped_test_count() const;<br>
+<br>
   // Gets the number of failed tests.<br>
   int failed_test_count() const;<br>
<br>
@@ -569,27 +577,33 @@ class GTEST_API_ UnitTestImpl {<br>
   // Gets the elapsed time, in milliseconds.<br>
   TimeInMillis elapsed_time() const { return elapsed_time_; }<br>
<br>
-  // Returns true iff the unit test passed (i.e. all test cases passed).<br>
+  // Returns true if and only if the unit test passed (i.e. all test suites<br>
+  // passed).<br>
   bool Passed() const { return !Failed(); }<br>
<br>
-  // Returns true iff the unit test failed (i.e. some test case failed<br>
-  // or something outside of all tests failed).<br>
+  // Returns true if and only if the unit test failed (i.e. some test suite<br>
+  // failed or something outside of all tests failed).<br>
   bool Failed() const {<br>
-    return failed_test_case_count() > 0 || ad_hoc_test_result()->Failed();<br>
+    return failed_test_suite_count() > 0 || ad_hoc_test_result()->Failed();<br>
   }<br>
<br>
-  // Gets the i-th test case among all the test cases. i can range from 0 to<br>
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
-  const TestCase* GetTestCase(int i) const {<br>
-    const int index = GetElementOr(test_case_indices_, i, -1);<br>
-    return index < 0 ? NULL : test_cases_[i];<br>
+  // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+  // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+  const TestSuite* GetTestSuite(int i) const {<br>
+    const int index = GetElementOr(test_suite_indices_, i, -1);<br>
+    return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];<br>
   }<br>
<br>
-  // Gets the i-th test case among all the test cases. i can range from 0 to<br>
-  // total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
-  TestCase* GetMutableTestCase(int i) {<br>
-    const int index = GetElementOr(test_case_indices_, i, -1);<br>
-    return index < 0 ? NULL : test_cases_[index];<br>
+  //  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  const TestCase* GetTestCase(int i) const { return GetTestSuite(i); }<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+  // Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+  // total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+  TestSuite* GetMutableSuiteCase(int i) {<br>
+    const int index = GetElementOr(test_suite_indices_, i, -1);<br>
+    return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];<br>
   }<br>
<br>
   // Provides access to the event listener list.<br>
@@ -626,30 +640,38 @@ class GTEST_API_ UnitTestImpl {<br>
   // trace but Bar() and CurrentOsStackTraceExceptTop() won't.<br>
   std::string CurrentOsStackTraceExceptTop(int skip_count) GTEST_NO_INLINE_;<br>
<br>
-  // Finds and returns a TestCase with the given name.  If one doesn't<br>
+  // Finds and returns a TestSuite with the given name.  If one doesn't<br>
   // exist, creates one and returns it.<br>
   //<br>
   // Arguments:<br>
   //<br>
-  //   test_case_name: name of the test case<br>
+  //   test_suite_name: name of the test suite<br>
   //   type_param:     the name of the test's type parameter, or NULL if<br>
   //                   this is not a typed or a type-parameterized test.<br>
-  //   set_up_tc:      pointer to the function that sets up the test case<br>
-  //   tear_down_tc:   pointer to the function that tears down the test case<br>
-  TestCase* GetTestCase(const char* test_case_name,<br>
-                        const char* type_param,<br>
-                        Test::SetUpTestCaseFunc set_up_tc,<br>
-                        Test::TearDownTestCaseFunc tear_down_tc);<br>
+  //   set_up_tc:      pointer to the function that sets up the test suite<br>
+  //   tear_down_tc:   pointer to the function that tears down the test suite<br>
+  TestSuite* GetTestSuite(const char* test_suite_name, const char* type_param,<br>
+                          internal::SetUpTestSuiteFunc set_up_tc,<br>
+                          internal::TearDownTestSuiteFunc tear_down_tc);<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  TestCase* GetTestCase(const char* test_case_name, const char* type_param,<br>
+                        internal::SetUpTestSuiteFunc set_up_tc,<br>
+                        internal::TearDownTestSuiteFunc tear_down_tc) {<br>
+    return GetTestSuite(test_case_name, type_param, set_up_tc, tear_down_tc);<br>
+  }<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
   // Adds a TestInfo to the unit test.<br>
   //<br>
   // Arguments:<br>
   //<br>
-  //   set_up_tc:    pointer to the function that sets up the test case<br>
-  //   tear_down_tc: pointer to the function that tears down the test case<br>
+  //   set_up_tc:    pointer to the function that sets up the test suite<br>
+  //   tear_down_tc: pointer to the function that tears down the test suite<br>
   //   test_info:    the TestInfo object<br>
-  void AddTestInfo(Test::SetUpTestCaseFunc set_up_tc,<br>
-                   Test::TearDownTestCaseFunc tear_down_tc,<br>
+  void AddTestInfo(internal::SetUpTestSuiteFunc set_up_tc,<br>
+                   internal::TearDownTestSuiteFunc tear_down_tc,<br>
                    TestInfo* test_info) {<br>
     // In order to support thread-safe death tests, we need to<br>
     // remember the original working directory when the test program<br>
@@ -664,21 +686,20 @@ class GTEST_API_ UnitTestImpl {<br>
           << "Failed to get the current working directory.";<br>
     }<br>
<br>
-    GetTestCase(test_info->test_case_name(),<br>
-                test_info->type_param(),<br>
-                set_up_tc,<br>
-                tear_down_tc)->AddTestInfo(test_info);<br>
+    GetTestSuite(test_info->test_suite_name(), test_info->type_param(),<br>
+                 set_up_tc, tear_down_tc)<br>
+        ->AddTestInfo(test_info);<br>
   }<br>
<br>
-  // Returns ParameterizedTestCaseRegistry object used to keep track of<br>
+  // Returns ParameterizedTestSuiteRegistry object used to keep track of<br>
   // value-parameterized tests and instantiate and register them.<br>
-  internal::ParameterizedTestCaseRegistry& parameterized_test_registry() {<br>
+  internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() {<br>
     return parameterized_test_registry_;<br>
   }<br>
<br>
-  // Sets the TestCase object for the test that's currently running.<br>
-  void set_current_test_case(TestCase* a_current_test_case) {<br>
-    current_test_case_ = a_current_test_case;<br>
+  // Sets the TestSuite object for the test that's currently running.<br>
+  void set_current_test_suite(TestSuite* a_current_test_suite) {<br>
+    current_test_suite_ = a_current_test_suite;<br>
   }<br>
<br>
   // Sets the TestInfo object for the test that's currently running.  If<br>
@@ -689,7 +710,7 @@ class GTEST_API_ UnitTestImpl {<br>
   }<br>
<br>
   // Registers all parameterized tests defined using TEST_P and<br>
-  // INSTANTIATE_TEST_CASE_P, creating regular tests for each test/parameter<br>
+  // INSTANTIATE_TEST_SUITE_P, creating regular tests for each test/parameter<br>
   // combination. This method can be called more then once; it has guards<br>
   // protecting from registering the tests more then once.  If<br>
   // value-parameterized tests are disabled, RegisterParameterizedTests is<br>
@@ -704,7 +725,7 @@ class GTEST_API_ UnitTestImpl {<br>
<br>
   // Clears the results of all tests, except the ad hoc tests.<br>
   void ClearNonAdHocTestResult() {<br>
-    ForEach(test_cases_, TestCase::ClearTestCaseResult);<br>
+    ForEach(test_suites_, TestSuite::ClearTestSuiteResult);<br>
   }<br>
<br>
   // Clears the results of ad-hoc test assertions.<br>
@@ -713,7 +734,7 @@ class GTEST_API_ UnitTestImpl {<br>
   }<br>
<br>
   // Adds a TestProperty to the current TestResult object when invoked in a<br>
-  // context of a test or a test case, or to the global property set. If the<br>
+  // context of a test or a test suite, or to the global property set. If the<br>
   // result already contains a property with the same key, the value will be<br>
   // updated.<br>
   void RecordProperty(const TestProperty& test_property);<br>
@@ -725,7 +746,7 @@ class GTEST_API_ UnitTestImpl {<br>
<br>
   // Matches the full name of each test against the user-specified<br>
   // filter to decide whether the test should run, then records the<br>
-  // result in each TestCase and TestInfo object.<br>
+  // result in each TestSuite and TestInfo object.<br>
   // If shard_tests == HONOR_SHARDING_PROTOCOL, further filters tests<br>
   // based on sharding variables in the environment.<br>
   // Returns the number of tests that should run.<br>
@@ -734,7 +755,7 @@ class GTEST_API_ UnitTestImpl {<br>
   // Prints the names of the tests matching the user-specified filter flag.<br>
   void ListTestsMatchingFilter();<br>
<br>
-  const TestCase* current_test_case() const { return current_test_case_; }<br>
+  const TestSuite* current_test_suite() const { return current_test_suite_; }<br>
   TestInfo* current_test_info() { return current_test_info_; }<br>
   const TestInfo* current_test_info() const { return current_test_info_; }<br>
<br>
@@ -795,11 +816,11 @@ class GTEST_API_ UnitTestImpl {<br>
   // Gets the random number generator.<br>
   internal::Random* random() { return &random_; }<br>
<br>
-  // Shuffles all test cases, and the tests within each test case,<br>
+  // Shuffles all test suites, and the tests within each test suite,<br>
   // making sure that death tests are still run first.<br>
   void ShuffleTests();<br>
<br>
-  // Restores the test cases and tests to their order before the first shuffle.<br>
+  // Restores the test suites and tests to their order before the first shuffle.<br>
   void UnshuffleTests();<br>
<br>
   // Returns the value of GTEST_FLAG(catch_exceptions) at the moment<br>
@@ -839,31 +860,31 @@ class GTEST_API_ UnitTestImpl {<br>
   // before/after the tests are run.<br>
   std::vector<Environment*> environments_;<br>
<br>
-  // The vector of TestCases in their original order.  It owns the<br>
+  // The vector of TestSuites in their original order.  It owns the<br>
   // elements in the vector.<br>
-  std::vector<TestCase*> test_cases_;<br>
+  std::vector<TestSuite*> test_suites_;<br>
<br>
-  // Provides a level of indirection for the test case list to allow<br>
-  // easy shuffling and restoring the test case order.  The i-th<br>
-  // element of this vector is the index of the i-th test case in the<br>
+  // Provides a level of indirection for the test suite list to allow<br>
+  // easy shuffling and restoring the test suite order.  The i-th<br>
+  // element of this vector is the index of the i-th test suite in the<br>
   // shuffled order.<br>
-  std::vector<int> test_case_indices_;<br>
+  std::vector<int> test_suite_indices_;<br>
<br>
   // ParameterizedTestRegistry object used to register value-parameterized<br>
   // tests.<br>
-  internal::ParameterizedTestCaseRegistry parameterized_test_registry_;<br>
+  internal::ParameterizedTestSuiteRegistry parameterized_test_registry_;<br>
<br>
   // Indicates whether RegisterParameterizedTests() has been called already.<br>
   bool parameterized_tests_registered_;<br>
<br>
-  // Index of the last death test case registered.  Initially -1.<br>
-  int last_death_test_case_;<br>
+  // Index of the last death test suite registered.  Initially -1.<br>
+  int last_death_test_suite_;<br>
<br>
-  // This points to the TestCase for the currently running test.  It<br>
-  // changes as Google Test goes through one test case after another.<br>
+  // This points to the TestSuite for the currently running test.  It<br>
+  // changes as Google Test goes through one test suite after another.<br>
   // When no test is running, this is set to NULL and Google Test<br>
   // stores assertion results in ad_hoc_test_result_.  Initially NULL.<br>
-  TestCase* current_test_case_;<br>
+  TestSuite* current_test_suite_;<br>
<br>
   // This points to the TestInfo for the currently running test.  It<br>
   // changes as Google Test goes through one test after another.  When<br>
@@ -891,7 +912,7 @@ class GTEST_API_ UnitTestImpl {<br>
   // desired.<br>
   OsStackTraceGetterInterface* os_stack_trace_getter_;<br>
<br>
-  // True iff PostFlagParsingInit() has been called.<br>
+  // True if and only if PostFlagParsingInit() has been called.<br>
   bool post_flag_parse_init_performed_;<br>
<br>
   // The random number seed used at the beginning of the test run.<br>
@@ -910,8 +931,8 @@ class GTEST_API_ UnitTestImpl {<br>
 #if GTEST_HAS_DEATH_TEST<br>
   // The decomposed components of the gtest_internal_run_death_test flag,<br>
   // parsed when RUN_ALL_TESTS is called.<br>
-  internal::scoped_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;<br>
-  internal::scoped_ptr<internal::DeathTestFactory> death_test_factory_;<br>
+  std::unique_ptr<InternalRunDeathTestFlag> internal_run_death_test_flag_;<br>
+  std::unique_ptr<internal::DeathTestFactory> death_test_factory_;<br>
 #endif  // GTEST_HAS_DEATH_TEST<br>
<br>
   // A per-thread stack of traces created by the SCOPED_TRACE() macro.<br>
@@ -994,8 +1015,6 @@ bool ParseNaturalNumber(const ::std::string& str, Integer* number) {<br>
<br>
   const bool parse_success = *end == '\0' && errno == 0;<br>
<br>
-  // FIXME: Convert this to compile time assertion when it is<br>
-  // available.<br>
   GTEST_CHECK_(sizeof(Integer) <= sizeof(parsed));<br>
<br>
   const Integer result = static_cast<Integer>(parsed);<br>
@@ -1059,18 +1078,18 @@ class StreamingListener : public EmptyTestEventListener {<br>
       MakeConnection();<br>
     }<br>
<br>
-    virtual ~SocketWriter() {<br>
+    ~SocketWriter() override {<br>
       if (sockfd_ != -1)<br>
         CloseConnection();<br>
     }<br>
<br>
     // Sends a string to the socket.<br>
-    virtual void Send(const std::string& message) {<br>
+    void Send(const std::string& message) override {<br>
       GTEST_CHECK_(sockfd_ != -1)<br>
           << "Send() can be called only when there is a connection.";<br>
<br>
-      const int len = static_cast<int>(message.length());<br>
-      if (write(sockfd_, message.c_str(), len) != len) {<br>
+      const auto len = static_cast<size_t>(message.length());<br>
+      if (write(sockfd_, message.c_str(), len) != static_cast<ssize_t>(len)) {<br>
         GTEST_LOG_(WARNING)<br>
             << "stream_result_to: failed to stream to "<br>
             << host_name_ << ":" << port_num_;<br>
@@ -1082,7 +1101,7 @@ class StreamingListener : public EmptyTestEventListener {<br>
     void MakeConnection();<br>
<br>
     // Closes the socket.<br>
-    void CloseConnection() {<br>
+    void CloseConnection() override {<br>
       GTEST_CHECK_(sockfd_ != -1)<br>
           << "CloseConnection() can be called only when there is a connection.";<br>
<br>
@@ -1108,11 +1127,11 @@ class StreamingListener : public EmptyTestEventListener {<br>
   explicit StreamingListener(AbstractSocketWriter* socket_writer)<br>
       : socket_writer_(socket_writer) { Start(); }<br>
<br>
-  void OnTestProgramStart(const UnitTest& /* unit_test */) {<br>
+  void OnTestProgramStart(const UnitTest& /* unit_test */) override {<br>
     SendLn("event=TestProgramStart");<br>
   }<br>
<br>
-  void OnTestProgramEnd(const UnitTest& unit_test) {<br>
+  void OnTestProgramEnd(const UnitTest& unit_test) override {<br>
     // Note that Google Test current only report elapsed time for each<br>
     // test iteration, not for the entire test program.<br>
     SendLn("event=TestProgramEnd&passed=" + FormatBool(unit_test.Passed()));<br>
@@ -1121,42 +1140,47 @@ class StreamingListener : public EmptyTestEventListener {<br>
     socket_writer_->CloseConnection();<br>
   }<br>
<br>
-  void OnTestIterationStart(const UnitTest& /* unit_test */, int iteration) {<br>
+  void OnTestIterationStart(const UnitTest& /* unit_test */,<br>
+                            int iteration) override {<br>
     SendLn("event=TestIterationStart&iteration=" +<br>
            StreamableToString(iteration));<br>
   }<br>
<br>
-  void OnTestIterationEnd(const UnitTest& unit_test, int /* iteration */) {<br>
+  void OnTestIterationEnd(const UnitTest& unit_test,<br>
+                          int /* iteration */) override {<br>
     SendLn("event=TestIterationEnd&passed=" +<br>
            FormatBool(unit_test.Passed()) + "&elapsed_time=" +<br>
            StreamableToString(unit_test.elapsed_time()) + "ms");<br>
   }<br>
<br>
-  void OnTestCaseStart(const TestCase& test_case) {<br>
+  // Note that "event=TestCaseStart" is a wire format and has to remain<br>
+  // "case" for compatibilty<br>
+  void OnTestCaseStart(const TestCase& test_case) override {<br>
     SendLn(std::string("event=TestCaseStart&name=") + <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
   }<br>
<br>
-  void OnTestCaseEnd(const TestCase& test_case) {<br>
-    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed())<br>
-           + "&elapsed_time=" + StreamableToString(test_case.elapsed_time())<br>
-           + "ms");<br>
+  // Note that "event=TestCaseEnd" is a wire format and has to remain<br>
+  // "case" for compatibilty<br>
+  void OnTestCaseEnd(const TestCase& test_case) override {<br>
+    SendLn("event=TestCaseEnd&passed=" + FormatBool(test_case.Passed()) +<br>
+           "&elapsed_time=" + StreamableToString(test_case.elapsed_time()) +<br>
+           "ms");<br>
   }<br>
<br>
-  void OnTestStart(const TestInfo& test_info) {<br>
+  void OnTestStart(const TestInfo& test_info) override {<br>
     SendLn(std::string("event=TestStart&name=") + <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
   }<br>
<br>
-  void OnTestEnd(const TestInfo& test_info) {<br>
+  void OnTestEnd(const TestInfo& test_info) override {<br>
     SendLn("event=TestEnd&passed=" +<br>
            FormatBool((test_info.result())->Passed()) +<br>
            "&elapsed_time=" +<br>
            StreamableToString((test_info.result())->elapsed_time()) + "ms");<br>
   }<br>
<br>
-  void OnTestPartResult(const TestPartResult& test_part_result) {<br>
+  void OnTestPartResult(const TestPartResult& test_part_result) override {<br>
     const char* file_name = test_part_result.file_name();<br>
-    if (file_name == NULL)<br>
-      file_name = "";<br>
+    if (file_name == nullptr) file_name = "";<br>
     SendLn("event=TestPartResult&file=" + UrlEncode(file_name) +<br>
            "&line=" + StreamableToString(test_part_result.line_number()) +<br>
            "&message=" + UrlEncode(test_part_result.message()));<br>
@@ -1172,7 +1196,7 @@ class StreamingListener : public EmptyTestEventListener {<br>
<br>
   std::string FormatBool(bool value) { return value ? "1" : "0"; }<br>
<br>
-  const scoped_ptr<AbstractSocketWriter> socket_writer_;<br>
+  const std::unique_ptr<AbstractSocketWriter> socket_writer_;<br>
<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamingListener);<br>
 };  // class StreamingListener<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-matchers.cc b/llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
new file mode 100644<br>
index 0000000000000..7d2fb6851ec41<br>
--- /dev/null<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-matchers.cc<br>
@@ -0,0 +1,97 @@<br>
+// Copyright 2007, Google Inc.<br>
+// All rights reserved.<br>
+//<br>
+// Redistribution and use in source and binary forms, with or without<br>
+// modification, are permitted provided that the following conditions are<br>
+// met:<br>
+//<br>
+//     * Redistributions of source code must retain the above copyright<br>
+// notice, this list of conditions and the following disclaimer.<br>
+//     * Redistributions in binary form must reproduce the above<br>
+// copyright notice, this list of conditions and the following disclaimer<br>
+// in the documentation and/or other materials provided with the<br>
+// distribution.<br>
+//     * Neither the name of Google Inc. nor the names of its<br>
+// contributors may be used to endorse or promote products derived from<br>
+// this software without specific prior written permission.<br>
+//<br>
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS<br>
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT<br>
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR<br>
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT<br>
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,<br>
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT<br>
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,<br>
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY<br>
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT<br>
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE<br>
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.<br>
+<br>
+// The Google C++ Testing and Mocking Framework (Google Test)<br>
+//<br>
+// This file implements just enough of the matcher interface to allow<br>
+// EXPECT_DEATH and friends to accept a matcher argument.<br>
+<br>
+#include "gtest/internal/gtest-internal.h"<br>
+#include "gtest/internal/gtest-port.h"<br>
+#include "gtest/gtest-matchers.h"<br>
+<br>
+#include <string><br>
+<br>
+namespace testing {<br>
+<br>
+// Constructs a matcher that matches a const std::string& whose value is<br>
+// equal to s.<br>
+Matcher<const std::string&>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a const std::string& whose value is<br>
+// equal to s.<br>
+Matcher<const std::string&>::Matcher(const char* s) {<br>
+  *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a std::string whose value is equal to<br>
+// s.<br>
+Matcher<std::string>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a std::string whose value is equal to<br>
+// s.<br>
+Matcher<std::string>::Matcher(const char* s) { *this = Eq(std::string(s)); }<br>
+<br>
+#if GTEST_HAS_ABSL<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(const std::string& s) {<br>
+  *this = Eq(s);<br>
+}<br>
+<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(const char* s) {<br>
+  *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a const absl::string_view& whose value is<br>
+// equal to s.<br>
+Matcher<const absl::string_view&>::Matcher(absl::string_view s) {<br>
+  *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(const std::string& s) { *this = Eq(s); }<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(const char* s) {<br>
+  *this = Eq(std::string(s));<br>
+}<br>
+<br>
+// Constructs a matcher that matches a absl::string_view whose value is equal to<br>
+// s.<br>
+Matcher<absl::string_view>::Matcher(absl::string_view s) {<br>
+  *this = Eq(std::string(s));<br>
+}<br>
+#endif  // GTEST_HAS_ABSL<br>
+<br>
+}  // namespace testing<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-port.cc b/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
index fecb5d11c2129..fc5ba6becc55f 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-port.cc<br>
@@ -31,16 +31,20 @@<br>
 #include "gtest/internal/gtest-port.h"<br>
<br>
 #include <limits.h><br>
-#include <stdlib.h><br>
 #include <stdio.h><br>
+#include <stdlib.h><br>
 #include <string.h><br>
 #include <fstream><br>
+#include <memory><br>
<br>
 #if GTEST_OS_WINDOWS<br>
 # include <windows.h><br>
 # include <io.h><br>
 # include <sys/stat.h><br>
 # include <map>  // Used in ThreadLocal.<br>
+# ifdef _MSC_VER<br>
+#  include <crtdbg.h><br>
+# endif  // _MSC_VER<br>
 #else<br>
 # include <unistd.h><br>
 #endif  // GTEST_OS_WINDOWS<br>
@@ -51,6 +55,14 @@<br>
 # include <mach/vm_map.h><br>
 #endif  // GTEST_OS_MAC<br>
<br>
+#if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \<br>
+    GTEST_OS_NETBSD || GTEST_OS_OPENBSD<br>
+# include <sys/sysctl.h><br>
+# if GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD<br>
+#  include <sys/user.h><br>
+# endif<br>
+#endif<br>
+<br>
 #if GTEST_OS_QNX<br>
 # include <devctl.h><br>
 # include <fcntl.h><br>
@@ -105,7 +117,7 @@ T ReadProcFileField(const std::string& filename, int field) {<br>
 size_t GetThreadCount() {<br>
   const std::string filename =<br>
       (Message() << "/proc/" << getpid() << "/stat").GetString();<br>
-  return ReadProcFileField<int>(filename, 19);<br>
+  return ReadProcFileField<size_t>(filename, 19);<br>
 }<br>
<br>
 #elif GTEST_OS_MAC<br>
@@ -127,6 +139,81 @@ size_t GetThreadCount() {<br>
   }<br>
 }<br>
<br>
+#elif GTEST_OS_DRAGONFLY || GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD || \<br>
+      GTEST_OS_NETBSD<br>
+<br>
+#if GTEST_OS_NETBSD<br>
+#undef KERN_PROC<br>
+#define KERN_PROC KERN_PROC2<br>
+#define kinfo_proc kinfo_proc2<br>
+#endif<br>
+<br>
+#if GTEST_OS_DRAGONFLY<br>
+#define KP_NLWP(kp) (kp.kp_nthreads)<br>
+#elif GTEST_OS_FREEBSD || GTEST_OS_GNU_KFREEBSD<br>
+#define KP_NLWP(kp) (kp.ki_numthreads)<br>
+#elif GTEST_OS_NETBSD<br>
+#define KP_NLWP(kp) (kp.p_nlwps)<br>
+#endif<br>
+<br>
+// Returns the number of threads running in the process, or 0 to indicate that<br>
+// we cannot detect it.<br>
+size_t GetThreadCount() {<br>
+  int mib[] = {<br>
+    CTL_KERN,<br>
+    KERN_PROC,<br>
+    KERN_PROC_PID,<br>
+    getpid(),<br>
+#if GTEST_OS_NETBSD<br>
+    sizeof(struct kinfo_proc),<br>
+    1,<br>
+#endif<br>
+  };<br>
+  u_int miblen = sizeof(mib) / sizeof(mib[0]);<br>
+  struct kinfo_proc info;<br>
+  size_t size = sizeof(info);<br>
+  if (sysctl(mib, miblen, &info, &size, NULL, 0)) {<br>
+    return 0;<br>
+  }<br>
+  return static_cast<size_t>(KP_NLWP(info));<br>
+}<br>
+#elif GTEST_OS_OPENBSD<br>
+<br>
+// Returns the number of threads running in the process, or 0 to indicate that<br>
+// we cannot detect it.<br>
+size_t GetThreadCount() {<br>
+  int mib[] = {<br>
+    CTL_KERN,<br>
+    KERN_PROC,<br>
+    KERN_PROC_PID | KERN_PROC_SHOW_THREADS,<br>
+    getpid(),<br>
+    sizeof(struct kinfo_proc),<br>
+    0,<br>
+  };<br>
+  u_int miblen = sizeof(mib) / sizeof(mib[0]);<br>
+<br>
+  // get number of structs<br>
+  size_t size;<br>
+  if (sysctl(mib, miblen, NULL, &size, NULL, 0)) {<br>
+    return 0;<br>
+  }<br>
+  mib[5] = size / mib[4];<br>
+<br>
+  // populate array of structs<br>
+  struct kinfo_proc info[mib[5]];<br>
+  if (sysctl(mib, miblen, &info, &size, NULL, 0)) {<br>
+    return 0;<br>
+  }<br>
+<br>
+  // exclude empty members<br>
+  int nthreads = 0;<br>
+  for (int i = 0; i < size / mib[4]; i++) {<br>
+    if (info[i].p_tid != -1)<br>
+      nthreads++;<br>
+  }<br>
+  return nthreads;<br>
+}<br>
+<br>
 #elif GTEST_OS_QNX<br>
<br>
 // Returns the number of threads running in the process, or 0 to indicate that<br>
@@ -138,7 +225,7 @@ size_t GetThreadCount() {<br>
   }<br>
   procfs_info process_info;<br>
   const int status =<br>
-      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), NULL);<br>
+      devctl(fd, DCMD_PROC_INFO, &process_info, sizeof(process_info), nullptr);<br>
   close(fd);<br>
   if (status == EOK) {<br>
     return static_cast<size_t>(process_info.num_threads);<br>
@@ -152,7 +239,7 @@ size_t GetThreadCount() {<br>
 size_t GetThreadCount() {<br>
   struct procentry64 entry;<br>
   pid_t pid = getpid();<br>
-  int status = getprocs64(&entry, sizeof(entry), NULL, 0, &pid, 1);<br>
+  int status = getprocs64(&entry, sizeof(entry), nullptr, 0, &pid, 1);<br>
   if (status == 1) {<br>
     return entry.pi_thcount;<br>
   } else {<br>
@@ -192,7 +279,7 @@ size_t GetThreadCount() {<br>
 #if GTEST_IS_THREADSAFE && GTEST_OS_WINDOWS<br>
<br>
 void SleepMilliseconds(int n) {<br>
-  ::Sleep(n);<br>
+  ::Sleep(static_cast<DWORD>(n));<br>
 }<br>
<br>
 AutoHandle::AutoHandle()<br>
@@ -230,15 +317,15 @@ void AutoHandle::Reset(HANDLE handle) {<br>
 bool AutoHandle::IsCloseable() const {<br>
   // Different Windows APIs may use either of these values to represent an<br>
   // invalid handle.<br>
-  return handle_ != NULL && handle_ != INVALID_HANDLE_VALUE;<br>
+  return handle_ != nullptr && handle_ != INVALID_HANDLE_VALUE;<br>
 }<br>
<br>
 Notification::Notification()<br>
-    : event_(::CreateEvent(NULL,   // Default security attributes.<br>
-                           TRUE,   // Do not reset automatically.<br>
-                           FALSE,  // Initially unset.<br>
-                           NULL)) {  // Anonymous event.<br>
-  GTEST_CHECK_(event_.Get() != NULL);<br>
+    : event_(::CreateEvent(nullptr,     // Default security attributes.<br>
+                           TRUE,        // Do not reset automatically.<br>
+                           FALSE,       // Initially unset.<br>
+                           nullptr)) {  // Anonymous event.<br>
+  GTEST_CHECK_(event_.Get() != nullptr);<br>
 }<br>
<br>
 void Notification::Notify() {<br>
@@ -261,13 +348,10 @@ Mutex::Mutex()<br>
 Mutex::~Mutex() {<br>
   // Static mutexes are leaked intentionally. It is not thread-safe to try<br>
   // to clean them up.<br>
-  // FIXME: Switch to Slim Reader/Writer (SRW) Locks, which requires<br>
-  // nothing to clean it up but is available only on Vista and later.<br>
-  // <a href="https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks" rel="noreferrer" target="_blank">https://docs.microsoft.com/en-us/windows/desktop/Sync/slim-reader-writer--srw--locks</a><br>
   if (type_ == kDynamic) {<br>
     ::DeleteCriticalSection(critical_section_);<br>
     delete critical_section_;<br>
-    critical_section_ = NULL;<br>
+    critical_section_ = nullptr;<br>
   }<br>
 }<br>
<br>
@@ -296,6 +380,7 @@ void Mutex::AssertHeld() {<br>
<br>
 namespace {<br>
<br>
+#ifdef _MSC_VER<br>
 // Use the RAII idiom to flag mem allocs that are intentionally never<br>
 // deallocated. The motivation is to silence the false positive mem leaks<br>
 // that are reported by the debug version of MS's CRT which can only detect<br>
@@ -308,19 +393,15 @@ class MemoryIsNotDeallocated<br>
 {<br>
  public:<br>
   MemoryIsNotDeallocated() : old_crtdbg_flag_(0) {<br>
-#ifdef _MSC_VER<br>
     old_crtdbg_flag_ = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG);<br>
     // Set heap allocation block type to _IGNORE_BLOCK so that MS debug CRT<br>
     // doesn't report mem leak if there's no matching deallocation.<br>
     _CrtSetDbgFlag(old_crtdbg_flag_ & ~_CRTDBG_ALLOC_MEM_DF);<br>
-#endif  //  _MSC_VER<br>
   }<br>
<br>
   ~MemoryIsNotDeallocated() {<br>
-#ifdef _MSC_VER<br>
     // Restore the original _CRTDBG_ALLOC_MEM_DF flag<br>
     _CrtSetDbgFlag(old_crtdbg_flag_);<br>
-#endif  //  _MSC_VER<br>
   }<br>
<br>
  private:<br>
@@ -328,6 +409,7 @@ class MemoryIsNotDeallocated<br>
<br>
   GTEST_DISALLOW_COPY_AND_ASSIGN_(MemoryIsNotDeallocated);<br>
 };<br>
+#endif  // _MSC_VER<br>
<br>
 }  // namespace<br>
<br>
@@ -343,7 +425,9 @@ void Mutex::ThreadSafeLazyInit() {<br>
         owner_thread_id_ = 0;<br>
         {<br>
           // Use RAII to flag that following mem alloc is never deallocated.<br>
+#ifdef _MSC_VER<br>
           MemoryIsNotDeallocated memory_is_not_deallocated;<br>
+#endif  // _MSC_VER<br>
           critical_section_ = new CRITICAL_SECTION;<br>
         }<br>
         ::InitializeCriticalSection(critical_section_);<br>
@@ -384,17 +468,16 @@ class ThreadWithParamSupport : public ThreadWithParamBase {<br>
                              Notification* thread_can_start) {<br>
     ThreadMainParam* param = new ThreadMainParam(runnable, thread_can_start);<br>
     DWORD thread_id;<br>
-    // FIXME: Consider to use _beginthreadex instead.<br>
     HANDLE thread_handle = ::CreateThread(<br>
-        NULL,    // Default security.<br>
-        0,       // Default stack size.<br>
+        nullptr,  // Default security.<br>
+        0,        // Default stack size.<br>
         &ThreadWithParamSupport::ThreadMain,<br>
-        param,   // Parameter to ThreadMainStatic<br>
-        0x0,     // Default creation flags.<br>
+        param,        // Parameter to ThreadMainStatic<br>
+        0x0,          // Default creation flags.<br>
         &thread_id);  // Need a valid pointer for the call to work under Win98.<br>
-    GTEST_CHECK_(thread_handle != NULL) << "CreateThread failed with error "<br>
-                                        << ::GetLastError() << ".";<br>
-    if (thread_handle == NULL) {<br>
+    GTEST_CHECK_(thread_handle != nullptr)<br>
+        << "CreateThread failed with error " << ::GetLastError() << ".";<br>
+    if (thread_handle == nullptr) {<br>
       delete param;<br>
     }<br>
     return thread_handle;<br>
@@ -406,15 +489,15 @@ class ThreadWithParamSupport : public ThreadWithParamBase {<br>
         : runnable_(runnable),<br>
           thread_can_start_(thread_can_start) {<br>
     }<br>
-    scoped_ptr<Runnable> runnable_;<br>
+    std::unique_ptr<Runnable> runnable_;<br>
     // Does not own.<br>
     Notification* thread_can_start_;<br>
   };<br>
<br>
   static DWORD WINAPI ThreadMain(void* ptr) {<br>
     // Transfers ownership.<br>
-    scoped_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));<br>
-    if (param->thread_can_start_ != NULL)<br>
+    std::unique_ptr<ThreadMainParam> param(static_cast<ThreadMainParam*>(ptr));<br>
+    if (param->thread_can_start_ != nullptr)<br>
       param->thread_can_start_->WaitForNotification();<br>
     param->runnable_->Run();<br>
     return 0;<br>
@@ -472,7 +555,7 @@ class ThreadLocalRegistryImpl {<br>
           thread_local_values<br>
               .insert(std::make_pair(<br>
                   thread_local_instance,<br>
-                  linked_ptr<ThreadLocalValueHolderBase>(<br>
+                  std::shared_ptr<ThreadLocalValueHolderBase>(<br>
                       thread_local_instance->NewValueForCurrentThread())))<br>
               .first;<br>
     }<br>
@@ -481,7 +564,7 @@ class ThreadLocalRegistryImpl {<br>
<br>
   static void OnThreadLocalDestroyed(<br>
       const ThreadLocalBase* thread_local_instance) {<br>
-    std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
+    std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
     // Clean up the ThreadLocalValues data structure while holding the lock, but<br>
     // defer the destruction of the ThreadLocalValueHolderBases.<br>
     {<br>
@@ -509,7 +592,7 @@ class ThreadLocalRegistryImpl {<br>
<br>
   static void OnThreadExit(DWORD thread_id) {<br>
     GTEST_CHECK_(thread_id != 0) << ::GetLastError();<br>
-    std::vector<linked_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
+    std::vector<std::shared_ptr<ThreadLocalValueHolderBase> > value_holders;<br>
     // Clean up the ThreadIdToThreadLocals data structure while holding the<br>
     // lock, but defer the destruction of the ThreadLocalValueHolderBases.<br>
     {<br>
@@ -536,7 +619,8 @@ class ThreadLocalRegistryImpl {<br>
  private:<br>
   // In a particular thread, maps a ThreadLocal object to its value.<br>
   typedef std::map<const ThreadLocalBase*,<br>
-                   linked_ptr<ThreadLocalValueHolderBase> > ThreadLocalValues;<br>
+                   std::shared_ptr<ThreadLocalValueHolderBase> ><br>
+      ThreadLocalValues;<br>
   // Stores all ThreadIdToThreadLocals having values in a thread, indexed by<br>
   // thread's ID.<br>
   typedef std::map<DWORD, ThreadLocalValues> ThreadIdToThreadLocals;<br>
@@ -551,18 +635,17 @@ class ThreadLocalRegistryImpl {<br>
     HANDLE thread = ::OpenThread(SYNCHRONIZE | THREAD_QUERY_INFORMATION,<br>
                                  FALSE,<br>
                                  thread_id);<br>
-    GTEST_CHECK_(thread != NULL);<br>
+    GTEST_CHECK_(thread != nullptr);<br>
     // We need to pass a valid thread ID pointer into CreateThread for it<br>
     // to work correctly under Win98.<br>
     DWORD watcher_thread_id;<br>
     HANDLE watcher_thread = ::CreateThread(<br>
-        NULL,   // Default security.<br>
-        0,      // Default stack size<br>
+        nullptr,  // Default security.<br>
+        0,        // Default stack size<br>
         &ThreadLocalRegistryImpl::WatcherThreadFunc,<br>
         reinterpret_cast<LPVOID>(new ThreadIdAndHandle(thread_id, thread)),<br>
-        CREATE_SUSPENDED,<br>
-        &watcher_thread_id);<br>
-    GTEST_CHECK_(watcher_thread != NULL);<br>
+        CREATE_SUSPENDED, &watcher_thread_id);<br>
+    GTEST_CHECK_(watcher_thread != nullptr);<br>
     // Give the watcher thread the same priority as ours to avoid being<br>
     // blocked by it.<br>
     ::SetThreadPriority(watcher_thread,<br>
@@ -587,7 +670,9 @@ class ThreadLocalRegistryImpl {<br>
   // Returns map of thread local instances.<br>
   static ThreadIdToThreadLocals* GetThreadLocalsMapLocked() {<br>
     mutex_.AssertHeld();<br>
+#ifdef _MSC_VER<br>
     MemoryIsNotDeallocated memory_is_not_deallocated;<br>
+#endif  // _MSC_VER<br>
     static ThreadIdToThreadLocals* map = new ThreadIdToThreadLocals();<br>
     return map;<br>
   }<br>
@@ -630,7 +715,7 @@ RE::~RE() {<br>
   free(const_cast<char*>(pattern_));<br>
 }<br>
<br>
-// Returns true iff regular expression re matches the entire str.<br>
+// Returns true if and only if regular expression re matches the entire str.<br>
 bool RE::FullMatch(const char* str, const RE& re) {<br>
   if (!re.is_valid_) return false;<br>
<br>
@@ -638,8 +723,8 @@ bool RE::FullMatch(const char* str, const RE& re) {<br>
   return regexec(&re.full_regex_, str, 1, &match, 0) == 0;<br>
 }<br>
<br>
-// Returns true iff regular expression re matches a substring of str<br>
-// (including str itself).<br>
+// Returns true if and only if regular expression re matches a substring of<br>
+// str (including str itself).<br>
 bool RE::PartialMatch(const char* str, const RE& re) {<br>
   if (!re.is_valid_) return false;<br>
<br>
@@ -679,14 +764,14 @@ void RE::Init(const char* regex) {<br>
<br>
 #elif GTEST_USES_SIMPLE_RE<br>
<br>
-// Returns true iff ch appears anywhere in str (excluding the<br>
+// Returns true if and only if ch appears anywhere in str (excluding the<br>
 // terminating '\0' character).<br>
 bool IsInSet(char ch, const char* str) {<br>
-  return ch != '\0' && strchr(str, ch) != NULL;<br>
+  return ch != '\0' && strchr(str, ch) != nullptr;<br>
 }<br>
<br>
-// Returns true iff ch belongs to the given classification.  Unlike<br>
-// similar functions in <ctype.h>, these aren't affected by the<br>
+// Returns true if and only if ch belongs to the given classification.<br>
+// Unlike similar functions in <ctype.h>, these aren't affected by the<br>
 // current locale.<br>
 bool IsAsciiDigit(char ch) { return '0' <= ch && ch <= '9'; }<br>
 bool IsAsciiPunct(char ch) {<br>
@@ -699,13 +784,13 @@ bool IsAsciiWordChar(char ch) {<br>
       ('0' <= ch && ch <= '9') || ch == '_';<br>
 }<br>
<br>
-// Returns true iff "\\c" is a supported escape sequence.<br>
+// Returns true if and only if "\\c" is a supported escape sequence.<br>
 bool IsValidEscape(char c) {<br>
   return (IsAsciiPunct(c) || IsInSet(c, "dDfnrsStvwW"));<br>
 }<br>
<br>
-// Returns true iff the given atom (specified by escaped and pattern)<br>
-// matches ch.  The result is undefined if the atom is invalid.<br>
+// Returns true if and only if the given atom (specified by escaped and<br>
+// pattern) matches ch.  The result is undefined if the atom is invalid.<br>
 bool AtomMatchesChar(bool escaped, char pattern_char, char ch) {<br>
   if (escaped) {  // "\\p" where p is pattern_char.<br>
     switch (pattern_char) {<br>
@@ -736,17 +821,14 @@ static std::string FormatRegexSyntaxError(const char* regex, int index) {<br>
 // Generates non-fatal failures and returns false if regex is invalid;<br>
 // otherwise returns true.<br>
 bool ValidateRegex(const char* regex) {<br>
-  if (regex == NULL) {<br>
-    // FIXME: fix the source file location in the<br>
-    // assertion failures to match where the regex is used in user<br>
-    // code.<br>
+  if (regex == nullptr) {<br>
     ADD_FAILURE() << "NULL is not a valid simple regular expression.";<br>
     return false;<br>
   }<br>
<br>
   bool is_valid = true;<br>
<br>
-  // True iff ?, *, or + can follow the previous atom.<br>
+  // True if and only if ?, *, or + can follow the previous atom.<br>
   bool prev_repeatable = false;<br>
   for (int i = 0; regex[i]; i++) {<br>
     if (regex[i] == '\\') {  // An escape sequence<br>
@@ -822,8 +904,8 @@ bool MatchRepetitionAndRegexAtHead(<br>
   return false;<br>
 }<br>
<br>
-// Returns true iff regex matches a prefix of str.  regex must be a<br>
-// valid simple regular expression and not start with "^", or the<br>
+// Returns true if and only if regex matches a prefix of str. regex must<br>
+// be a valid simple regular expression and not start with "^", or the<br>
 // result is undefined.<br>
 bool MatchRegexAtHead(const char* regex, const char* str) {<br>
   if (*regex == '\0')  // An empty regex matches a prefix of anything.<br>
@@ -853,8 +935,8 @@ bool MatchRegexAtHead(const char* regex, const char* str) {<br>
   }<br>
 }<br>
<br>
-// Returns true iff regex matches any substring of str.  regex must be<br>
-// a valid simple regular expression, or the result is undefined.<br>
+// Returns true if and only if regex matches any substring of str.  regex must<br>
+// be a valid simple regular expression, or the result is undefined.<br>
 //<br>
 // The algorithm is recursive, but the recursion depth doesn't exceed<br>
 // the regex length, so we won't need to worry about running out of<br>
@@ -862,8 +944,7 @@ bool MatchRegexAtHead(const char* regex, const char* str) {<br>
 // exponential with respect to the regex length + the string length,<br>
 // but usually it's must faster (often close to linear).<br>
 bool MatchRegexAnywhere(const char* regex, const char* str) {<br>
-  if (regex == NULL || str == NULL)<br>
-    return false;<br>
+  if (regex == nullptr || str == nullptr) return false;<br>
<br>
   if (*regex == '^')<br>
     return MatchRegexAtHead(regex + 1, str);<br>
@@ -883,21 +964,21 @@ RE::~RE() {<br>
   free(const_cast<char*>(full_pattern_));<br>
 }<br>
<br>
-// Returns true iff regular expression re matches the entire str.<br>
+// Returns true if and only if regular expression re matches the entire str.<br>
 bool RE::FullMatch(const char* str, const RE& re) {<br>
   return re.is_valid_ && MatchRegexAnywhere(re.full_pattern_, str);<br>
 }<br>
<br>
-// Returns true iff regular expression re matches a substring of str<br>
-// (including str itself).<br>
+// Returns true if and only if regular expression re matches a substring of<br>
+// str (including str itself).<br>
 bool RE::PartialMatch(const char* str, const RE& re) {<br>
   return re.is_valid_ && MatchRegexAnywhere(re.pattern_, str);<br>
 }<br>
<br>
 // Initializes an RE from its string representation.<br>
 void RE::Init(const char* regex) {<br>
-  pattern_ = full_pattern_ = NULL;<br>
-  if (regex != NULL) {<br>
+  pattern_ = full_pattern_ = nullptr;<br>
+  if (regex != nullptr) {<br>
     pattern_ = posix::StrDup(regex);<br>
   }<br>
<br>
@@ -935,7 +1016,7 @@ const char kUnknownFile[] = "unknown file";<br>
 // Formats a source file path and a line number as they would appear<br>
 // in an error message from the compiler used to compile this code.<br>
 GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {<br>
-  const std::string file_name(file == NULL ? kUnknownFile : file);<br>
+  const std::string file_name(file == nullptr ? kUnknownFile : file);<br>
<br>
   if (line < 0) {<br>
     return file_name + ":";<br>
@@ -954,7 +1035,7 @@ GTEST_API_ ::std::string FormatFileLocation(const char* file, int line) {<br>
 // to the file location it produces, unlike FormatFileLocation().<br>
 GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(<br>
     const char* file, int line) {<br>
-  const std::string file_name(file == NULL ? kUnknownFile : file);<br>
+  const std::string file_name(file == nullptr ? kUnknownFile : file);<br>
<br>
   if (line < 0)<br>
     return file_name;<br>
@@ -1021,20 +1102,22 @@ class CapturedStream {<br>
     // code as part of a regular standalone executable, which doesn't<br>
     // run in a Dalvik process (e.g. when running it through 'adb shell').<br>
     //<br>
-    // The location /sdcard is directly accessible from native code<br>
-    // and is the only location (unofficially) supported by the Android<br>
-    // team. It's generally a symlink to the real SD Card mount point<br>
-    // which can be /mnt/sdcard, /mnt/sdcard0, /system/media/sdcard, or<br>
-    // other OEM-customized locations. Never rely on these, and always<br>
-    // use /sdcard.<br>
-    char name_template[] = "/sdcard/gtest_captured_stream.XXXXXX";<br>
+    // The location /data/local/tmp is directly accessible from native code.<br>
+    // '/sdcard' and other variants cannot be relied on, as they are not<br>
+    // guaranteed to be mounted, or may have a delay in mounting.<br>
+    char name_template[] = "/data/local/tmp/gtest_captured_stream.XXXXXX";<br>
 #  else<br>
     char name_template[] = "/tmp/captured_stream.XXXXXX";<br>
 #  endif  // GTEST_OS_LINUX_ANDROID<br>
     const int captured_fd = mkstemp(name_template);<br>
+    if (captured_fd == -1) {<br>
+      GTEST_LOG_(WARNING)<br>
+          << "Failed to create tmp file " << name_template<br>
+          << " for test; does the test have access to the /tmp directory?";<br>
+    }<br>
     filename_ = name_template;<br>
 # endif  // GTEST_OS_WINDOWS<br>
-    fflush(NULL);<br>
+    fflush(nullptr);<br>
     dup2(captured_fd, fd_);<br>
     close(captured_fd);<br>
   }<br>
@@ -1046,13 +1129,17 @@ class CapturedStream {<br>
   std::string GetCapturedString() {<br>
     if (uncaptured_fd_ != -1) {<br>
       // Restores the original stream.<br>
-      fflush(NULL);<br>
+      fflush(nullptr);<br>
       dup2(uncaptured_fd_, fd_);<br>
       close(uncaptured_fd_);<br>
       uncaptured_fd_ = -1;<br>
     }<br>
<br>
     FILE* const file = posix::FOpen(filename_.c_str(), "r");<br>
+    if (file == nullptr) {<br>
+      GTEST_LOG_(FATAL) << "Failed to open tmp file " << filename_<br>
+                        << " for capturing stream.";<br>
+    }<br>
     const std::string content = ReadEntireFile(file);<br>
     posix::FClose(file);<br>
     return content;<br>
@@ -1069,13 +1156,13 @@ class CapturedStream {<br>
<br>
 GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
<br>
-static CapturedStream* g_captured_stderr = NULL;<br>
-static CapturedStream* g_captured_stdout = NULL;<br>
+static CapturedStream* g_captured_stderr = nullptr;<br>
+static CapturedStream* g_captured_stdout = nullptr;<br>
<br>
 // Starts capturing an output stream (stdout/stderr).<br>
 static void CaptureStream(int fd, const char* stream_name,<br>
                           CapturedStream** stream) {<br>
-  if (*stream != NULL) {<br>
+  if (*stream != nullptr) {<br>
     GTEST_LOG_(FATAL) << "Only one " << stream_name<br>
                       << " capturer can exist at a time.";<br>
   }<br>
@@ -1087,7 +1174,7 @@ static std::string GetCapturedStream(CapturedStream** captured_stream) {<br>
   const std::string content = (*captured_stream)->GetCapturedString();<br>
<br>
   delete *captured_stream;<br>
-  *captured_stream = NULL;<br>
+  *captured_stream = nullptr;<br>
<br>
   return content;<br>
 }<br>
@@ -1146,10 +1233,11 @@ std::string ReadEntireFile(FILE* file) {<br>
 }<br>
<br>
 #if GTEST_HAS_DEATH_TEST<br>
-static const std::vector<std::string>* g_injected_test_argvs = NULL;  // Owned.<br>
+static const std::vector<std::string>* g_injected_test_argvs =<br>
+    nullptr;  // Owned.<br>
<br>
 std::vector<std::string> GetInjectableArgvs() {<br>
-  if (g_injected_test_argvs != NULL) {<br>
+  if (g_injected_test_argvs != nullptr) {<br>
     return *g_injected_test_argvs;<br>
   }<br>
   return GetArgvs();<br>
@@ -1165,16 +1253,9 @@ void SetInjectableArgvs(const std::vector<std::string>& new_argvs) {<br>
       new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));<br>
 }<br>
<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void SetInjectableArgvs(const std::vector< ::string>& new_argvs) {<br>
-  SetInjectableArgvs(<br>
-      new std::vector<std::string>(new_argvs.begin(), new_argvs.end()));<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
 void ClearInjectableArgvs() {<br>
   delete g_injected_test_argvs;<br>
-  g_injected_test_argvs = NULL;<br>
+  g_injected_test_argvs = nullptr;<br>
 }<br>
 #endif  // GTEST_HAS_DEATH_TEST<br>
<br>
@@ -1207,7 +1288,7 @@ static std::string FlagToEnvVar(const char* flag) {<br>
 // unchanged and returns false.<br>
 bool ParseInt32(const Message& src_text, const char* str, Int32* value) {<br>
   // Parses the environment variable as a decimal integer.<br>
-  char* end = NULL;<br>
+  char* end = nullptr;<br>
   const long long_value = strtol(str, &end, 10);  // NOLINT<br>
<br>
   // Has strtol() consumed all characters in the string?<br>
@@ -1246,15 +1327,15 @@ bool ParseInt32(const Message& src_text, const char* str, Int32* value) {<br>
 // Reads and returns the Boolean environment variable corresponding to<br>
 // the given flag; if it's not set, returns default_value.<br>
 //<br>
-// The value is considered true iff it's not "0".<br>
+// The value is considered true if and only if it's not "0".<br>
 bool BoolFromGTestEnv(const char* flag, bool default_value) {<br>
 #if defined(GTEST_GET_BOOL_FROM_ENV_)<br>
   return GTEST_GET_BOOL_FROM_ENV_(flag, default_value);<br>
 #else<br>
   const std::string env_var = FlagToEnvVar(flag);<br>
   const char* const string_value = posix::GetEnv(env_var.c_str());<br>
-  return string_value == NULL ?<br>
-      default_value : strcmp(string_value, "0") != 0;<br>
+  return string_value == nullptr ? default_value<br>
+                                 : strcmp(string_value, "0") != 0;<br>
 #endif  // defined(GTEST_GET_BOOL_FROM_ENV_)<br>
 }<br>
<br>
@@ -1267,7 +1348,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {<br>
 #else<br>
   const std::string env_var = FlagToEnvVar(flag);<br>
   const char* const string_value = posix::GetEnv(env_var.c_str());<br>
-  if (string_value == NULL) {<br>
+  if (string_value == nullptr) {<br>
     // The environment variable is not set.<br>
     return default_value;<br>
   }<br>
@@ -1296,7 +1377,7 @@ Int32 Int32FromGTestEnv(const char* flag, Int32 default_value) {<br>
 std::string OutputFlagAlsoCheckEnvVar(){<br>
   std::string default_value_for_output_flag = "";<br>
   const char* xml_output_file_env = posix::GetEnv("XML_OUTPUT_FILE");<br>
-  if (NULL != xml_output_file_env) {<br>
+  if (nullptr != xml_output_file_env) {<br>
     default_value_for_output_flag = std::string("xml:") + xml_output_file_env;<br>
   }<br>
   return default_value_for_output_flag;<br>
@@ -1310,7 +1391,7 @@ const char* StringFromGTestEnv(const char* flag, const char* default_value) {<br>
 #else<br>
   const std::string env_var = FlagToEnvVar(flag);<br>
   const char* const value = posix::GetEnv(env_var.c_str());<br>
-  return value == NULL ? default_value : value;<br>
+  return value == nullptr ? default_value : value;<br>
 #endif  // defined(GTEST_GET_STRING_FROM_ENV_)<br>
 }<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-printers.cc b/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
index de4d245e9fc88..3337be312ea40 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-printers.cc<br>
@@ -59,6 +59,7 @@ using ::std::ostream;<br>
 // Prints a segment of bytes in the given object.<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
 void PrintByteSegmentInObjectTo(const unsigned char* obj_bytes, size_t start,<br>
                                 size_t count, ostream* os) {<br>
@@ -89,7 +90,6 @@ void PrintBytesInObjectToImpl(const unsigned char* obj_bytes, size_t count,<br>
   // If the object size is bigger than kThreshold, we'll have to omit<br>
   // some details by printing only the first and the last kChunkSize<br>
   // bytes.<br>
-  // FIXME: let the user control the threshold using a flag.<br>
   if (count < kThreshold) {<br>
     PrintByteSegmentInObjectTo(obj_bytes, 0, count, os);<br>
   } else {<br>
@@ -144,7 +144,8 @@ inline bool IsPrintableAscii(wchar_t c) {<br>
 // which is the type of c.<br>
 template <typename UnsignedChar, typename Char><br>
 static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {<br>
-  switch (static_cast<wchar_t>(c)) {<br>
+  wchar_t w_c = static_cast<wchar_t>(c);<br>
+  switch (w_c) {<br>
     case L'\0':<br>
       *os << "\\0";<br>
       break;<br>
@@ -176,7 +177,7 @@ static CharFormat PrintAsCharLiteralTo(Char c, ostream* os) {<br>
       *os << "\\v";<br>
       break;<br>
     default:<br>
-      if (IsPrintableAscii(c)) {<br>
+      if (IsPrintableAscii(w_c)) {<br>
         *os << static_cast<char>(c);<br>
         return kAsIs;<br>
       } else {<br>
@@ -236,7 +237,7 @@ void PrintCharAndCodeTo(Char c, ostream* os) {<br>
   if (format == kHexEscape || (1 <= c && c <= 9)) {<br>
     // Do nothing.<br>
   } else {<br>
-    *os << ", 0x" << String::FormatHexInt(static_cast<UnsignedChar>(c));<br>
+    *os << ", 0x" << String::FormatHexInt(static_cast<int>(c));<br>
   }<br>
   *os << ")";<br>
 }<br>
@@ -261,6 +262,7 @@ void PrintTo(wchar_t wc, ostream* os) {<br>
 template <typename CharType><br>
 GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
 static CharFormat PrintCharsAsStringTo(<br>
     const CharType* begin, size_t len, ostream* os) {<br>
@@ -291,6 +293,7 @@ static CharFormat PrintCharsAsStringTo(<br>
 template <typename CharType><br>
 GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_<br>
+GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_<br>
 GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_<br>
 static void UniversalPrintCharArray(<br>
     const CharType* begin, size_t len, ostream* os) {<br>
@@ -327,7 +330,7 @@ void UniversalPrintArray(const wchar_t* begin, size_t len, ostream* os) {<br>
<br>
 // Prints the given C string to the ostream.<br>
 void PrintTo(const char* s, ostream* os) {<br>
-  if (s == NULL) {<br>
+  if (s == nullptr) {<br>
     *os << "NULL";<br>
   } else {<br>
     *os << ImplicitCast_<const void*>(s) << " pointing to ";<br>
@@ -344,11 +347,11 @@ void PrintTo(const char* s, ostream* os) {<br>
 #if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED)<br>
 // Prints the given wide C string to the ostream.<br>
 void PrintTo(const wchar_t* s, ostream* os) {<br>
-  if (s == NULL) {<br>
+  if (s == nullptr) {<br>
     *os << "NULL";<br>
   } else {<br>
     *os << ImplicitCast_<const void*>(s) << " pointing to ";<br>
-    PrintCharsAsStringTo(s, std::wcslen(s), os);<br>
+    PrintCharsAsStringTo(s, wcslen(s), os);<br>
   }<br>
 }<br>
 #endif  // wchar_t is native<br>
@@ -420,17 +423,6 @@ void ConditionalPrintAsText(const char* str, size_t length, ostream* os) {<br>
<br>
 }  // anonymous namespace<br>
<br>
-// Prints a ::string object.<br>
-#if GTEST_HAS_GLOBAL_STRING<br>
-void PrintStringTo(const ::string& s, ostream* os) {<br>
-  if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {<br>
-    if (GTEST_FLAG(print_utf8)) {<br>
-      ConditionalPrintAsText(s.data(), s.size(), os);<br>
-    }<br>
-  }<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_STRING<br>
-<br>
 void PrintStringTo(const ::std::string& s, ostream* os) {<br>
   if (PrintCharsAsStringTo(s.data(), s.size(), os) == kHexEscape) {<br>
     if (GTEST_FLAG(print_utf8)) {<br>
@@ -439,13 +431,6 @@ void PrintStringTo(const ::std::string& s, ostream* os) {<br>
   }<br>
 }<br>
<br>
-// Prints a ::wstring object.<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-void PrintWideStringTo(const ::wstring& s, ostream* os) {<br>
-  PrintCharsAsStringTo(s.data(), s.size(), os);<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
 #if GTEST_HAS_STD_WSTRING<br>
 void PrintWideStringTo(const ::std::wstring& s, ostream* os) {<br>
   PrintCharsAsStringTo(s.data(), s.size(), os);<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-test-part.cc b/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
index c88860d923856..178317a6bcdbd 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-test-part.cc<br>
@@ -41,18 +41,21 @@ using internal::GetUnitTestImpl;<br>
 // in it.<br>
 std::string TestPartResult::ExtractSummary(const char* message) {<br>
   const char* const stack_trace = strstr(message, internal::kStackTraceMarker);<br>
-  return stack_trace == NULL ? message :<br>
-      std::string(message, stack_trace);<br>
+  return stack_trace == nullptr ? message : std::string(message, stack_trace);<br>
 }<br>
<br>
 // Prints a TestPartResult object.<br>
 std::ostream& operator<<(std::ostream& os, const TestPartResult& result) {<br>
-  return os<br>
-      << result.file_name() << ":" << result.line_number() << ": "<br>
-      << (result.type() == TestPartResult::kSuccess ? "Success" :<br>
-          result.type() == TestPartResult::kFatalFailure ? "Fatal failure" :<br>
-          "Non-fatal failure") << ":\n"<br>
-      << result.message() << std::endl;<br>
+  return os << result.file_name() << ":" << result.line_number() << ": "<br>
+            << (result.type() == TestPartResult::kSuccess<br>
+                    ? "Success"<br>
+                    : result.type() == TestPartResult::kSkip<br>
+                          ? "Skipped"<br>
+                          : result.type() == TestPartResult::kFatalFailure<br>
+                                ? "Fatal failure"<br>
+                                : "Non-fatal failure")<br>
+            << ":\n"<br>
+            << result.message() << std::endl;<br>
 }<br>
<br>
 // Appends a TestPartResult to the array.<br>
@@ -67,7 +70,7 @@ const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {<br>
     internal::posix::Abort();<br>
   }<br>
<br>
-  return array_[index];<br>
+  return array_[static_cast<size_t>(index)];<br>
 }<br>
<br>
 // Returns the number of TestPartResult objects in the array.<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest-typed-test.cc b/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
index 1dc2ad38bab98..8677caf732b42 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest-typed-test.cc<br>
@@ -48,7 +48,7 @@ static const char* SkipSpaces(const char* str) {<br>
 static std::vector<std::string> SplitIntoTestNames(const char* src) {<br>
   std::vector<std::string> name_vec;<br>
   src = SkipSpaces(src);<br>
-  for (; src != NULL; src = SkipComma(src)) {<br>
+  for (; src != nullptr; src = SkipComma(src)) {<br>
     name_vec.push_back(StripTrailingSpaces(GetPrefixUntilComma(src)));<br>
   }<br>
   return name_vec;<br>
@@ -57,7 +57,7 @@ static std::vector<std::string> SplitIntoTestNames(const char* src) {<br>
 // Verifies that registered_tests match the test names in<br>
 // registered_tests_; returns registered_tests if successful, or<br>
 // aborts the program otherwise.<br>
-const char* TypedTestCasePState::VerifyRegisteredTestNames(<br>
+const char* TypedTestSuitePState::VerifyRegisteredTestNames(<br>
     const char* file, int line, const char* registered_tests) {<br>
   typedef RegisteredTestsMap::const_iterator RegisteredTestIter;<br>
   registered_ = true;<br>
@@ -89,7 +89,7 @@ const char* TypedTestCasePState::VerifyRegisteredTestNames(<br>
       tests.insert(name);<br>
     } else {<br>
       errors << "No test named " << name<br>
-             << " can be found in this test case.\n";<br>
+             << " can be found in this test suite.\n";<br>
     }<br>
   }<br>
<br>
<br>
diff  --git a/llvm/utils/unittest/googletest/src/gtest.cc b/llvm/utils/unittest/googletest/src/gtest.cc<br>
index 96b07c68abb05..a5b4e5ac78ca1 100644<br>
--- a/llvm/utils/unittest/googletest/src/gtest.cc<br>
+++ b/llvm/utils/unittest/googletest/src/gtest.cc<br>
@@ -54,8 +54,6 @@<br>
<br>
 #if GTEST_OS_LINUX<br>
<br>
-// FIXME: Use autoconf to detect availability of<br>
-// gettimeofday().<br>
 # define GTEST_HAS_GETTIMEOFDAY_ 1<br>
<br>
 # include <fcntl.h>  // NOLINT<br>
@@ -68,10 +66,6 @@<br>
 # include <unistd.h>  // NOLINT<br>
 # include <string><br>
<br>
-#elif GTEST_OS_SYMBIAN<br>
-# define GTEST_HAS_GETTIMEOFDAY_ 1<br>
-# include <sys/time.h>  // NOLINT<br>
-<br>
 #elif GTEST_OS_ZOS<br>
 # define GTEST_HAS_GETTIMEOFDAY_ 1<br>
 # include <sys/time.h>  // NOLINT<br>
@@ -86,6 +80,11 @@<br>
<br>
 #elif GTEST_OS_WINDOWS  // We are on Windows proper.<br>
<br>
+# include <windows.h>  // NOLINT<br>
+# undef min<br>
+<br>
+# include <crtdbg.h>  // NOLINT<br>
+# include <debugapi.h>  // NOLINT<br>
 # include <io.h>  // NOLINT<br>
 # include <sys/timeb.h>  // NOLINT<br>
 # include <sys/types.h>  // NOLINT<br>
@@ -93,25 +92,13 @@<br>
<br>
 # if GTEST_OS_WINDOWS_MINGW<br>
 // MinGW has gettimeofday() but not _ftime64().<br>
-// FIXME: Use autoconf to detect availability of<br>
-//   gettimeofday().<br>
-// FIXME: There are other ways to get the time on<br>
-//   Windows, like GetTickCount() or GetSystemTimeAsFileTime().  MinGW<br>
-//   supports these.  consider using them instead.<br>
 #  define GTEST_HAS_GETTIMEOFDAY_ 1<br>
 #  include <sys/time.h>  // NOLINT<br>
 # endif  // GTEST_OS_WINDOWS_MINGW<br>
<br>
-// cpplint thinks that the header is already included, so we want to<br>
-// silence it.<br>
-# include <windows.h>  // NOLINT<br>
-# undef min<br>
-<br>
 #else<br>
<br>
 // Assume other platforms have gettimeofday().<br>
-// FIXME: Use autoconf to detect availability of<br>
-//   gettimeofday().<br>
 # define GTEST_HAS_GETTIMEOFDAY_ 1<br>
<br>
 // cpplint thinks that the header is already included, so we want to<br>
@@ -160,14 +147,14 @@ using internal::Shuffle;<br>
<br>
 // Constants.<br>
<br>
-// A test whose test case name or test name matches this filter is<br>
+// A test whose test suite name or test name matches this filter is<br>
 // disabled and not run.<br>
 static const char kDisableTestFilter[] = "DISABLED_*:*/DISABLED_*";<br>
<br>
-// A test case whose name matches this filter is considered a death<br>
-// test case and will be run before test cases whose name doesn't<br>
+// A test suite whose name matches this filter is considered a death<br>
+// test suite and will be run before test suites whose name doesn't<br>
 // match this filter.<br>
-static const char kDeathTestCaseFilter[] = "*DeathTest:*DeathTest/*";<br>
+static const char kDeathTestSuiteFilter[] = "*DeathTest:*DeathTest/*";<br>
<br>
 // A test filter that matches everything.<br>
 static const char kUniversalFilter[] = "*";<br>
@@ -190,20 +177,20 @@ namespace internal {<br>
 // stack trace.<br>
 const char kStackTraceMarker[] = "\nStack trace:\n";<br>
<br>
-// g_help_flag is true iff the --help flag or an equivalent form is<br>
-// specified on the command line.<br>
+// g_help_flag is true if and only if the --help flag or an equivalent form<br>
+// is specified on the command line.<br>
 bool g_help_flag = false;<br>
<br>
 // Utilty function to Open File for Writing<br>
 static FILE* OpenFileForWriting(const std::string& output_file) {<br>
-  FILE* fileout = NULL;<br>
+  FILE* fileout = nullptr;<br>
   FilePath output_file_path(output_file);<br>
   FilePath output_dir(output_file_path.RemoveFileName());<br>
<br>
   if (output_dir.CreateDirectoriesRecursively()) {<br>
     fileout = posix::FOpen(output_file.c_str(), "w");<br>
   }<br>
-  if (fileout == NULL) {<br>
+  if (fileout == nullptr) {<br>
     GTEST_LOG_(FATAL) << "Unable to open file \"" << output_file << "\"";<br>
   }<br>
   return fileout;<br>
@@ -216,7 +203,7 @@ static FILE* OpenFileForWriting(const std::string& output_file) {<br>
 static const char* GetDefaultFilter() {<br>
   const char* const testbridge_test_only =<br>
       internal::posix::GetEnv("TESTBRIDGE_TEST_ONLY");<br>
-  if (testbridge_test_only != NULL) {<br>
+  if (testbridge_test_only != nullptr) {<br>
     return testbridge_test_only;<br>
   }<br>
   return kUniversalFilter;<br>
@@ -228,15 +215,14 @@ GTEST_DEFINE_bool_(<br>
     "Run disabled tests too, in addition to the tests normally being run.");<br>
<br>
 GTEST_DEFINE_bool_(<br>
-    break_on_failure,<br>
-    internal::BoolFromGTestEnv("break_on_failure", false),<br>
-    "True iff a failed assertion should be a debugger break-point.");<br>
+    break_on_failure, internal::BoolFromGTestEnv("break_on_failure", false),<br>
+    "True if and only if a failed assertion should be a debugger "<br>
+    "break-point.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
-    catch_exceptions,<br>
-    internal::BoolFromGTestEnv("catch_exceptions", true),<br>
-    "True iff " GTEST_NAME_<br>
-    " should catch exceptions and treat them as test failures.");<br>
+GTEST_DEFINE_bool_(catch_exceptions,<br>
+                   internal::BoolFromGTestEnv("catch_exceptions", true),<br>
+                   "True if and only if " GTEST_NAME_<br>
+                   " should catch exceptions and treat them as test failures.");<br>
<br>
 GTEST_DEFINE_string_(<br>
     color,<br>
@@ -283,17 +269,13 @@ GTEST_DEFINE_string_(<br>
     "executable's name and, if necessary, made unique by adding "<br>
     "digits.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
-    print_time,<br>
-    internal::BoolFromGTestEnv("print_time", true),<br>
-    "True iff " GTEST_NAME_<br>
-    " should display elapsed time in text output.");<br>
+GTEST_DEFINE_bool_(print_time, internal::BoolFromGTestEnv("print_time", true),<br>
+                   "True if and only if " GTEST_NAME_<br>
+                   " should display elapsed time in text output.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
-    print_utf8,<br>
-    internal::BoolFromGTestEnv("print_utf8", true),<br>
-    "True iff " GTEST_NAME_<br>
-    " prints UTF8 characters as text.");<br>
+GTEST_DEFINE_bool_(print_utf8, internal::BoolFromGTestEnv("print_utf8", true),<br>
+                   "True if and only if " GTEST_NAME_<br>
+                   " prints UTF8 characters as text.");<br>
<br>
 GTEST_DEFINE_int32_(<br>
     random_seed,<br>
@@ -307,16 +289,14 @@ GTEST_DEFINE_int32_(<br>
     "How many times to repeat each test.  Specify a negative number "<br>
     "for repeating forever.  Useful for shaking out flaky tests.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
-    show_internal_stack_frames, false,<br>
-    "True iff " GTEST_NAME_ " should include internal stack frames when "<br>
-    "printing test failure stack traces.");<br>
+GTEST_DEFINE_bool_(show_internal_stack_frames, false,<br>
+                   "True if and only if " GTEST_NAME_<br>
+                   " should include internal stack frames when "<br>
+                   "printing test failure stack traces.");<br>
<br>
-GTEST_DEFINE_bool_(<br>
-    shuffle,<br>
-    internal::BoolFromGTestEnv("shuffle", false),<br>
-    "True iff " GTEST_NAME_<br>
-    " should randomize tests' order on every run.");<br>
+GTEST_DEFINE_bool_(shuffle, internal::BoolFromGTestEnv("shuffle", false),<br>
+                   "True if and only if " GTEST_NAME_<br>
+                   " should randomize tests' order on every run.");<br>
<br>
 GTEST_DEFINE_int32_(<br>
     stack_trace_depth,<br>
@@ -367,16 +347,16 @@ UInt32 Random::Generate(UInt32 range) {<br>
   return state_ % range;<br>
 }<br>
<br>
-// GTestIsInitialized() returns true iff the user has initialized<br>
+// GTestIsInitialized() returns true if and only if the user has initialized<br>
 // Google Test.  Useful for catching the user mistake of not initializing<br>
 // Google Test before calling RUN_ALL_TESTS().<br>
 static bool GTestIsInitialized() { return GetArgvs().size() > 0; }<br>
<br>
-// Iterates over a vector of TestCases, keeping a running sum of the<br>
+// Iterates over a vector of TestSuites, keeping a running sum of the<br>
 // results of calling a given int-returning method on each.<br>
 // Returns the sum.<br>
-static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,<br>
-                               int (TestCase::*method)() const) {<br>
+static int SumOverTestSuiteList(const std::vector<TestSuite*>& case_list,<br>
+                                int (TestSuite::*method)() const) {<br>
   int sum = 0;<br>
   for (size_t i = 0; i < case_list.size(); i++) {<br>
     sum += (case_list[i]->*method)();<br>
@@ -384,20 +364,20 @@ static int SumOverTestCaseList(const std::vector<TestCase*>& case_list,<br>
   return sum;<br>
 }<br>
<br>
-// Returns true iff the test case passed.<br>
-static bool TestCasePassed(const TestCase* test_case) {<br>
-  return test_case->should_run() && test_case->Passed();<br>
+// Returns true if and only if the test suite passed.<br>
+static bool TestSuitePassed(const TestSuite* test_suite) {<br>
+  return test_suite->should_run() && test_suite->Passed();<br>
 }<br>
<br>
-// Returns true iff the test case failed.<br>
-static bool TestCaseFailed(const TestCase* test_case) {<br>
-  return test_case->should_run() && test_case->Failed();<br>
+// Returns true if and only if the test suite failed.<br>
+static bool TestSuiteFailed(const TestSuite* test_suite) {<br>
+  return test_suite->should_run() && test_suite->Failed();<br>
 }<br>
<br>
-// Returns true iff test_case contains at least one test that should<br>
-// run.<br>
-static bool ShouldRunTestCase(const TestCase* test_case) {<br>
-  return test_case->should_run();<br>
+// Returns true if and only if test_suite contains at least one test that<br>
+// should run.<br>
+static bool ShouldRunTestSuite(const TestSuite* test_suite) {<br>
+  return test_suite->should_run();<br>
 }<br>
<br>
 // AssertHelper constructor.<br>
@@ -423,9 +403,6 @@ void AssertHelper::operator=(const Message& message) const {<br>
                       );  // NOLINT<br>
 }<br>
<br>
-// Mutex for linked pointers.<br>
-GTEST_API_ GTEST_DEFINE_STATIC_MUTEX_(g_linked_ptr_mutex);<br>
-<br>
 // A copy of all command line arguments.  Set by InitGoogleTest().<br>
 static ::std::vector<std::string> g_argvs;<br>
<br>
@@ -445,7 +422,7 @@ ::std::vector<std::string> GetArgvs() {<br>
 FilePath GetCurrentExecutableName() {<br>
   FilePath result;<br>
<br>
-#if GTEST_OS_WINDOWS<br>
+#if GTEST_OS_WINDOWS || GTEST_OS_OS2<br>
   result.Set(FilePath(GetArgvs()[0]).RemoveExtension("exe"));<br>
 #else<br>
   result.Set(FilePath(GetArgvs()[0]));<br>
@@ -460,9 +437,10 @@ FilePath GetCurrentExecutableName() {<br>
 std::string UnitTestOptions::GetOutputFormat() {<br>
   const char* const gtest_output_flag = GTEST_FLAG(output).c_str();<br>
   const char* const colon = strchr(gtest_output_flag, ':');<br>
-  return (colon == NULL) ?<br>
-      std::string(gtest_output_flag) :<br>
-      std::string(gtest_output_flag, colon - gtest_output_flag);<br>
+  return (colon == nullptr)<br>
+             ? std::string(gtest_output_flag)<br>
+             : std::string(gtest_output_flag,<br>
+                           static_cast<size_t>(colon - gtest_output_flag));<br>
 }<br>
<br>
 // Returns the name of the requested output file, or the default if none<br>
@@ -475,7 +453,7 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
     format = std::string(kDefaultOutputFormat);<br>
<br>
   const char* const colon = strchr(gtest_output_flag, ':');<br>
-  if (colon == NULL)<br>
+  if (colon == nullptr)<br>
     return internal::FilePath::MakeFileName(<br>
         internal::FilePath(<br>
             UnitTest::GetInstance()->original_working_dir()),<br>
@@ -484,10 +462,6 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
<br>
   internal::FilePath output_name(colon + 1);<br>
   if (!output_name.IsAbsolutePath())<br>
-    // FIXME: on Windows \some\path is not an absolute<br>
-    // path (as its meaning depends on the current drive), yet the<br>
-    // following logic for turning it into an absolute path is wrong.<br>
-    // Fix it.<br>
     output_name = internal::FilePath::ConcatPaths(<br>
         internal::FilePath(UnitTest::GetInstance()->original_working_dir()),<br>
         internal::FilePath(colon + 1));<br>
@@ -501,8 +475,8 @@ std::string UnitTestOptions::GetAbsolutePathToOutputFile() {<br>
   return result.string();<br>
 }<br>
<br>
-// Returns true iff the wildcard pattern matches the string.  The<br>
-// first ':' or '\0' character in pattern marks the end of it.<br>
+// Returns true if and only if the wildcard pattern matches the string.<br>
+// The first ':' or '\0' character in pattern marks the end of it.<br>
 //<br>
 // This recursive algorithm isn't very efficient, but is clear and<br>
 // works well enough for matching test names, which are short.<br>
@@ -535,7 +509,7 @@ bool UnitTestOptions::MatchesFilter(<br>
     cur_pattern = strchr(cur_pattern, ':');<br>
<br>
     // Returns if no more pattern can be found.<br>
-    if (cur_pattern == NULL) {<br>
+    if (cur_pattern == nullptr) {<br>
       return false;<br>
     }<br>
<br>
@@ -544,11 +518,11 @@ bool UnitTestOptions::MatchesFilter(<br>
   }<br>
 }<br>
<br>
-// Returns true iff the user-specified filter matches the test case<br>
-// name and the test name.<br>
-bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,<br>
-                                        const std::string &test_name) {<br>
-  const std::string& full_name = test_case_name + "." + test_name.c_str();<br>
+// Returns true if and only if the user-specified filter matches the test<br>
+// suite name and the test name.<br>
+bool UnitTestOptions::FilterMatchesTest(const std::string& test_suite_name,<br>
+                                        const std::string& test_name) {<br>
+  const std::string& full_name = test_suite_name + "." + test_name.c_str();<br>
<br>
   // Split --gtest_filter at '-', if there is one, to separate into<br>
   // positive filter and negative filter portions<br>
@@ -556,7 +530,7 @@ bool UnitTestOptions::FilterMatchesTest(const std::string &test_case_name,<br>
   const char* const dash = strchr(p, '-');<br>
   std::string positive;<br>
   std::string negative;<br>
-  if (dash == NULL) {<br>
+  if (dash == nullptr) {<br>
     positive = GTEST_FLAG(filter).c_str();  // Whole string is a positive filter<br>
     negative = "";<br>
   } else {<br>
@@ -701,7 +675,7 @@ static AssertionResult HasOneFailure(const char* /* results_expr */,<br>
                               << r;<br>
   }<br>
<br>
-  if (strstr(r.message(), substr.c_str()) == NULL) {<br>
+  if (strstr(r.message(), substr.c_str()) == nullptr) {<br>
     return AssertionFailure() << "Expected: " << expected << " containing \""<br>
                               << substr << "\"\n"<br>
                               << "  Actual:\n"<br>
@@ -770,61 +744,66 @@ void UnitTestImpl::SetTestPartResultReporterForCurrentThread(<br>
   per_thread_test_part_result_reporter_.set(reporter);<br>
 }<br>
<br>
-// Gets the number of successful test cases.<br>
-int UnitTestImpl::successful_test_case_count() const {<br>
-  return CountIf(test_cases_, TestCasePassed);<br>
+// Gets the number of successful test suites.<br>
+int UnitTestImpl::successful_test_suite_count() const {<br>
+  return CountIf(test_suites_, TestSuitePassed);<br>
 }<br>
<br>
-// Gets the number of failed test cases.<br>
-int UnitTestImpl::failed_test_case_count() const {<br>
-  return CountIf(test_cases_, TestCaseFailed);<br>
+// Gets the number of failed test suites.<br>
+int UnitTestImpl::failed_test_suite_count() const {<br>
+  return CountIf(test_suites_, TestSuiteFailed);<br>
 }<br>
<br>
-// Gets the number of all test cases.<br>
-int UnitTestImpl::total_test_case_count() const {<br>
-  return static_cast<int>(test_cases_.size());<br>
+// Gets the number of all test suites.<br>
+int UnitTestImpl::total_test_suite_count() const {<br>
+  return static_cast<int>(test_suites_.size());<br>
 }<br>
<br>
-// Gets the number of all test cases that contain at least one test<br>
+// Gets the number of all test suites that contain at least one test<br>
 // that should run.<br>
-int UnitTestImpl::test_case_to_run_count() const {<br>
-  return CountIf(test_cases_, ShouldRunTestCase);<br>
+int UnitTestImpl::test_suite_to_run_count() const {<br>
+  return CountIf(test_suites_, ShouldRunTestSuite);<br>
 }<br>
<br>
 // Gets the number of successful tests.<br>
 int UnitTestImpl::successful_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::successful_test_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::successful_test_count);<br>
+}<br>
+<br>
+// Gets the number of skipped tests.<br>
+int UnitTestImpl::skipped_test_count() const {<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::skipped_test_count);<br>
 }<br>
<br>
 // Gets the number of failed tests.<br>
 int UnitTestImpl::failed_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::failed_test_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::failed_test_count);<br>
 }<br>
<br>
 // Gets the number of disabled tests that will be reported in the XML report.<br>
 int UnitTestImpl::reportable_disabled_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_,<br>
-                             &TestCase::reportable_disabled_test_count);<br>
+  return SumOverTestSuiteList(test_suites_,<br>
+                              &TestSuite::reportable_disabled_test_count);<br>
 }<br>
<br>
 // Gets the number of disabled tests.<br>
 int UnitTestImpl::disabled_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::disabled_test_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::disabled_test_count);<br>
 }<br>
<br>
 // Gets the number of tests to be printed in the XML report.<br>
 int UnitTestImpl::reportable_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::reportable_test_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::reportable_test_count);<br>
 }<br>
<br>
 // Gets the number of all tests.<br>
 int UnitTestImpl::total_test_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::total_test_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::total_test_count);<br>
 }<br>
<br>
 // Gets the number of tests that should run.<br>
 int UnitTestImpl::test_to_run_count() const {<br>
-  return SumOverTestCaseList(test_cases_, &TestCase::test_to_run_count);<br>
+  return SumOverTestSuiteList(test_suites_, &TestSuite::test_to_run_count);<br>
 }<br>
<br>
 // Returns the current OS stack trace as an std::string.<br>
@@ -858,8 +837,6 @@ TimeInMillis GetTimeInMillis() {<br>
   SYSTEMTIME now_systime;<br>
   FILETIME now_filetime;<br>
   ULARGE_INTEGER now_int64;<br>
-  // FIXME: Shouldn't this just use<br>
-  //   GetSystemTimeAsFileTime()?<br>
   GetSystemTime(&now_systime);<br>
   if (SystemTimeToFileTime(&now_systime, &now_filetime)) {<br>
     now_int64.LowPart = now_filetime.dwLowDateTime;<br>
@@ -874,8 +851,6 @@ TimeInMillis GetTimeInMillis() {<br>
<br>
   // MSVC 8 deprecates _ftime64(), so we want to suppress warning 4996<br>
   // (deprecated function) there.<br>
-  // FIXME: Use GetTickCount()?  Or use<br>
-  //   SystemTimeToFileTime()<br>
   GTEST_DISABLE_MSC_DEPRECATED_PUSH_()<br>
   _ftime64(&now);<br>
   GTEST_DISABLE_MSC_DEPRECATED_POP_()<br>
@@ -883,7 +858,7 @@ TimeInMillis GetTimeInMillis() {<br>
   return static_cast<TimeInMillis>(now.time) * 1000 + now.millitm;<br>
 #elif GTEST_HAS_GETTIMEOFDAY_<br>
   struct timeval now;<br>
-  gettimeofday(&now, NULL);<br>
+  gettimeofday(&now, nullptr);<br>
   return static_cast<TimeInMillis>(now.tv_sec) * 1000 + now.tv_usec / 1000;<br>
 #else<br>
 # error "Don't know how to get the current time on your system."<br>
@@ -900,11 +875,10 @@ TimeInMillis GetTimeInMillis() {<br>
 // value using delete[]. Returns the wide string, or NULL if the<br>
 // input is NULL.<br>
 LPCWSTR String::AnsiToUtf16(const char* ansi) {<br>
-  if (!ansi) return NULL;<br>
+  if (!ansi) return nullptr;<br>
   const int length = strlen(ansi);<br>
   const int unicode_length =<br>
-      MultiByteToWideChar(CP_ACP, 0, ansi, length,<br>
-                          NULL, 0);<br>
+      MultiByteToWideChar(CP_ACP, 0, ansi, length, nullptr, 0);<br>
   WCHAR* unicode = new WCHAR[unicode_length + 1];<br>
   MultiByteToWideChar(CP_ACP, 0, ansi, length,<br>
                       unicode, unicode_length);<br>
@@ -917,33 +891,33 @@ LPCWSTR String::AnsiToUtf16(const char* ansi) {<br>
 // value using delete[]. Returns the ANSI string, or NULL if the<br>
 // input is NULL.<br>
 const char* String::Utf16ToAnsi(LPCWSTR utf16_str)  {<br>
-  if (!utf16_str) return NULL;<br>
-  const int ansi_length =<br>
-      WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,<br>
-                          NULL, 0, NULL, NULL);<br>
+  if (!utf16_str) return nullptr;<br>
+  const int ansi_length = WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, nullptr,<br>
+                                              0, nullptr, nullptr);<br>
   char* ansi = new char[ansi_length + 1];<br>
-  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1,<br>
-                      ansi, ansi_length, NULL, NULL);<br>
+  WideCharToMultiByte(CP_ACP, 0, utf16_str, -1, ansi, ansi_length, nullptr,<br>
+                      nullptr);<br>
   ansi[ansi_length] = 0;<br>
   return ansi;<br>
 }<br>
<br>
 #endif  // GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Compares two C strings.  Returns true iff they have the same content.<br>
+// Compares two C strings.  Returns true if and only if they have the same<br>
+// content.<br>
 //<br>
 // Unlike strcmp(), this function can handle NULL argument(s).  A NULL<br>
 // C string is considered <br>
diff erent to any non-NULL C string,<br>
 // including the empty string.<br>
 bool String::CStringEquals(const char * lhs, const char * rhs) {<br>
-  if ( lhs == NULL ) return rhs == NULL;<br>
+  if (lhs == nullptr) return rhs == nullptr;<br>
<br>
-  if ( rhs == NULL ) return false;<br>
+  if (rhs == nullptr) return false;<br>
<br>
   return strcmp(lhs, rhs) == 0;<br>
 }<br>
<br>
-#if GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING<br>
+#if GTEST_HAS_STD_WSTRING<br>
<br>
 // Converts an array of wide chars to a narrow string using the UTF-8<br>
 // encoding, and streams the result to the given Message object.<br>
@@ -961,7 +935,7 @@ static void StreamWideCharsToMessage(const wchar_t* wstr, size_t length,<br>
   }<br>
 }<br>
<br>
-#endif  // GTEST_HAS_STD_WSTRING || GTEST_HAS_GLOBAL_WSTRING<br>
+#endif  // GTEST_HAS_STD_WSTRING<br>
<br>
 void SplitString(const ::std::string& str, char delimiter,<br>
                  ::std::vector< ::std::string>* dest) {<br>
@@ -1011,15 +985,6 @@ Message& Message::operator <<(const ::std::wstring& wstr) {<br>
 }<br>
 #endif  // GTEST_HAS_STD_WSTRING<br>
<br>
-#if GTEST_HAS_GLOBAL_WSTRING<br>
-// Converts the given wide string to a narrow string using the UTF-8<br>
-// encoding, and streams the result to this Message object.<br>
-Message& Message::operator <<(const ::wstring& wstr) {<br>
-  internal::StreamWideCharsToMessage(wstr.c_str(), wstr.length(), this);<br>
-  return *this;<br>
-}<br>
-#endif  // GTEST_HAS_GLOBAL_WSTRING<br>
-<br>
 // Gets the text streamed to this object so far as an std::string.<br>
 // Each '\0' character in the buffer is replaced with "\\0".<br>
 std::string Message::GetString() const {<br>
@@ -1030,10 +995,9 @@ std::string Message::GetString() const {<br>
 // Used in EXPECT_TRUE/FALSE(assertion_result).<br>
 AssertionResult::AssertionResult(const AssertionResult& other)<br>
     : success_(other.success_),<br>
-      message_(other.message_.get() != NULL ?<br>
-               new ::std::string(*other.message_) :<br>
-               static_cast< ::std::string*>(NULL)) {<br>
-}<br>
+      message_(other.message_.get() != nullptr<br>
+                   ? new ::std::string(*other.message_)<br>
+                   : static_cast< ::std::string*>(nullptr)) {}<br>
<br>
 // Swaps two AssertionResults.<br>
 void AssertionResult::swap(AssertionResult& other) {<br>
@@ -1045,8 +1009,7 @@ void AssertionResult::swap(AssertionResult& other) {<br>
 // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE.<br>
 AssertionResult AssertionResult::operator!() const {<br>
   AssertionResult negation(!success_);<br>
-  if (message_.get() != NULL)<br>
-    negation << *message_;<br>
+  if (message_.get() != nullptr) negation << *message_;<br>
   return negation;<br>
 }<br>
<br>
@@ -1272,9 +1235,10 @@ std::string CreateUnifiedDiff(const std::vector<std::string>& left,<br>
     for (; edit_i < edits.size(); ++edit_i) {<br>
       if (n_suffix >= context) {<br>
         // Continue only if the next hunk is very close.<br>
-        std::vector<EditType>::const_iterator it = edits.begin() + edit_i;<br>
+        auto it = edits.begin() + static_cast<int>(edit_i);<br>
         while (it != edits.end() && *it == kMatch) ++it;<br>
-        if (it == edits.end() || (it - edits.begin()) - edit_i >= context) {<br>
+        if (it == edits.end() ||<br>
+            static_cast<size_t>(it - edits.begin()) - edit_i >= context) {<br>
           // There is no next edit or it is too far away.<br>
           break;<br>
         }<br>
@@ -1350,7 +1314,7 @@ std::vector<std::string> SplitEscapedString(const std::string& str) {<br>
 //   lhs_value:      "5"<br>
 //   rhs_value:      "6"<br>
 //<br>
-// The ignoring_case parameter is true iff the assertion is a<br>
+// The ignoring_case parameter is true if and only if the assertion is a<br>
 // *_STRCASEEQ*.  When it's true, the string "Ignoring case" will<br>
 // be inserted into the message.<br>
 AssertionResult EqFailure(const char* lhs_expression,<br>
@@ -1413,8 +1377,6 @@ AssertionResult DoubleNearPredFormat(const char* expr1,<br>
   const double <br>
diff  = fabs(val1 - val2);<br>
   if (<br>
diff  <= abs_error) return AssertionSuccess();<br>
<br>
-  // FIXME: do not print the value of an expression if it's<br>
-  // already a literal.<br>
   return AssertionFailure()<br>
       << "The <br>
diff erence between " << expr1 << " and " << expr2<br>
       << " is " << <br>
diff  << ", which exceeds " << abs_error_expr << ", where\n"<br>
@@ -1595,22 +1557,20 @@ namespace {<br>
<br>
 // Helper functions for implementing IsSubString() and IsNotSubstring().<br>
<br>
-// This group of overloaded functions return true iff needle is a<br>
-// substring of haystack.  NULL is considered a substring of itself<br>
-// only.<br>
+// This group of overloaded functions return true if and only if needle<br>
+// is a substring of haystack.  NULL is considered a substring of<br>
+// itself only.<br>
<br>
 bool IsSubstringPred(const char* needle, const char* haystack) {<br>
-  if (needle == NULL || haystack == NULL)<br>
-    return needle == haystack;<br>
+  if (needle == nullptr || haystack == nullptr) return needle == haystack;<br>
<br>
-  return strstr(haystack, needle) != NULL;<br>
+  return strstr(haystack, needle) != nullptr;<br>
 }<br>
<br>
 bool IsSubstringPred(const wchar_t* needle, const wchar_t* haystack) {<br>
-  if (needle == NULL || haystack == NULL)<br>
-    return needle == haystack;<br>
+  if (needle == nullptr || haystack == nullptr) return needle == haystack;<br>
<br>
-  return wcsstr(haystack, needle) != NULL;<br>
+  return wcsstr(haystack, needle) != nullptr;<br>
 }<br>
<br>
 // StringType here can be either ::std::string or ::std::wstring.<br>
@@ -1724,12 +1684,12 @@ AssertionResult HRESULTFailureHelper(const char* expr,<br>
   // Gets the system's human readable message string for this HRESULT.<br>
   char error_text[kBufSize] = { '\0' };<br>
   DWORD message_length = ::FormatMessageA(kFlags,<br>
-                                          0,  // no source, we're asking system<br>
-                                          hr,  // the error<br>
-                                          0,  // no line width restrictions<br>
+                                          0,   // no source, we're asking system<br>
+                                          static_cast<DWORD>(hr),  // the error<br>
+                                          0,   // no line width restrictions<br>
                                           error_text,  // output buffer<br>
-                                          kBufSize,  // buf size<br>
-                                          NULL);  // no arguments for inserts<br>
+                                          kBufSize,    // buf size<br>
+                                          nullptr);  // no arguments for inserts<br>
   // Trims tailing white space (FormatMessage leaves a trailing CR-LF)<br>
   for (; message_length && IsSpace(error_text[message_length - 1]);<br>
           --message_length) {<br>
@@ -1803,7 +1763,7 @@ inline UInt32 ChopLowBits(UInt32* bits, int n) {<br>
 // to "(Invalid Unicode 0xXXXXXXXX)".<br>
 std::string CodePointToUtf8(UInt32 code_point) {<br>
   if (code_point > kMaxCodePoint4) {<br>
-    return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")";<br>
+    return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")";<br>
   }<br>
<br>
   char str[5];  // Big enough for the largest valid code point.<br>
@@ -1831,7 +1791,7 @@ std::string CodePointToUtf8(UInt32 code_point) {<br>
<br>
 // The following two functions only make sense if the system<br>
 // uses UTF-16 for wide string encoding. All supported systems<br>
-// with 16 bit wchar_t (Windows, Cygwin, Symbian OS) do use UTF-16.<br>
+// with 16 bit wchar_t (Windows, Cygwin) do use UTF-16.<br>
<br>
 // Determines if the arguments constitute UTF-16 surrogate pair<br>
 // and thus should be combined into a single Unicode code point<br>
@@ -1844,17 +1804,20 @@ inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {<br>
 // Creates a Unicode code point from UTF16 surrogate pair.<br>
 inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,<br>
                                                     wchar_t second) {<br>
+  const auto first_u = static_cast<UInt32>(first);<br>
+  const auto second_u = static_cast<UInt32>(second);<br>
   const UInt32 mask = (1 << 10) - 1;<br>
-  return (sizeof(wchar_t) == 2) ?<br>
-      (((first & mask) << 10) | (second & mask)) + 0x10000 :<br>
-      // This function should not be called when the condition is<br>
-      // false, but we provide a sensible default in case it is.<br>
-      static_cast<UInt32>(first);<br>
+  return (sizeof(wchar_t) == 2)<br>
+             ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000<br>
+             :<br>
+             // This function should not be called when the condition is<br>
+             // false, but we provide a sensible default in case it is.<br>
+             first_u;<br>
 }<br>
<br>
 // Converts a wide string to a narrow string in UTF-8 encoding.<br>
 // The wide string is assumed to have the following encoding:<br>
-//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin, Symbian OS)<br>
+//   UTF-16 if sizeof(wchar_t) == 2 (on Windows, Cygwin)<br>
 //   UTF-32 if sizeof(wchar_t) == 4 (on Linux)<br>
 // Parameter str points to a null-terminated wide string.<br>
 // Parameter num_chars may additionally limit the number<br>
@@ -1891,21 +1854,21 @@ std::string WideStringToUtf8(const wchar_t* str, int num_chars) {<br>
 // Converts a wide C string to an std::string using the UTF-8 encoding.<br>
 // NULL will be converted to "(null)".<br>
 std::string String::ShowWideCString(const wchar_t * wide_c_str) {<br>
-  if (wide_c_str == NULL)  return "(null)";<br>
+  if (wide_c_str == nullptr) return "(null)";<br>
<br>
   return internal::WideStringToUtf8(wide_c_str, -1);<br>
 }<br>
<br>
-// Compares two wide C strings.  Returns true iff they have the same<br>
-// content.<br>
+// Compares two wide C strings.  Returns true if and only if they have the<br>
+// same content.<br>
 //<br>
 // Unlike wcscmp(), this function can handle NULL argument(s).  A NULL<br>
 // C string is considered <br>
diff erent to any non-NULL C string,<br>
 // including the empty string.<br>
 bool String::WideCStringEquals(const wchar_t * lhs, const wchar_t * rhs) {<br>
-  if (lhs == NULL) return rhs == NULL;<br>
+  if (lhs == nullptr) return rhs == nullptr;<br>
<br>
-  if (rhs == NULL) return false;<br>
+  if (rhs == nullptr) return false;<br>
<br>
   return wcscmp(lhs, rhs) == 0;<br>
 }<br>
@@ -1941,37 +1904,35 @@ AssertionResult CmpHelperSTRNE(const char* s1_expression,<br>
                             << " vs " << PrintToString(s2);<br>
 }<br>
<br>
-// Compares two C strings, ignoring case.  Returns true iff they have<br>
+// Compares two C strings, ignoring case.  Returns true if and only if they have<br>
 // the same content.<br>
 //<br>
 // Unlike strcasecmp(), this function can handle NULL argument(s).  A<br>
 // NULL C string is considered <br>
diff erent to any non-NULL C string,<br>
 // including the empty string.<br>
 bool String::CaseInsensitiveCStringEquals(const char * lhs, const char * rhs) {<br>
-  if (lhs == NULL)<br>
-    return rhs == NULL;<br>
-  if (rhs == NULL)<br>
-    return false;<br>
+  if (lhs == nullptr) return rhs == nullptr;<br>
+  if (rhs == nullptr) return false;<br>
   return posix::StrCaseCmp(lhs, rhs) == 0;<br>
 }<br>
<br>
-  // Compares two wide C strings, ignoring case.  Returns true iff they<br>
-  // have the same content.<br>
-  //<br>
-  // Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
-  // A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
-  // including the empty string.<br>
-  // NB: The implementations on <br>
diff erent platforms slightly <br>
diff er.<br>
-  // On windows, this method uses _wcsicmp which compares according to LC_CTYPE<br>
-  // environment variable. On GNU platform this method uses wcscasecmp<br>
-  // which compares according to LC_CTYPE category of the current locale.<br>
-  // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the<br>
-  // current locale.<br>
+// Compares two wide C strings, ignoring case.  Returns true if and only if they<br>
+// have the same content.<br>
+//<br>
+// Unlike wcscasecmp(), this function can handle NULL argument(s).<br>
+// A NULL C string is considered <br>
diff erent to any non-NULL wide C string,<br>
+// including the empty string.<br>
+// NB: The implementations on <br>
diff erent platforms slightly <br>
diff er.<br>
+// On windows, this method uses _wcsicmp which compares according to LC_CTYPE<br>
+// environment variable. On GNU platform this method uses wcscasecmp<br>
+// which compares according to LC_CTYPE category of the current locale.<br>
+// On MacOS X, it uses towlower, which also uses LC_CTYPE category of the<br>
+// current locale.<br>
 bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
                                               const wchar_t* rhs) {<br>
-  if (lhs == NULL) return rhs == NULL;<br>
+  if (lhs == nullptr) return rhs == nullptr;<br>
<br>
-  if (rhs == NULL) return false;<br>
+  if (rhs == nullptr) return false;<br>
<br>
 #if GTEST_OS_WINDOWS<br>
   return _wcsicmp(lhs, rhs) == 0;<br>
@@ -1982,14 +1943,14 @@ bool String::CaseInsensitiveWideCStringEquals(const wchar_t* lhs,<br>
   // Other unknown OSes may not define it either.<br>
   wint_t left, right;<br>
   do {<br>
-    left = towlower(*lhs++);<br>
-    right = towlower(*rhs++);<br>
+    left = towlower(static_cast<wint_t>(*lhs++));<br>
+    right = towlower(static_cast<wint_t>(*rhs++));<br>
   } while (left && left == right);<br>
   return left == right;<br>
 #endif  // OS selector<br>
 }<br>
<br>
-// Returns true iff str ends with the given suffix, ignoring case.<br>
+// Returns true if and only if str ends with the given suffix, ignoring case.<br>
 // Any string is considered to end with an empty suffix.<br>
 bool String::EndsWithCaseInsensitive(<br>
     const std::string& str, const std::string& suffix) {<br>
@@ -2008,12 +1969,17 @@ std::string String::FormatIntWidth2(int value) {<br>
 }<br>
<br>
 // Formats an int value as "%X".<br>
-std::string String::FormatHexInt(int value) {<br>
+std::string String::FormatHexUInt32(UInt32 value) {<br>
   std::stringstream ss;<br>
   ss << std::hex << std::uppercase << value;<br>
   return ss.str();<br>
 }<br>
<br>
+// Formats an int value as "%X".<br>
+std::string String::FormatHexInt(int value) {<br>
+  return FormatHexUInt32(static_cast<UInt32>(value));<br>
+}<br>
+<br>
 // Formats a byte as "%02X".<br>
 std::string String::FormatByte(unsigned char value) {<br>
   std::stringstream ss;<br>
@@ -2030,7 +1996,7 @@ std::string StringStreamToString(::std::stringstream* ss) {<br>
   const char* const end = start + str.length();<br>
<br>
   std::string result;<br>
-  result.reserve(2 * (end - start));<br>
+  result.reserve(static_cast<size_t>(2 * (end - start)));<br>
   for (const char* ch = start; ch != end; ++ch) {<br>
     if (*ch == '\0') {<br>
       result += "\\0";  // Replaces NUL with "\\0";<br>
@@ -2060,9 +2026,7 @@ std::string AppendUserMessage(const std::string& gtest_msg,<br>
<br>
 // Creates an empty TestResult.<br>
 TestResult::TestResult()<br>
-    : death_test_count_(0),<br>
-      elapsed_time_(0) {<br>
-}<br>
+    : death_test_count_(0), start_timestamp_(0), elapsed_time_(0) {}<br>
<br>
 // D'tor.<br>
 TestResult::~TestResult() {<br>
@@ -2074,7 +2038,7 @@ TestResult::~TestResult() {<br>
 const TestPartResult& TestResult::GetTestPartResult(int i) const {<br>
   if (i < 0 || i >= total_part_count())<br>
     internal::posix::Abort();<br>
-  return test_part_results_.at(i);<br>
+  return test_part_results_.at(static_cast<size_t>(i));<br>
 }<br>
<br>
 // Returns the i-th test property. i can range from 0 to<br>
@@ -2083,7 +2047,7 @@ const TestPartResult& TestResult::GetTestPartResult(int i) const {<br>
 const TestProperty& TestResult::GetTestProperty(int i) const {<br>
   if (i < 0 || i >= test_property_count())<br>
     internal::posix::Abort();<br>
-  return test_properties_.at(i);<br>
+  return test_properties_.at(static_cast<size_t>(i));<br>
 }<br>
<br>
 // Clears the test part results.<br>
@@ -2131,18 +2095,18 @@ static const char* const kReservedTestSuitesAttributes[] = {<br>
 // The list of reserved attributes used in the <testsuite> element of XML<br>
 // output.<br>
 static const char* const kReservedTestSuiteAttributes[] = {<br>
-  "disabled",<br>
-  "errors",<br>
-  "failures",<br>
-  "name",<br>
-  "tests",<br>
-  "time"<br>
-};<br>
+    "disabled", "errors", "failures", "name", "tests", "time", "timestamp"};<br>
<br>
 // The list of reserved attributes used in the <testcase> element of XML output.<br>
 static const char* const kReservedTestCaseAttributes[] = {<br>
-    "classname",  "name",        "status", "time",<br>
-    "type_param", "value_param", "file",   "line"};<br>
+    "classname",   "name", "status", "time",  "type_param",<br>
+    "value_param", "file", "line"};<br>
+<br>
+// Use a slightly <br>
diff erent set for allowed output to ensure existing tests can<br>
+// still RecordProperty("result") or "RecordProperty(timestamp")<br>
+static const char* const kReservedOutputTestCaseAttributes[] = {<br>
+    "classname",   "name", "status", "time",   "type_param",<br>
+    "value_param", "file", "line",   "result", "timestamp"};<br>
<br>
 template <int kSize><br>
 std::vector<std::string> ArrayAsVector(const char* const (&array)[kSize]) {<br>
@@ -2164,6 +2128,22 @@ static std::vector<std::string> GetReservedAttributesForElement(<br>
   return std::vector<std::string>();<br>
 }<br>
<br>
+// TODO(jdesprez): Merge the two getReserved attributes once skip is improved<br>
+static std::vector<std::string> GetReservedOutputAttributesForElement(<br>
+    const std::string& xml_element) {<br>
+  if (xml_element == "testsuites") {<br>
+    return ArrayAsVector(kReservedTestSuitesAttributes);<br>
+  } else if (xml_element == "testsuite") {<br>
+    return ArrayAsVector(kReservedTestSuiteAttributes);<br>
+  } else if (xml_element == "testcase") {<br>
+    return ArrayAsVector(kReservedOutputTestCaseAttributes);<br>
+  } else {<br>
+    GTEST_CHECK_(false) << "Unrecognized xml_element provided: " << xml_element;<br>
+  }<br>
+  // This code is unreachable but some compilers may not realizes that.<br>
+  return std::vector<std::string>();<br>
+}<br>
+<br>
 static std::string FormatWordList(const std::vector<std::string>& words) {<br>
   Message word_list;<br>
   for (size_t i = 0; i < words.size(); ++i) {<br>
@@ -2207,7 +2187,17 @@ void TestResult::Clear() {<br>
   elapsed_time_ = 0;<br>
 }<br>
<br>
-// Returns true iff the test failed.<br>
+// Returns true off the test part was skipped.<br>
+static bool TestPartSkipped(const TestPartResult& result) {<br>
+  return result.skipped();<br>
+}<br>
+<br>
+// Returns true if and only if the test was skipped.<br>
+bool TestResult::Skipped() const {<br>
+  return !Failed() && CountIf(test_part_results_, TestPartSkipped) > 0;<br>
+}<br>
+<br>
+// Returns true if and only if the test failed.<br>
 bool TestResult::Failed() const {<br>
   for (int i = 0; i < total_part_count(); ++i) {<br>
     if (GetTestPartResult(i).failed())<br>
@@ -2216,22 +2206,22 @@ bool TestResult::Failed() const {<br>
   return false;<br>
 }<br>
<br>
-// Returns true iff the test part fatally failed.<br>
+// Returns true if and only if the test part fatally failed.<br>
 static bool TestPartFatallyFailed(const TestPartResult& result) {<br>
   return result.fatally_failed();<br>
 }<br>
<br>
-// Returns true iff the test fatally failed.<br>
+// Returns true if and only if the test fatally failed.<br>
 bool TestResult::HasFatalFailure() const {<br>
   return CountIf(test_part_results_, TestPartFatallyFailed) > 0;<br>
 }<br>
<br>
-// Returns true iff the test part non-fatally failed.<br>
+// Returns true if and only if the test part non-fatally failed.<br>
 static bool TestPartNonfatallyFailed(const TestPartResult& result) {<br>
   return result.nonfatally_failed();<br>
 }<br>
<br>
-// Returns true iff the test has a non-fatal failure.<br>
+// Returns true if and only if the test has a non-fatal failure.<br>
 bool TestResult::HasNonfatalFailure() const {<br>
   return CountIf(test_part_results_, TestPartNonfatallyFailed) > 0;<br>
 }<br>
@@ -2294,25 +2284,25 @@ void ReportFailureInUnknownLocation(TestPartResult::Type result_type,<br>
   // AddTestPartResult.<br>
   UnitTest::GetInstance()->AddTestPartResult(<br>
       result_type,<br>
-      NULL,  // No info about the source file where the exception occurred.<br>
-      -1,    // We have no info on which line caused the exception.<br>
+      nullptr,  // No info about the source file where the exception occurred.<br>
+      -1,       // We have no info on which line caused the exception.<br>
       message,<br>
-      "");   // No stack trace, either.<br>
+      "");  // No stack trace, either.<br>
 }<br>
<br>
 }  // namespace internal<br>
<br>
-// Google Test requires all tests in the same test case to use the same test<br>
+// Google Test requires all tests in the same test suite to use the same test<br>
 // fixture class.  This function checks if the current test has the<br>
-// same fixture class as the first test in the current test case.  If<br>
+// same fixture class as the first test in the current test suite.  If<br>
 // yes, it returns true; otherwise it generates a Google Test failure and<br>
 // returns false.<br>
 bool Test::HasSameFixtureClass() {<br>
   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
-  const TestCase* const test_case = impl->current_test_case();<br>
+  const TestSuite* const test_suite = impl->current_test_suite();<br>
<br>
-  // Info about the first test in the current test case.<br>
-  const TestInfo* const first_test_info = test_case->test_info_list()[0];<br>
+  // Info about the first test in the current test suite.<br>
+  const TestInfo* const first_test_info = test_suite->test_info_list()[0];<br>
   const internal::TypeId first_fixture_id = first_test_info->fixture_class_id_;<br>
   const char* const first_test_name = first_test_info->name();<br>
<br>
@@ -2328,7 +2318,7 @@ bool Test::HasSameFixtureClass() {<br>
     const bool this_is_TEST = this_fixture_id == internal::GetTestTypeId();<br>
<br>
     if (first_is_TEST || this_is_TEST) {<br>
-      // Both TEST and TEST_F appear in same test case, which is incorrect.<br>
+      // Both TEST and TEST_F appear in same test suite, which is incorrect.<br>
       // Tell the user how to fix this.<br>
<br>
       // Gets the name of the TEST and the name of the TEST_F.  Note<br>
@@ -2340,9 +2330,9 @@ bool Test::HasSameFixtureClass() {<br>
           first_is_TEST ? this_test_name : first_test_name;<br>
<br>
       ADD_FAILURE()<br>
-          << "All tests in the same test case must use the same test fixture\n"<br>
-          << "class, so mixing TEST_F and TEST in the same test case is\n"<br>
-          << "illegal.  In test case " << this_test_info->test_case_name()<br>
+          << "All tests in the same test suite must use the same test fixture\n"<br>
+          << "class, so mixing TEST_F and TEST in the same test suite is\n"<br>
+          << "illegal.  In test suite " << this_test_info->test_suite_name()<br>
           << ",\n"<br>
           << "test " << TEST_F_name << " is defined using TEST_F but\n"<br>
           << "test " << TEST_name << " is defined using TEST.  You probably\n"<br>
@@ -2352,15 +2342,15 @@ bool Test::HasSameFixtureClass() {<br>
       // Two fixture classes with the same name appear in two <br>
diff erent<br>
       // namespaces, which is not allowed. Tell the user how to fix this.<br>
       ADD_FAILURE()<br>
-          << "All tests in the same test case must use the same test fixture\n"<br>
-          << "class.  However, in test case "<br>
-          << this_test_info->test_case_name() << ",\n"<br>
-          << "you defined test " << first_test_name<br>
-          << " and test " << this_test_name << "\n"<br>
+          << "All tests in the same test suite must use the same test fixture\n"<br>
+          << "class.  However, in test suite "<br>
+          << this_test_info->test_suite_name() << ",\n"<br>
+          << "you defined test " << first_test_name << " and test "<br>
+          << this_test_name << "\n"<br>
           << "using two <br>
diff erent test fixture classes.  This can happen if\n"<br>
           << "the two classes are from <br>
diff erent namespaces or translation\n"<br>
           << "units and have the same name.  You should probably rename one\n"<br>
-          << "of the classes to put the tests into <br>
diff erent test cases.";<br>
+          << "of the classes to put the tests into <br>
diff erent test suites.";<br>
     }<br>
     return false;<br>
   }<br>
@@ -2393,7 +2383,7 @@ namespace internal {<br>
 static std::string FormatCxxExceptionMessage(const char* description,<br>
                                              const char* location) {<br>
   Message message;<br>
-  if (description != NULL) {<br>
+  if (description != nullptr) {<br>
     message << "C++ exception with description \"" << description << "\"";<br>
   } else {<br>
     message << "Unknown C++ exception";<br>
@@ -2491,7 +2481,7 @@ Result HandleExceptionsInMethodIfSupported(<br>
     } catch (...) {  // NOLINT<br>
       internal::ReportFailureInUnknownLocation(<br>
           TestPartResult::kFatalFailure,<br>
-          FormatCxxExceptionMessage(NULL, location));<br>
+          FormatCxxExceptionMessage(nullptr, location));<br>
     }<br>
     return static_cast<Result>(0);<br>
 #else<br>
@@ -2511,8 +2501,9 @@ void Test::Run() {<br>
   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
   impl->os_stack_trace_getter()->UponLeavingGTest();<br>
   internal::HandleExceptionsInMethodIfSupported(this, &Test::SetUp, "SetUp()");<br>
-  // We will run the test only if SetUp() was successful.<br>
-  if (!HasFatalFailure()) {<br>
+  // We will run the test only if SetUp() was successful and didn't call<br>
+  // GTEST_SKIP().<br>
+  if (!HasFatalFailure() && !IsSkipped()) {<br>
     impl->os_stack_trace_getter()->UponLeavingGTest();<br>
     internal::HandleExceptionsInMethodIfSupported(<br>
         this, &Test::TestBody, "the test body");<br>
@@ -2526,32 +2517,36 @@ void Test::Run() {<br>
       this, &Test::TearDown, "TearDown()");<br>
 }<br>
<br>
-// Returns true iff the current test has a fatal failure.<br>
+// Returns true if and only if the current test has a fatal failure.<br>
 bool Test::HasFatalFailure() {<br>
   return internal::GetUnitTestImpl()->current_test_result()->HasFatalFailure();<br>
 }<br>
<br>
-// Returns true iff the current test has a non-fatal failure.<br>
+// Returns true if and only if the current test has a non-fatal failure.<br>
 bool Test::HasNonfatalFailure() {<br>
   return internal::GetUnitTestImpl()->current_test_result()-><br>
       HasNonfatalFailure();<br>
 }<br>
<br>
+// Returns true if and only if the current test was skipped.<br>
+bool Test::IsSkipped() {<br>
+  return internal::GetUnitTestImpl()->current_test_result()->Skipped();<br>
+}<br>
+<br>
 // class TestInfo<br>
<br>
 // Constructs a TestInfo object. It assumes ownership of the test factory<br>
 // object.<br>
-TestInfo::TestInfo(const std::string& a_test_case_name,<br>
-                   const std::string& a_name,<br>
-                   const char* a_type_param,<br>
+TestInfo::TestInfo(const std::string& a_test_suite_name,<br>
+                   const std::string& a_name, const char* a_type_param,<br>
                    const char* a_value_param,<br>
                    internal::CodeLocation a_code_location,<br>
                    internal::TypeId fixture_class_id,<br>
                    internal::TestFactoryBase* factory)<br>
-    : test_case_name_(a_test_case_name),<br>
+    : test_suite_name_(a_test_suite_name),<br>
       name_(a_name),<br>
-      type_param_(a_type_param ? new std::string(a_type_param) : NULL),<br>
-      value_param_(a_value_param ? new std::string(a_value_param) : NULL),<br>
+      type_param_(a_type_param ? new std::string(a_type_param) : nullptr),<br>
+      value_param_(a_value_param ? new std::string(a_value_param) : nullptr),<br>
       location_(a_code_location),<br>
       fixture_class_id_(fixture_class_id),<br>
       should_run_(false),<br>
@@ -2570,7 +2565,7 @@ namespace internal {<br>
 //<br>
 // Arguments:<br>
 //<br>
-//   test_case_name:   name of the test case<br>
+//   test_suite_name:   name of the test suite<br>
 //   name:             name of the test<br>
 //   type_param:       the name of the test's type parameter, or NULL if<br>
 //                     this is not a typed or a type-parameterized test.<br>
@@ -2578,40 +2573,35 @@ namespace internal {<br>
 //                     or NULL if this is not a value-parameterized test.<br>
 //   code_location:    code location where the test is defined<br>
 //   fixture_class_id: ID of the test fixture class<br>
-//   set_up_tc:        pointer to the function that sets up the test case<br>
-//   tear_down_tc:     pointer to the function that tears down the test case<br>
+//   set_up_tc:        pointer to the function that sets up the test suite<br>
+//   tear_down_tc:     pointer to the function that tears down the test suite<br>
 //   factory:          pointer to the factory that creates a test object.<br>
 //                     The newly created TestInfo instance will assume<br>
 //                     ownership of the factory object.<br>
 TestInfo* MakeAndRegisterTestInfo(<br>
-    const char* test_case_name,<br>
-    const char* name,<br>
-    const char* type_param,<br>
-    const char* value_param,<br>
-    CodeLocation code_location,<br>
-    TypeId fixture_class_id,<br>
-    SetUpTestCaseFunc set_up_tc,<br>
-    TearDownTestCaseFunc tear_down_tc,<br>
-    TestFactoryBase* factory) {<br>
+    const char* test_suite_name, const char* name, const char* type_param,<br>
+    const char* value_param, CodeLocation code_location,<br>
+    TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc,<br>
+    TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory) {<br>
   TestInfo* const test_info =<br>
-      new TestInfo(test_case_name, name, type_param, value_param,<br>
+      new TestInfo(test_suite_name, name, type_param, value_param,<br>
                    code_location, fixture_class_id, factory);<br>
   GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info);<br>
   return test_info;<br>
 }<br>
<br>
-void ReportInvalidTestCaseType(const char* test_case_name,<br>
-                               CodeLocation code_location) {<br>
+void ReportInvalidTestSuiteType(const char* test_suite_name,<br>
+                                CodeLocation code_location) {<br>
   Message errors;<br>
   errors<br>
-      << "Attempted redefinition of test case " << test_case_name << ".\n"<br>
-      << "All tests in the same test case must use the same test fixture\n"<br>
-      << "class.  However, in test case " << test_case_name << ", you tried\n"<br>
+      << "Attempted redefinition of test suite " << test_suite_name << ".\n"<br>
+      << "All tests in the same test suite must use the same test fixture\n"<br>
+      << "class.  However, in test suite " << test_suite_name << ", you tried\n"<br>
       << "to define a test using a fixture class <br>
diff erent from the one\n"<br>
       << "used earlier. This can happen if the two fixture classes are\n"<br>
       << "from <br>
diff erent namespaces and have the same name. You should\n"<br>
       << "probably rename one of the classes to put the tests into <br>
diff erent\n"<br>
-      << "test cases.";<br>
+      << "test suites.";<br>
<br>
   GTEST_LOG_(ERROR) << FormatFileLocation(code_location.file.c_str(),<br>
                                           code_location.line)<br>
@@ -2624,7 +2614,7 @@ namespace {<br>
 // A predicate that checks the test name of a TestInfo against a known<br>
 // value.<br>
 //<br>
-// This is used for implementation of the TestCase class only.  We put<br>
+// This is used for implementation of the TestSuite class only.  We put<br>
 // it in the anonymous namespace to prevent polluting the outer<br>
 // namespace.<br>
 //<br>
@@ -2637,7 +2627,7 @@ class TestNameIs {<br>
   explicit TestNameIs(const char* name)<br>
       : name_(name) {}<br>
<br>
-  // Returns true iff the test name of test_info matches name_.<br>
+  // Returns true if and only if the test name of test_info matches name_.<br>
   bool operator()(const TestInfo * test_info) const {<br>
     return test_info && test_info->name() == name_;<br>
   }<br>
@@ -2651,7 +2641,7 @@ class TestNameIs {<br>
 namespace internal {<br>
<br>
 // This method expands all parameterized tests registered with macros TEST_P<br>
-// and INSTANTIATE_TEST_CASE_P into regular tests and registers those.<br>
+// and INSTANTIATE_TEST_SUITE_P into regular tests and registers those.<br>
 // This will be done just once during the program runtime.<br>
 void UnitTestImpl::RegisterParameterizedTests() {<br>
   if (!parameterized_tests_registered_) {<br>
@@ -2685,19 +2675,23 @@ void TestInfo::Run() {<br>
       factory_, &internal::TestFactoryBase::CreateTest,<br>
       "the test fixture's constructor");<br>
<br>
-  // Runs the test if the constructor didn't generate a fatal failure.<br>
+  // Runs the test if the constructor didn't generate a fatal failure or invoke<br>
+  // GTEST_SKIP().<br>
   // Note that the object will not be null<br>
-  if (!Test::HasFatalFailure()) {<br>
+  if (!Test::HasFatalFailure() && !Test::IsSkipped()) {<br>
     // This doesn't throw as all user code that can throw are wrapped into<br>
     // exception handling code.<br>
     test->Run();<br>
   }<br>
<br>
+  if (test != nullptr) {<br>
     // Deletes the test object.<br>
     impl->os_stack_trace_getter()->UponLeavingGTest();<br>
     internal::HandleExceptionsInMethodIfSupported(<br>
         test, &Test::DeleteSelf_, "the test fixture's destructor");<br>
+  }<br>
<br>
+  result_.set_start_timestamp(start);<br>
   result_.set_elapsed_time(internal::GetTimeInMillis() - start);<br>
<br>
   // Notifies the unit test event listener that a test has just finished.<br>
@@ -2705,134 +2699,151 @@ void TestInfo::Run() {<br>
<br>
   // Tells UnitTest to stop associating assertion results to this<br>
   // test.<br>
-  impl->set_current_test_info(NULL);<br>
+  impl->set_current_test_info(nullptr);<br>
 }<br>
<br>
-// class TestCase<br>
+// class TestSuite<br>
<br>
-// Gets the number of successful tests in this test case.<br>
-int TestCase::successful_test_count() const {<br>
+// Gets the number of successful tests in this test suite.<br>
+int TestSuite::successful_test_count() const {<br>
   return CountIf(test_info_list_, TestPassed);<br>
 }<br>
<br>
-// Gets the number of failed tests in this test case.<br>
-int TestCase::failed_test_count() const {<br>
+// Gets the number of successful tests in this test suite.<br>
+int TestSuite::skipped_test_count() const {<br>
+  return CountIf(test_info_list_, TestSkipped);<br>
+}<br>
+<br>
+// Gets the number of failed tests in this test suite.<br>
+int TestSuite::failed_test_count() const {<br>
   return CountIf(test_info_list_, TestFailed);<br>
 }<br>
<br>
 // Gets the number of disabled tests that will be reported in the XML report.<br>
-int TestCase::reportable_disabled_test_count() const {<br>
+int TestSuite::reportable_disabled_test_count() const {<br>
   return CountIf(test_info_list_, TestReportableDisabled);<br>
 }<br>
<br>
-// Gets the number of disabled tests in this test case.<br>
-int TestCase::disabled_test_count() const {<br>
+// Gets the number of disabled tests in this test suite.<br>
+int TestSuite::disabled_test_count() const {<br>
   return CountIf(test_info_list_, TestDisabled);<br>
 }<br>
<br>
 // Gets the number of tests to be printed in the XML report.<br>
-int TestCase::reportable_test_count() const {<br>
+int TestSuite::reportable_test_count() const {<br>
   return CountIf(test_info_list_, TestReportable);<br>
 }<br>
<br>
-// Get the number of tests in this test case that should run.<br>
-int TestCase::test_to_run_count() const {<br>
+// Get the number of tests in this test suite that should run.<br>
+int TestSuite::test_to_run_count() const {<br>
   return CountIf(test_info_list_, ShouldRunTest);<br>
 }<br>
<br>
 // Gets the number of all tests.<br>
-int TestCase::total_test_count() const {<br>
+int TestSuite::total_test_count() const {<br>
   return static_cast<int>(test_info_list_.size());<br>
 }<br>
<br>
-// Creates a TestCase with the given name.<br>
+// Creates a TestSuite with the given name.<br>
 //<br>
 // Arguments:<br>
 //<br>
-//   name:         name of the test case<br>
-//   a_type_param: the name of the test case's type parameter, or NULL if<br>
-//                 this is not a typed or a type-parameterized test case.<br>
-//   set_up_tc:    pointer to the function that sets up the test case<br>
-//   tear_down_tc: pointer to the function that tears down the test case<br>
-TestCase::TestCase(const char* a_name, const char* a_type_param,<br>
-                   Test::SetUpTestCaseFunc set_up_tc,<br>
-                   Test::TearDownTestCaseFunc tear_down_tc)<br>
+//   name:         name of the test suite<br>
+//   a_type_param: the name of the test suite's type parameter, or NULL if<br>
+//                 this is not a typed or a type-parameterized test suite.<br>
+//   set_up_tc:    pointer to the function that sets up the test suite<br>
+//   tear_down_tc: pointer to the function that tears down the test suite<br>
+TestSuite::TestSuite(const char* a_name, const char* a_type_param,<br>
+                     internal::SetUpTestSuiteFunc set_up_tc,<br>
+                     internal::TearDownTestSuiteFunc tear_down_tc)<br>
     : name_(a_name),<br>
-      type_param_(a_type_param ? new std::string(a_type_param) : NULL),<br>
+      type_param_(a_type_param ? new std::string(a_type_param) : nullptr),<br>
       set_up_tc_(set_up_tc),<br>
       tear_down_tc_(tear_down_tc),<br>
       should_run_(false),<br>
-      elapsed_time_(0) {<br>
-}<br>
+      start_timestamp_(0),<br>
+      elapsed_time_(0) {}<br>
<br>
-// Destructor of TestCase.<br>
-TestCase::~TestCase() {<br>
+// Destructor of TestSuite.<br>
+TestSuite::~TestSuite() {<br>
   // Deletes every Test in the collection.<br>
   ForEach(test_info_list_, internal::Delete<TestInfo>);<br>
 }<br>
<br>
 // Returns the i-th test among all the tests. i can range from 0 to<br>
 // total_test_count() - 1. If i is not in that range, returns NULL.<br>
-const TestInfo* TestCase::GetTestInfo(int i) const {<br>
+const TestInfo* TestSuite::GetTestInfo(int i) const {<br>
   const int index = GetElementOr(test_indices_, i, -1);<br>
-  return index < 0 ? NULL : test_info_list_[index];<br>
+  return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];<br>
 }<br>
<br>
 // Returns the i-th test among all the tests. i can range from 0 to<br>
 // total_test_count() - 1. If i is not in that range, returns NULL.<br>
-TestInfo* TestCase::GetMutableTestInfo(int i) {<br>
+TestInfo* TestSuite::GetMutableTestInfo(int i) {<br>
   const int index = GetElementOr(test_indices_, i, -1);<br>
-  return index < 0 ? NULL : test_info_list_[index];<br>
+  return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];<br>
 }<br>
<br>
-// Adds a test to this test case.  Will delete the test upon<br>
-// destruction of the TestCase object.<br>
-void TestCase::AddTestInfo(TestInfo * test_info) {<br>
+// Adds a test to this test suite.  Will delete the test upon<br>
+// destruction of the TestSuite object.<br>
+void TestSuite::AddTestInfo(TestInfo* test_info) {<br>
   test_info_list_.push_back(test_info);<br>
   test_indices_.push_back(static_cast<int>(test_indices_.size()));<br>
 }<br>
<br>
-// Runs every test in this TestCase.<br>
-void TestCase::Run() {<br>
+// Runs every test in this TestSuite.<br>
+void TestSuite::Run() {<br>
   if (!should_run_) return;<br>
<br>
   internal::UnitTestImpl* const impl = internal::GetUnitTestImpl();<br>
-  impl->set_current_test_case(this);<br>
+  impl->set_current_test_suite(this);<br>
<br>
   TestEventListener* repeater = UnitTest::GetInstance()->listeners().repeater();<br>
<br>
+  // Call both legacy and the new API<br>
+  repeater->OnTestSuiteStart(*this);<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
   repeater->OnTestCaseStart(*this);<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
+<br>
   impl->os_stack_trace_getter()->UponLeavingGTest();<br>
   internal::HandleExceptionsInMethodIfSupported(<br>
-      this, &TestCase::RunSetUpTestCase, "SetUpTestCase()");<br>
+      this, &TestSuite::RunSetUpTestSuite, "SetUpTestSuite()");<br>
<br>
-  const internal::TimeInMillis start = internal::GetTimeInMillis();<br>
+  start_timestamp_ = internal::GetTimeInMillis();<br>
   for (int i = 0; i < total_test_count(); i++) {<br>
     GetMutableTestInfo(i)->Run();<br>
   }<br>
-  elapsed_time_ = internal::GetTimeInMillis() - start;<br>
+  elapsed_time_ = internal::GetTimeInMillis() - start_timestamp_;<br>
<br>
   impl->os_stack_trace_getter()->UponLeavingGTest();<br>
   internal::HandleExceptionsInMethodIfSupported(<br>
-      this, &TestCase::RunTearDownTestCase, "TearDownTestCase()");<br>
+      this, &TestSuite::RunTearDownTestSuite, "TearDownTestSuite()");<br>
<br>
+  // Call both legacy and the new API<br>
+  repeater->OnTestSuiteEnd(*this);<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
   repeater->OnTestCaseEnd(*this);<br>
-  impl->set_current_test_case(NULL);<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI<br>
+<br>
+  impl->set_current_test_suite(nullptr);<br>
 }<br>
<br>
-// Clears the results of all tests in this test case.<br>
-void TestCase::ClearResult() {<br>
+// Clears the results of all tests in this test suite.<br>
+void TestSuite::ClearResult() {<br>
   ad_hoc_test_result_.Clear();<br>
   ForEach(test_info_list_, TestInfo::ClearTestResult);<br>
 }<br>
<br>
-// Shuffles the tests in this test case.<br>
-void TestCase::ShuffleTests(internal::Random* random) {<br>
+// Shuffles the tests in this test suite.<br>
+void TestSuite::ShuffleTests(internal::Random* random) {<br>
   Shuffle(random, &test_indices_);<br>
 }<br>
<br>
 // Restores the test order to before the first shuffle.<br>
-void TestCase::UnshuffleTests() {<br>
+void TestSuite::UnshuffleTests() {<br>
   for (size_t i = 0; i < test_indices_.size(); i++) {<br>
     test_indices_[i] = static_cast<int>(i);<br>
   }<br>
@@ -2855,9 +2866,9 @@ static std::string FormatTestCount(int test_count) {<br>
   return FormatCountableNoun(test_count, "test", "tests");<br>
 }<br>
<br>
-// Formats the count of test cases.<br>
-static std::string FormatTestCaseCount(int test_case_count) {<br>
-  return FormatCountableNoun(test_case_count, "test case", "test cases");<br>
+// Formats the count of test suites.<br>
+static std::string FormatTestSuiteCount(int test_suite_count) {<br>
+  return FormatCountableNoun(test_suite_count, "test suite", "test suites");<br>
 }<br>
<br>
 // Converts a TestPartResult::Type enum to human-friendly string<br>
@@ -2866,6 +2877,8 @@ static std::string FormatTestCaseCount(int test_case_count) {<br>
 // between the two when viewing the test result.<br>
 static const char * TestPartResultTypeToString(TestPartResult::Type type) {<br>
   switch (type) {<br>
+    case TestPartResult::kSkip:<br>
+      return "Skipped";<br>
     case TestPartResult::kSuccess:<br>
       return "Success";<br>
<br>
@@ -2913,14 +2926,6 @@ static void PrintTestPartResult(const TestPartResult& test_part_result) {<br>
 }<br>
<br>
 // class PrettyUnitTestResultPrinter<br>
-<br>
-enum GTestColor {<br>
-  COLOR_DEFAULT,<br>
-  COLOR_RED,<br>
-  COLOR_GREEN,<br>
-  COLOR_YELLOW<br>
-};<br>
-<br>
 #if GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE && \<br>
     !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT && !GTEST_OS_WINDOWS_MINGW<br>
<br>
@@ -2974,13 +2979,14 @@ static const char* GetAnsiColorCode(GTestColor color) {<br>
     case COLOR_RED:     return "1";<br>
     case COLOR_GREEN:   return "2";<br>
     case COLOR_YELLOW:  return "3";<br>
-    default:            return NULL;<br>
-  };<br>
+    default:<br>
+      return nullptr;<br>
+  }<br>
 }<br>
<br>
 #endif  // GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_MOBILE<br>
<br>
-// Returns true iff Google Test should use colors in the output.<br>
+// Returns true if and only if Google Test should use colors in the output.<br>
 bool ShouldUseColor(bool stdout_is_tty) {<br>
   const char* const gtest_color = GTEST_FLAG(color).c_str();<br>
<br>
@@ -3021,19 +3027,18 @@ bool ShouldUseColor(bool stdout_is_tty) {<br>
 // cannot simply emit special characters and have the terminal change colors.<br>
 // This routine must actually emit the characters rather than return a string<br>
 // that would be colored when printed, as can be done on Linux.<br>
-static void ColoredPrintf(GTestColor color, const char* fmt, ...) {<br>
+void ColoredPrintf(GTestColor color, const char* fmt, ...) {<br>
   va_list args;<br>
   va_start(args, fmt);<br>
<br>
-#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS || \<br>
-    GTEST_OS_IOS || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT<br>
+#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS || GTEST_OS_IOS || \<br>
+    GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT || defined(ESP_PLATFORM)<br>
   const bool use_color = AlwaysFalse();<br>
 #else<br>
   static const bool in_color_mode =<br>
       ShouldUseColor(posix::IsATTY(posix::FileNo(stdout)) != 0);<br>
   const bool use_color = in_color_mode && (color != COLOR_DEFAULT);<br>
-#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_SYMBIAN || GTEST_OS_ZOS<br>
-  // The '!= 0' comparison is necessary to satisfy MSVC 7.1.<br>
+#endif  // GTEST_OS_WINDOWS_MOBILE || GTEST_OS_ZOS<br>
<br>
   if (!use_color) {<br>
     vprintf(fmt, args);<br>
@@ -3079,14 +3084,13 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {<br>
   const char* const type_param = test_info.type_param();<br>
   const char* const value_param = test_info.value_param();<br>
<br>
-  if (type_param != NULL || value_param != NULL) {<br>
+  if (type_param != nullptr || value_param != nullptr) {<br>
     printf(", where ");<br>
-    if (type_param != NULL) {<br>
+    if (type_param != nullptr) {<br>
       printf("%s = %s", kTypeParamLabel, type_param);<br>
-      if (value_param != NULL)<br>
-        printf(" and ");<br>
+      if (value_param != nullptr) printf(" and ");<br>
     }<br>
-    if (value_param != NULL) {<br>
+    if (value_param != nullptr) {<br>
       printf("%s = %s", kValueParamLabel, value_param);<br>
     }<br>
   }<br>
@@ -3098,27 +3102,39 @@ static void PrintFullTestCommentIfPresent(const TestInfo& test_info) {<br>
 class PrettyUnitTestResultPrinter : public TestEventListener {<br>
  public:<br>
   PrettyUnitTestResultPrinter() {}<br>
-  static void PrintTestName(const char * test_case, const char * test) {<br>
-    printf("%s.%s", test_case, test);<br>
+  static void PrintTestName(const char* test_suite, const char* test) {<br>
+    printf("%s.%s", test_suite, test);<br>
   }<br>
<br>
   // The following methods override what's in the TestEventListener class.<br>
-  virtual void OnTestProgramStart(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);<br>
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);<br>
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestCaseStart(const TestCase& test_case);<br>
-  virtual void OnTestStart(const TestInfo& test_info);<br>
-  virtual void OnTestPartResult(const TestPartResult& result);<br>
-  virtual void OnTestEnd(const TestInfo& test_info);<br>
-  virtual void OnTestCaseEnd(const TestCase& test_case);<br>
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);<br>
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) {}<br>
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
-  virtual void OnTestProgramEnd(const UnitTest& /*unit_test*/) {}<br>
+  void OnTestProgramStart(const UnitTest& /*unit_test*/) override {}<br>
+  void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;<br>
+  void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;<br>
+  void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {}<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseStart(const TestCase& test_case) override;<br>
+#else<br>
+  void OnTestSuiteStart(const TestSuite& test_suite) override;<br>
+#endif  // OnTestCaseStart<br>
+<br>
+  void OnTestStart(const TestInfo& test_info) override;<br>
+<br>
+  void OnTestPartResult(const TestPartResult& result) override;<br>
+  void OnTestEnd(const TestInfo& test_info) override;<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseEnd(const TestCase& test_case) override;<br>
+#else<br>
+  void OnTestSuiteEnd(const TestSuite& test_suite) override;<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+<br>
+  void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;<br>
+  void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {}<br>
+  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+  void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {}<br>
<br>
  private:<br>
   static void PrintFailedTests(const UnitTest& unit_test);<br>
+  static void PrintSkippedTests(const UnitTest& unit_test);<br>
 };<br>
<br>
   // Fired before each iteration of tests starts.<br>
@@ -3153,7 +3169,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationStart(<br>
   ColoredPrintf(COLOR_GREEN,  "[==========] ");<br>
   printf("Running %s from %s.\n",<br>
          FormatTestCount(unit_test.test_to_run_count()).c_str(),<br>
-         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());<br>
+         FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());<br>
   fflush(stdout);<br>
 }<br>
<br>
@@ -3164,22 +3180,38 @@ void PrettyUnitTestResultPrinter::OnEnvironmentsSetUpStart(<br>
   fflush(stdout);<br>
 }<br>
<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
 void PrettyUnitTestResultPrinter::OnTestCaseStart(const TestCase& test_case) {<br>
   const std::string counts =<br>
       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");<br>
   ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
   printf("%s from %s", counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
-  if (test_case.type_param() == NULL) {<br>
+  if (test_case.type_param() == nullptr) {<br>
     printf("\n");<br>
   } else {<br>
     printf(", where %s = %s\n", kTypeParamLabel, test_case.type_param());<br>
   }<br>
   fflush(stdout);<br>
 }<br>
+#else<br>
+void PrettyUnitTestResultPrinter::OnTestSuiteStart(<br>
+    const TestSuite& test_suite) {<br>
+  const std::string counts =<br>
+      FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");<br>
+  ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
+  printf("%s from %s", counts.c_str(), <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>());<br>
+  if (test_suite.type_param() == nullptr) {<br>
+    printf("\n");<br>
+  } else {<br>
+    printf(", where %s = %s\n", kTypeParamLabel, test_suite.type_param());<br>
+  }<br>
+  fflush(stdout);<br>
+}<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {<br>
   ColoredPrintf(COLOR_GREEN,  "[ RUN      ] ");<br>
-  PrintTestName(test_info.test_case_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+  PrintTestName(test_info.test_suite_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
   printf("\n");<br>
   fflush(stdout);<br>
 }<br>
@@ -3187,22 +3219,29 @@ void PrettyUnitTestResultPrinter::OnTestStart(const TestInfo& test_info) {<br>
 // Called after an assertion failure.<br>
 void PrettyUnitTestResultPrinter::OnTestPartResult(<br>
     const TestPartResult& result) {<br>
-  // If the test part succeeded, we don't need to do anything.<br>
-  if (result.type() == TestPartResult::kSuccess)<br>
-    return;<br>
-<br>
-  // Print failure message from the assertion (e.g. expected this and got that).<br>
-  PrintTestPartResult(result);<br>
-  fflush(stdout);<br>
+  switch (result.type()) {<br>
+    // If the test part succeeded, or was skipped,<br>
+    // we don't need to do anything.<br>
+    case TestPartResult::kSkip:<br>
+    case TestPartResult::kSuccess:<br>
+      return;<br>
+    default:<br>
+      // Print failure message from the assertion<br>
+      // (e.g. expected this and got that).<br>
+      PrintTestPartResult(result);<br>
+      fflush(stdout);<br>
+  }<br>
 }<br>
<br>
 void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {<br>
   if (test_info.result()->Passed()) {<br>
     ColoredPrintf(COLOR_GREEN, "[       OK ] ");<br>
+  } else if (test_info.result()->Skipped()) {<br>
+    ColoredPrintf(COLOR_GREEN, "[  SKIPPED ] ");<br>
   } else {<br>
     ColoredPrintf(COLOR_RED, "[  FAILED  ] ");<br>
   }<br>
-  PrintTestName(test_info.test_case_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+  PrintTestName(test_info.test_suite_name(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
   if (test_info.result()->Failed())<br>
     PrintFullTestCommentIfPresent(test_info);<br>
<br>
@@ -3215,17 +3254,29 @@ void PrettyUnitTestResultPrinter::OnTestEnd(const TestInfo& test_info) {<br>
   fflush(stdout);<br>
 }<br>
<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
 void PrettyUnitTestResultPrinter::OnTestCaseEnd(const TestCase& test_case) {<br>
   if (!GTEST_FLAG(print_time)) return;<br>
<br>
   const std::string counts =<br>
       FormatCountableNoun(test_case.test_to_run_count(), "test", "tests");<br>
   ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
-  printf("%s from %s (%s ms total)\n\n",<br>
-         counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(),<br>
+  printf("%s from %s (%s ms total)\n\n", counts.c_str(), <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(),<br>
          internal::StreamableToString(test_case.elapsed_time()).c_str());<br>
   fflush(stdout);<br>
 }<br>
+#else<br>
+void PrettyUnitTestResultPrinter::OnTestSuiteEnd(const TestSuite& test_suite) {<br>
+  if (!GTEST_FLAG(print_time)) return;<br>
+<br>
+  const std::string counts =<br>
+      FormatCountableNoun(test_suite.test_to_run_count(), "test", "tests");<br>
+  ColoredPrintf(COLOR_GREEN, "[----------] ");<br>
+  printf("%s from %s (%s ms total)\n\n", counts.c_str(), <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(),<br>
+         internal::StreamableToString(test_suite.elapsed_time()).c_str());<br>
+  fflush(stdout);<br>
+}<br>
+#endif  // GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 void PrettyUnitTestResultPrinter::OnEnvironmentsTearDownStart(<br>
     const UnitTest& /*unit_test*/) {<br>
@@ -3241,30 +3292,54 @@ void PrettyUnitTestResultPrinter::PrintFailedTests(const UnitTest& unit_test) {<br>
     return;<br>
   }<br>
<br>
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
-    const TestCase& test_case = *unit_test.GetTestCase(i);<br>
-    if (!test_case.should_run() || (test_case.failed_test_count() == 0)) {<br>
+  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+    const TestSuite& test_suite = *unit_test.GetTestSuite(i);<br>
+    if (!test_suite.should_run() || (test_suite.failed_test_count() == 0)) {<br>
       continue;<br>
     }<br>
-    for (int j = 0; j < test_case.total_test_count(); ++j) {<br>
-      const TestInfo& test_info = *test_case.GetTestInfo(j);<br>
-      if (!test_info.should_run() || test_info.result()->Passed()) {<br>
+    for (int j = 0; j < test_suite.total_test_count(); ++j) {<br>
+      const TestInfo& test_info = *test_suite.GetTestInfo(j);<br>
+      if (!test_info.should_run() || !test_info.result()->Failed()) {<br>
         continue;<br>
       }<br>
       ColoredPrintf(COLOR_RED, "[  FAILED  ] ");<br>
-      printf("%s.%s", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+      printf("%s.%s", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
       PrintFullTestCommentIfPresent(test_info);<br>
       printf("\n");<br>
     }<br>
   }<br>
 }<br>
<br>
+// Internal helper for printing the list of skipped tests.<br>
+void PrettyUnitTestResultPrinter::PrintSkippedTests(const UnitTest& unit_test) {<br>
+  const int skipped_test_count = unit_test.skipped_test_count();<br>
+  if (skipped_test_count == 0) {<br>
+    return;<br>
+  }<br>
+<br>
+  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+    const TestSuite& test_suite = *unit_test.GetTestSuite(i);<br>
+    if (!test_suite.should_run() || (test_suite.skipped_test_count() == 0)) {<br>
+      continue;<br>
+    }<br>
+    for (int j = 0; j < test_suite.total_test_count(); ++j) {<br>
+      const TestInfo& test_info = *test_suite.GetTestInfo(j);<br>
+      if (!test_info.should_run() || !test_info.result()->Skipped()) {<br>
+        continue;<br>
+      }<br>
+      ColoredPrintf(COLOR_GREEN, "[  SKIPPED ] ");<br>
+      printf("%s.%s", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+      printf("\n");<br>
+    }<br>
+  }<br>
+}<br>
+<br>
 void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
                                                      int /*iteration*/) {<br>
   ColoredPrintf(COLOR_GREEN,  "[==========] ");<br>
   printf("%s from %s ran.",<br>
          FormatTestCount(unit_test.test_to_run_count()).c_str(),<br>
-         FormatTestCaseCount(unit_test.test_case_to_run_count()).c_str());<br>
+         FormatTestSuiteCount(unit_test.test_suite_to_run_count()).c_str());<br>
   if (GTEST_FLAG(print_time)) {<br>
     printf(" (%s ms total)",<br>
            internal::StreamableToString(unit_test.elapsed_time()).c_str());<br>
@@ -3273,6 +3348,13 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
   ColoredPrintf(COLOR_GREEN,  "[  PASSED  ] ");<br>
   printf("%s.\n", FormatTestCount(unit_test.successful_test_count()).c_str());<br>
<br>
+  const int skipped_test_count = unit_test.skipped_test_count();<br>
+  if (skipped_test_count > 0) {<br>
+    ColoredPrintf(COLOR_GREEN, "[  SKIPPED ] ");<br>
+    printf("%s, listed below:\n", FormatTestCount(skipped_test_count).c_str());<br>
+    PrintSkippedTests(unit_test);<br>
+  }<br>
+<br>
   int num_failures = unit_test.failed_test_count();<br>
   if (!unit_test.Passed()) {<br>
     const int failed_test_count = unit_test.failed_test_count();<br>
@@ -3305,7 +3387,7 @@ void PrettyUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
 class TestEventRepeater : public TestEventListener {<br>
  public:<br>
   TestEventRepeater() : forwarding_enabled_(true) {}<br>
-  virtual ~TestEventRepeater();<br>
+  ~TestEventRepeater() override;<br>
   void Append(TestEventListener *listener);<br>
   TestEventListener* Release(TestEventListener* listener);<br>
<br>
@@ -3314,19 +3396,27 @@ class TestEventRepeater : public TestEventListener {<br>
   bool forwarding_enabled() const { return forwarding_enabled_; }<br>
   void set_forwarding_enabled(bool enable) { forwarding_enabled_ = enable; }<br>
<br>
-  virtual void OnTestProgramStart(const UnitTest& unit_test);<br>
-  virtual void OnTestIterationStart(const UnitTest& unit_test, int iteration);<br>
-  virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test);<br>
-  virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test);<br>
-  virtual void OnTestCaseStart(const TestCase& test_case);<br>
-  virtual void OnTestStart(const TestInfo& test_info);<br>
-  virtual void OnTestPartResult(const TestPartResult& result);<br>
-  virtual void OnTestEnd(const TestInfo& test_info);<br>
-  virtual void OnTestCaseEnd(const TestCase& test_case);<br>
-  virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test);<br>
-  virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test);<br>
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
-  virtual void OnTestProgramEnd(const UnitTest& unit_test);<br>
+  void OnTestProgramStart(const UnitTest& unit_test) override;<br>
+  void OnTestIterationStart(const UnitTest& unit_test, int iteration) override;<br>
+  void OnEnvironmentsSetUpStart(const UnitTest& unit_test) override;<br>
+  void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) override;<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseStart(const TestSuite& parameter) override;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestSuiteStart(const TestSuite& parameter) override;<br>
+  void OnTestStart(const TestInfo& test_info) override;<br>
+  void OnTestPartResult(const TestPartResult& result) override;<br>
+  void OnTestEnd(const TestInfo& test_info) override;<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestCaseEnd(const TestCase& parameter) override;<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+  void OnTestSuiteEnd(const TestSuite& parameter) override;<br>
+  void OnEnvironmentsTearDownStart(const UnitTest& unit_test) override;<br>
+  void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) override;<br>
+  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+  void OnTestProgramEnd(const UnitTest& unit_test) override;<br>
<br>
  private:<br>
   // Controls whether events will be forwarded to listeners_. Set to false<br>
@@ -3346,16 +3436,15 @@ void TestEventRepeater::Append(TestEventListener *listener) {<br>
   listeners_.push_back(listener);<br>
 }<br>
<br>
-// FIXME: Factor the search functionality into Vector::Find.<br>
 TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {<br>
   for (size_t i = 0; i < listeners_.size(); ++i) {<br>
     if (listeners_[i] == listener) {<br>
-      listeners_.erase(listeners_.begin() + i);<br>
+      listeners_.erase(listeners_.begin() + static_cast<int>(i));<br>
       return listener;<br>
     }<br>
   }<br>
<br>
-  return NULL;<br>
+  return nullptr;<br>
 }<br>
<br>
 // Since most methods are very similar, use macros to reduce boilerplate.<br>
@@ -3370,25 +3459,33 @@ void TestEventRepeater::Name(const Type& parameter) { \<br>
 }<br>
 // This defines a member that forwards the call to all listeners in reverse<br>
 // order.<br>
-#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \<br>
-void TestEventRepeater::Name(const Type& parameter) { \<br>
-  if (forwarding_enabled_) { \<br>
-    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \<br>
-      listeners_[i]->Name(parameter); \<br>
-    } \<br>
-  } \<br>
-}<br>
+#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type)      \<br>
+  void TestEventRepeater::Name(const Type& parameter) { \<br>
+    if (forwarding_enabled_) {                          \<br>
+      for (size_t i = listeners_.size(); i != 0; i--) { \<br>
+        listeners_[i - 1]->Name(parameter);             \<br>
+      }                                                 \<br>
+    }                                                   \<br>
+  }<br>
<br>
 GTEST_REPEATER_METHOD_(OnTestProgramStart, UnitTest)<br>
 GTEST_REPEATER_METHOD_(OnEnvironmentsSetUpStart, UnitTest)<br>
-GTEST_REPEATER_METHOD_(OnTestCaseStart, TestCase)<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REPEATER_METHOD_(OnTestCaseStart, TestSuite)<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REPEATER_METHOD_(OnTestSuiteStart, TestSuite)<br>
 GTEST_REPEATER_METHOD_(OnTestStart, TestInfo)<br>
 GTEST_REPEATER_METHOD_(OnTestPartResult, TestPartResult)<br>
 GTEST_REPEATER_METHOD_(OnEnvironmentsTearDownStart, UnitTest)<br>
 GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsSetUpEnd, UnitTest)<br>
 GTEST_REVERSE_REPEATER_METHOD_(OnEnvironmentsTearDownEnd, UnitTest)<br>
 GTEST_REVERSE_REPEATER_METHOD_(OnTestEnd, TestInfo)<br>
-GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestCase)<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REVERSE_REPEATER_METHOD_(OnTestCaseEnd, TestSuite)<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+GTEST_REVERSE_REPEATER_METHOD_(OnTestSuiteEnd, TestSuite)<br>
 GTEST_REVERSE_REPEATER_METHOD_(OnTestProgramEnd, UnitTest)<br>
<br>
 #undef GTEST_REPEATER_METHOD_<br>
@@ -3406,8 +3503,8 @@ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,<br>
 void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,<br>
                                            int iteration) {<br>
   if (forwarding_enabled_) {<br>
-    for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) {<br>
-      listeners_[i]->OnTestIterationEnd(unit_test, iteration);<br>
+    for (size_t i = listeners_.size(); i > 0; i--) {<br>
+      listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration);<br>
     }<br>
   }<br>
 }<br>
@@ -3419,12 +3516,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {<br>
  public:<br>
   explicit XmlUnitTestResultPrinter(const char* output_file);<br>
<br>
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
-  void ListTestsMatchingFilter(const std::vector<TestCase*>& test_cases);<br>
+  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
+  void ListTestsMatchingFilter(const std::vector<TestSuite*>& test_suites);<br>
<br>
   // Prints an XML summary of all unit tests.<br>
   static void PrintXmlTestsList(std::ostream* stream,<br>
-                                const std::vector<TestCase*>& test_cases);<br>
+                                const std::vector<TestSuite*>& test_suites);<br>
<br>
  private:<br>
   // Is c a whitespace character that is normalized to a space character<br>
@@ -3469,12 +3566,12 @@ class XmlUnitTestResultPrinter : public EmptyTestEventListener {<br>
<br>
   // Streams an XML representation of a TestInfo object.<br>
   static void OutputXmlTestInfo(::std::ostream* stream,<br>
-                                const char* test_case_name,<br>
+                                const char* test_suite_name,<br>
                                 const TestInfo& test_info);<br>
<br>
-  // Prints an XML representation of a TestCase object<br>
-  static void PrintXmlTestCase(::std::ostream* stream,<br>
-                               const TestCase& test_case);<br>
+  // Prints an XML representation of a TestSuite object<br>
+  static void PrintXmlTestSuite(::std::ostream* stream,<br>
+                                const TestSuite& test_suite);<br>
<br>
   // Prints an XML summary of unit_test to output stream out.<br>
   static void PrintXmlUnitTest(::std::ostream* stream,<br>
@@ -3516,10 +3613,10 @@ void XmlUnitTestResultPrinter::OnTestIterationEnd(const UnitTest& unit_test,<br>
 }<br>
<br>
 void XmlUnitTestResultPrinter::ListTestsMatchingFilter(<br>
-    const std::vector<TestCase*>& test_cases) {<br>
+    const std::vector<TestSuite*>& test_suites) {<br>
   FILE* xmlout = OpenFileForWriting(output_file_);<br>
   std::stringstream stream;<br>
-  PrintXmlTestsList(&stream, test_cases);<br>
+  PrintXmlTestsList(&stream, test_suites);<br>
   fprintf(xmlout, "%s", StringStreamToString(&stream).c_str());<br>
   fclose(xmlout);<br>
 }<br>
@@ -3534,8 +3631,6 @@ void XmlUnitTestResultPrinter::ListTestsMatchingFilter(<br>
 // module will consist of ordinary English text.<br>
 // If this module is ever modified to produce version 1.1 XML output,<br>
 // most invalid characters can be retained using character references.<br>
-// FIXME: It might be nice to have a minimally invasive, human-readable<br>
-// escaping scheme for invalid characters, rather than dropping them.<br>
 std::string XmlUnitTestResultPrinter::EscapeXml(<br>
     const std::string& str, bool is_attribute) {<br>
   Message m;<br>
@@ -3600,7 +3695,7 @@ std::string XmlUnitTestResultPrinter::RemoveInvalidXmlCharacters(<br>
 // This is how Google Test concepts map to the DTD:<br>
 //<br>
 // <testsuites name="AllTests">        <-- corresponds to a UnitTest object<br>
-//   <testsuite name="testcase-name">  <-- corresponds to a TestCase object<br>
+//   <testsuite name="testcase-name">  <-- corresponds to a TestSuite object<br>
 //     <testcase name="test-name">     <-- corresponds to a TestInfo object<br>
 //       <failure message="...">...</failure><br>
 //       <failure message="...">...</failure><br>
@@ -3624,12 +3719,11 @@ static bool PortableLocaltime(time_t seconds, struct tm* out) {<br>
   // MINGW <time.h> provides neither localtime_r nor localtime_s, but uses<br>
   // Windows' localtime(), which has a thread-local tm buffer.<br>
   struct tm* tm_ptr = localtime(&seconds);  // NOLINT<br>
-  if (tm_ptr == NULL)<br>
-    return false;<br>
+  if (tm_ptr == nullptr) return false;<br>
   *out = *tm_ptr;<br>
   return true;<br>
 #else<br>
-  return localtime_r(&seconds, out) != NULL;<br>
+  return localtime_r(&seconds, out) != nullptr;<br>
 #endif<br>
 }<br>
<br>
@@ -3655,7 +3749,7 @@ void XmlUnitTestResultPrinter::OutputXmlCDataSection(::std::ostream* stream,<br>
   *stream << "<![CDATA[";<br>
   for (;;) {<br>
     const char* const next_segment = strstr(segment, "]]>");<br>
-    if (next_segment != NULL) {<br>
+    if (next_segment != nullptr) {<br>
       stream->write(<br>
           segment, static_cast<std::streamsize>(next_segment - segment));<br>
       *stream << "]]>]]&gt;<![CDATA[";<br>
@@ -3674,7 +3768,7 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(<br>
     const std::string& name,<br>
     const std::string& value) {<br>
   const std::vector<std::string>& allowed_names =<br>
-      GetReservedAttributesForElement(element_name);<br>
+      GetReservedOutputAttributesForElement(element_name);<br>
<br>
   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
                    allowed_names.end())<br>
@@ -3685,40 +3779,47 @@ void XmlUnitTestResultPrinter::OutputXmlAttribute(<br>
 }<br>
<br>
 // Prints an XML representation of a TestInfo object.<br>
-// FIXME: There is also value in printing properties with the plain printer.<br>
 void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,<br>
-                                                 const char* test_case_name,<br>
+                                                 const char* test_suite_name,<br>
                                                  const TestInfo& test_info) {<br>
   const TestResult& result = *test_info.result();<br>
-  const std::string kTestcase = "testcase";<br>
+  const std::string kTestsuite = "testcase";<br>
<br>
   if (test_info.is_in_another_shard()) {<br>
     return;<br>
   }<br>
<br>
   *stream << "    <testcase";<br>
-  OutputXmlAttribute(stream, kTestcase, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
+  OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>());<br>
<br>
-  if (test_info.value_param() != NULL) {<br>
-    OutputXmlAttribute(stream, kTestcase, "value_param",<br>
+  if (test_info.value_param() != nullptr) {<br>
+    OutputXmlAttribute(stream, kTestsuite, "value_param",<br>
                        test_info.value_param());<br>
   }<br>
-  if (test_info.type_param() != NULL) {<br>
-    OutputXmlAttribute(stream, kTestcase, "type_param", test_info.type_param());<br>
+  if (test_info.type_param() != nullptr) {<br>
+    OutputXmlAttribute(stream, kTestsuite, "type_param",<br>
+                       test_info.type_param());<br>
   }<br>
   if (GTEST_FLAG(list_tests)) {<br>
-    OutputXmlAttribute(stream, kTestcase, "file", test_info.file());<br>
-    OutputXmlAttribute(stream, kTestcase, "line",<br>
+    OutputXmlAttribute(stream, kTestsuite, "file", test_info.file());<br>
+    OutputXmlAttribute(stream, kTestsuite, "line",<br>
                        StreamableToString(test_info.line()));<br>
     *stream << " />\n";<br>
     return;<br>
   }<br>
<br>
-  OutputXmlAttribute(stream, kTestcase, "status",<br>
+  OutputXmlAttribute(stream, kTestsuite, "status",<br>
                      test_info.should_run() ? "run" : "notrun");<br>
-  OutputXmlAttribute(stream, kTestcase, "time",<br>
+  OutputXmlAttribute(stream, kTestsuite, "result",<br>
+                     test_info.should_run()<br>
+                         ? (result.Skipped() ? "skipped" : "completed")<br>
+                         : "suppressed");<br>
+  OutputXmlAttribute(stream, kTestsuite, "time",<br>
                      FormatTimeInMillisAsSeconds(result.elapsed_time()));<br>
-  OutputXmlAttribute(stream, kTestcase, "classname", test_case_name);<br>
+  OutputXmlAttribute(<br>
+      stream, kTestsuite, "timestamp",<br>
+      FormatEpochTimeInMillisAsIso8601(result.start_timestamp()));<br>
+  OutputXmlAttribute(stream, kTestsuite, "classname", test_suite_name);<br>
<br>
   int failures = 0;<br>
   for (int i = 0; i < result.total_part_count(); ++i) {<br>
@@ -3751,29 +3852,32 @@ void XmlUnitTestResultPrinter::OutputXmlTestInfo(::std::ostream* stream,<br>
   }<br>
 }<br>
<br>
-// Prints an XML representation of a TestCase object<br>
-void XmlUnitTestResultPrinter::PrintXmlTestCase(std::ostream* stream,<br>
-                                                const TestCase& test_case) {<br>
+// Prints an XML representation of a TestSuite object<br>
+void XmlUnitTestResultPrinter::PrintXmlTestSuite(std::ostream* stream,<br>
+                                                 const TestSuite& test_suite) {<br>
   const std::string kTestsuite = "testsuite";<br>
   *stream << "  <" << kTestsuite;<br>
-  OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>());<br>
+  OutputXmlAttribute(stream, kTestsuite, "name", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>());<br>
   OutputXmlAttribute(stream, kTestsuite, "tests",<br>
-                     StreamableToString(test_case.reportable_test_count()));<br>
+                     StreamableToString(test_suite.reportable_test_count()));<br>
   if (!GTEST_FLAG(list_tests)) {<br>
     OutputXmlAttribute(stream, kTestsuite, "failures",<br>
-                       StreamableToString(test_case.failed_test_count()));<br>
+                       StreamableToString(test_suite.failed_test_count()));<br>
     OutputXmlAttribute(<br>
         stream, kTestsuite, "disabled",<br>
-        StreamableToString(test_case.reportable_disabled_test_count()));<br>
+        StreamableToString(test_suite.reportable_disabled_test_count()));<br>
     OutputXmlAttribute(stream, kTestsuite, "errors", "0");<br>
     OutputXmlAttribute(stream, kTestsuite, "time",<br>
-                       FormatTimeInMillisAsSeconds(test_case.elapsed_time()));<br>
-    *stream << TestPropertiesAsXmlAttributes(test_case.ad_hoc_test_result());<br>
+                       FormatTimeInMillisAsSeconds(test_suite.elapsed_time()));<br>
+    OutputXmlAttribute(<br>
+        stream, kTestsuite, "timestamp",<br>
+        FormatEpochTimeInMillisAsIso8601(test_suite.start_timestamp()));<br>
+    *stream << TestPropertiesAsXmlAttributes(test_suite.ad_hoc_test_result());<br>
   }<br>
   *stream << ">\n";<br>
-  for (int i = 0; i < test_case.total_test_count(); ++i) {<br>
-    if (test_case.GetTestInfo(i)->is_reportable())<br>
-      OutputXmlTestInfo(stream, <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), *test_case.GetTestInfo(i));<br>
+  for (int i = 0; i < test_suite.total_test_count(); ++i) {<br>
+    if (test_suite.GetTestInfo(i)->is_reportable())<br>
+      OutputXmlTestInfo(stream, <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), *test_suite.GetTestInfo(i));<br>
   }<br>
   *stream << "  </" << kTestsuite << ">\n";<br>
 }<br>
@@ -3794,11 +3898,11 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,<br>
       stream, kTestsuites, "disabled",<br>
       StreamableToString(unit_test.reportable_disabled_test_count()));<br>
   OutputXmlAttribute(stream, kTestsuites, "errors", "0");<br>
+  OutputXmlAttribute(stream, kTestsuites, "time",<br>
+                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));<br>
   OutputXmlAttribute(<br>
       stream, kTestsuites, "timestamp",<br>
       FormatEpochTimeInMillisAsIso8601(unit_test.start_timestamp()));<br>
-  OutputXmlAttribute(stream, kTestsuites, "time",<br>
-                     FormatTimeInMillisAsSeconds(unit_test.elapsed_time()));<br>
<br>
   if (GTEST_FLAG(shuffle)) {<br>
     OutputXmlAttribute(stream, kTestsuites, "random_seed",<br>
@@ -3809,31 +3913,31 @@ void XmlUnitTestResultPrinter::PrintXmlUnitTest(std::ostream* stream,<br>
   OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");<br>
   *stream << ">\n";<br>
<br>
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
-    if (unit_test.GetTestCase(i)->reportable_test_count() > 0)<br>
-      PrintXmlTestCase(stream, *unit_test.GetTestCase(i));<br>
+  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+    if (unit_test.GetTestSuite(i)->reportable_test_count() > 0)<br>
+      PrintXmlTestSuite(stream, *unit_test.GetTestSuite(i));<br>
   }<br>
   *stream << "</" << kTestsuites << ">\n";<br>
 }<br>
<br>
 void XmlUnitTestResultPrinter::PrintXmlTestsList(<br>
-    std::ostream* stream, const std::vector<TestCase*>& test_cases) {<br>
+    std::ostream* stream, const std::vector<TestSuite*>& test_suites) {<br>
   const std::string kTestsuites = "testsuites";<br>
<br>
   *stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";<br>
   *stream << "<" << kTestsuites;<br>
<br>
   int total_tests = 0;<br>
-  for (size_t i = 0; i < test_cases.size(); ++i) {<br>
-    total_tests += test_cases[i]->total_test_count();<br>
+  for (auto test_suite : test_suites) {<br>
+    total_tests += test_suite->total_test_count();<br>
   }<br>
   OutputXmlAttribute(stream, kTestsuites, "tests",<br>
                      StreamableToString(total_tests));<br>
   OutputXmlAttribute(stream, kTestsuites, "name", "AllTests");<br>
   *stream << ">\n";<br>
<br>
-  for (size_t i = 0; i < test_cases.size(); ++i) {<br>
-    PrintXmlTestCase(stream, *test_cases[i]);<br>
+  for (auto test_suite : test_suites) {<br>
+    PrintXmlTestSuite(stream, *test_suite);<br>
   }<br>
   *stream << "</" << kTestsuites << ">\n";<br>
 }<br>
@@ -3878,11 +3982,11 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {<br>
  public:<br>
   explicit JsonUnitTestResultPrinter(const char* output_file);<br>
<br>
-  virtual void OnTestIterationEnd(const UnitTest& unit_test, int iteration);<br>
+  void OnTestIterationEnd(const UnitTest& unit_test, int iteration) override;<br>
<br>
   // Prints an JSON summary of all unit tests.<br>
   static void PrintJsonTestList(::std::ostream* stream,<br>
-                                const std::vector<TestCase*>& test_cases);<br>
+                                const std::vector<TestSuite*>& test_suites);<br>
<br>
  private:<br>
   // Returns an JSON-escaped copy of the input string str.<br>
@@ -3905,12 +4009,12 @@ class JsonUnitTestResultPrinter : public EmptyTestEventListener {<br>
<br>
   // Streams a JSON representation of a TestInfo object.<br>
   static void OutputJsonTestInfo(::std::ostream* stream,<br>
-                                 const char* test_case_name,<br>
+                                 const char* test_suite_name,<br>
                                  const TestInfo& test_info);<br>
<br>
-  // Prints a JSON representation of a TestCase object<br>
-  static void PrintJsonTestCase(::std::ostream* stream,<br>
-                                const TestCase& test_case);<br>
+  // Prints a JSON representation of a TestSuite object<br>
+  static void PrintJsonTestSuite(::std::ostream* stream,<br>
+                                 const TestSuite& test_suite);<br>
<br>
   // Prints a JSON summary of unit_test to output stream out.<br>
   static void PrintJsonUnitTest(::std::ostream* stream,<br>
@@ -4009,7 +4113,7 @@ static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {<br>
       String::FormatIntWidth2(time_struct.tm_sec) + "Z";<br>
 }<br>
<br>
-static inline std::string Indent(int width) {<br>
+static inline std::string Indent(size_t width) {<br>
   return std::string(width, ' ');<br>
 }<br>
<br>
@@ -4021,7 +4125,7 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
     const std::string& indent,<br>
     bool comma) {<br>
   const std::vector<std::string>& allowed_names =<br>
-      GetReservedAttributesForElement(element_name);<br>
+      GetReservedOutputAttributesForElement(element_name);<br>
<br>
   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
                    allowed_names.end())<br>
@@ -4041,7 +4145,7 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
     const std::string& indent,<br>
     bool comma) {<br>
   const std::vector<std::string>& allowed_names =<br>
-      GetReservedAttributesForElement(element_name);<br>
+      GetReservedOutputAttributesForElement(element_name);<br>
<br>
   GTEST_CHECK_(std::find(allowed_names.begin(), allowed_names.end(), name) !=<br>
                    allowed_names.end())<br>
@@ -4055,35 +4159,44 @@ void JsonUnitTestResultPrinter::OutputJsonKey(<br>
<br>
 // Prints a JSON representation of a TestInfo object.<br>
 void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,<br>
-                                                   const char* test_case_name,<br>
+                                                   const char* test_suite_name,<br>
                                                    const TestInfo& test_info) {<br>
   const TestResult& result = *test_info.result();<br>
-  const std::string kTestcase = "testcase";<br>
+  const std::string kTestsuite = "testcase";<br>
   const std::string kIndent = Indent(10);<br>
<br>
   *stream << Indent(8) << "{\n";<br>
-  OutputJsonKey(stream, kTestcase, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>(), kIndent);<br>
+  OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_info.name" rel="noreferrer" target="_blank">test_info.name</a>(), kIndent);<br>
<br>
-  if (test_info.value_param() != NULL) {<br>
-    OutputJsonKey(stream, kTestcase, "value_param",<br>
-                  test_info.value_param(), kIndent);<br>
+  if (test_info.value_param() != nullptr) {<br>
+    OutputJsonKey(stream, kTestsuite, "value_param", test_info.value_param(),<br>
+                  kIndent);<br>
   }<br>
-  if (test_info.type_param() != NULL) {<br>
-    OutputJsonKey(stream, kTestcase, "type_param", test_info.type_param(),<br>
+  if (test_info.type_param() != nullptr) {<br>
+    OutputJsonKey(stream, kTestsuite, "type_param", test_info.type_param(),<br>
                   kIndent);<br>
   }<br>
   if (GTEST_FLAG(list_tests)) {<br>
-    OutputJsonKey(stream, kTestcase, "file", test_info.file(), kIndent);<br>
-    OutputJsonKey(stream, kTestcase, "line", test_info.line(), kIndent, false);<br>
+    OutputJsonKey(stream, kTestsuite, "file", test_info.file(), kIndent);<br>
+    OutputJsonKey(stream, kTestsuite, "line", test_info.line(), kIndent, false);<br>
     *stream << "\n" << Indent(8) << "}";<br>
     return;<br>
   }<br>
<br>
-  OutputJsonKey(stream, kTestcase, "status",<br>
+  OutputJsonKey(stream, kTestsuite, "status",<br>
                 test_info.should_run() ? "RUN" : "NOTRUN", kIndent);<br>
-  OutputJsonKey(stream, kTestcase, "time",<br>
+  OutputJsonKey(stream, kTestsuite, "result",<br>
+                test_info.should_run()<br>
+                    ? (result.Skipped() ? "SKIPPED" : "COMPLETED")<br>
+                    : "SUPPRESSED",<br>
+                kIndent);<br>
+  OutputJsonKey(stream, kTestsuite, "timestamp",<br>
+                FormatEpochTimeInMillisAsRFC3339(result.start_timestamp()),<br>
+                kIndent);<br>
+  OutputJsonKey(stream, kTestsuite, "time",<br>
                 FormatTimeInMillisAsDuration(result.elapsed_time()), kIndent);<br>
-  OutputJsonKey(stream, kTestcase, "classname", test_case_name, kIndent, false);<br>
+  OutputJsonKey(stream, kTestsuite, "classname", test_suite_name, kIndent,<br>
+                false);<br>
   *stream << TestPropertiesAsJson(result, kIndent);<br>
<br>
   int failures = 0;<br>
@@ -4110,40 +4223,44 @@ void JsonUnitTestResultPrinter::OutputJsonTestInfo(::std::ostream* stream,<br>
   *stream << "\n" << Indent(8) << "}";<br>
 }<br>
<br>
-// Prints an JSON representation of a TestCase object<br>
-void JsonUnitTestResultPrinter::PrintJsonTestCase(std::ostream* stream,<br>
-                                                  const TestCase& test_case) {<br>
+// Prints an JSON representation of a TestSuite object<br>
+void JsonUnitTestResultPrinter::PrintJsonTestSuite(<br>
+    std::ostream* stream, const TestSuite& test_suite) {<br>
   const std::string kTestsuite = "testsuite";<br>
   const std::string kIndent = Indent(6);<br>
<br>
   *stream << Indent(4) << "{\n";<br>
-  OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), kIndent);<br>
-  OutputJsonKey(stream, kTestsuite, "tests", test_case.reportable_test_count(),<br>
+  OutputJsonKey(stream, kTestsuite, "name", <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), kIndent);<br>
+  OutputJsonKey(stream, kTestsuite, "tests", test_suite.reportable_test_count(),<br>
                 kIndent);<br>
   if (!GTEST_FLAG(list_tests)) {<br>
-    OutputJsonKey(stream, kTestsuite, "failures", test_case.failed_test_count(),<br>
-                  kIndent);<br>
+    OutputJsonKey(stream, kTestsuite, "failures",<br>
+                  test_suite.failed_test_count(), kIndent);<br>
     OutputJsonKey(stream, kTestsuite, "disabled",<br>
-                  test_case.reportable_disabled_test_count(), kIndent);<br>
+                  test_suite.reportable_disabled_test_count(), kIndent);<br>
     OutputJsonKey(stream, kTestsuite, "errors", 0, kIndent);<br>
+    OutputJsonKey(<br>
+        stream, kTestsuite, "timestamp",<br>
+        FormatEpochTimeInMillisAsRFC3339(test_suite.start_timestamp()),<br>
+        kIndent);<br>
     OutputJsonKey(stream, kTestsuite, "time",<br>
-                  FormatTimeInMillisAsDuration(test_case.elapsed_time()),<br>
+                  FormatTimeInMillisAsDuration(test_suite.elapsed_time()),<br>
                   kIndent, false);<br>
-    *stream << TestPropertiesAsJson(test_case.ad_hoc_test_result(), kIndent)<br>
+    *stream << TestPropertiesAsJson(test_suite.ad_hoc_test_result(), kIndent)<br>
             << ",\n";<br>
   }<br>
<br>
   *stream << kIndent << "\"" << kTestsuite << "\": [\n";<br>
<br>
   bool comma = false;<br>
-  for (int i = 0; i < test_case.total_test_count(); ++i) {<br>
-    if (test_case.GetTestInfo(i)->is_reportable()) {<br>
+  for (int i = 0; i < test_suite.total_test_count(); ++i) {<br>
+    if (test_suite.GetTestInfo(i)->is_reportable()) {<br>
       if (comma) {<br>
         *stream << ",\n";<br>
       } else {<br>
         comma = true;<br>
       }<br>
-      OutputJsonTestInfo(stream, <a href="http://test_case.name" rel="noreferrer" target="_blank">test_case.name</a>(), *test_case.GetTestInfo(i));<br>
+      OutputJsonTestInfo(stream, <a href="http://test_suite.name" rel="noreferrer" target="_blank">test_suite.name</a>(), *test_suite.GetTestInfo(i));<br>
     }<br>
   }<br>
   *stream << "\n" << kIndent << "]\n" << Indent(4) << "}";<br>
@@ -4181,14 +4298,14 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,<br>
   *stream << kIndent << "\"" << kTestsuites << "\": [\n";<br>
<br>
   bool comma = false;<br>
-  for (int i = 0; i < unit_test.total_test_case_count(); ++i) {<br>
-    if (unit_test.GetTestCase(i)->reportable_test_count() > 0) {<br>
+  for (int i = 0; i < unit_test.total_test_suite_count(); ++i) {<br>
+    if (unit_test.GetTestSuite(i)->reportable_test_count() > 0) {<br>
       if (comma) {<br>
         *stream << ",\n";<br>
       } else {<br>
         comma = true;<br>
       }<br>
-      PrintJsonTestCase(stream, *unit_test.GetTestCase(i));<br>
+      PrintJsonTestSuite(stream, *unit_test.GetTestSuite(i));<br>
     }<br>
   }<br>
<br>
@@ -4196,24 +4313,24 @@ void JsonUnitTestResultPrinter::PrintJsonUnitTest(std::ostream* stream,<br>
 }<br>
<br>
 void JsonUnitTestResultPrinter::PrintJsonTestList(<br>
-    std::ostream* stream, const std::vector<TestCase*>& test_cases) {<br>
+    std::ostream* stream, const std::vector<TestSuite*>& test_suites) {<br>
   const std::string kTestsuites = "testsuites";<br>
   const std::string kIndent = Indent(2);<br>
   *stream << "{\n";<br>
   int total_tests = 0;<br>
-  for (size_t i = 0; i < test_cases.size(); ++i) {<br>
-    total_tests += test_cases[i]->total_test_count();<br>
+  for (auto test_suite : test_suites) {<br>
+    total_tests += test_suite->total_test_count();<br>
   }<br>
   OutputJsonKey(stream, kTestsuites, "tests", total_tests, kIndent);<br>
<br>
   OutputJsonKey(stream, kTestsuites, "name", "AllTests", kIndent);<br>
   *stream << kIndent << "\"" << kTestsuites << "\": [\n";<br>
<br>
-  for (size_t i = 0; i < test_cases.size(); ++i) {<br>
+  for (size_t i = 0; i < test_suites.size(); ++i) {<br>
     if (i != 0) {<br>
       *stream << ",\n";<br>
     }<br>
-    PrintJsonTestCase(stream, *test_cases[i]);<br>
+    PrintJsonTestSuite(stream, *test_suites[i]);<br>
   }<br>
<br>
   *stream << "\n"<br>
@@ -4269,7 +4386,7 @@ void StreamingListener::SocketWriter::MakeConnection() {<br>
   memset(&hints, 0, sizeof(hints));<br>
   hints.ai_family = AF_UNSPEC;    // To allow both IPv4 and IPv6 addresses.<br>
   hints.ai_socktype = SOCK_STREAM;<br>
-  addrinfo* servinfo = NULL;<br>
+  addrinfo* servinfo = nullptr;<br>
<br>
   // Use the getaddrinfo() to get a linked list of IP addresses for<br>
   // the given host name.<br>
@@ -4281,7 +4398,7 @@ void StreamingListener::SocketWriter::MakeConnection() {<br>
   }<br>
<br>
   // Loop through all the results and connect to the first we can.<br>
-  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != NULL;<br>
+  for (addrinfo* cur_addr = servinfo; sockfd_ == -1 && cur_addr != nullptr;<br>
        cur_addr = cur_addr->ai_next) {<br>
     sockfd_ = socket(<br>
         cur_addr->ai_family, cur_addr->ai_socktype, cur_addr->ai_protocol);<br>
@@ -4413,9 +4530,8 @@ class ScopedPrematureExitFile {<br>
<br>
 TestEventListeners::TestEventListeners()<br>
     : repeater_(new internal::TestEventRepeater()),<br>
-      default_result_printer_(NULL),<br>
-      default_xml_generator_(NULL) {<br>
-}<br>
+      default_result_printer_(nullptr),<br>
+      default_xml_generator_(nullptr) {}<br>
<br>
 TestEventListeners::~TestEventListeners() { delete repeater_; }<br>
<br>
@@ -4432,9 +4548,9 @@ void TestEventListeners::Append(TestEventListener* listener) {<br>
 // NULL if the listener is not found in the list.<br>
 TestEventListener* TestEventListeners::Release(TestEventListener* listener) {<br>
   if (listener == default_result_printer_)<br>
-    default_result_printer_ = NULL;<br>
+    default_result_printer_ = nullptr;<br>
   else if (listener == default_xml_generator_)<br>
-    default_xml_generator_ = NULL;<br>
+    default_xml_generator_ = nullptr;<br>
   return repeater_->Release(listener);<br>
 }<br>
<br>
@@ -4453,8 +4569,7 @@ void TestEventListeners::SetDefaultResultPrinter(TestEventListener* listener) {<br>
     // list.<br>
     delete Release(default_result_printer_);<br>
     default_result_printer_ = listener;<br>
-    if (listener != NULL)<br>
-      Append(listener);<br>
+    if (listener != nullptr) Append(listener);<br>
   }<br>
 }<br>
<br>
@@ -4469,8 +4584,7 @@ void TestEventListeners::SetDefaultXmlGenerator(TestEventListener* listener) {<br>
     // list.<br>
     delete Release(default_xml_generator_);<br>
     default_xml_generator_ = listener;<br>
-    if (listener != NULL)<br>
-      Append(listener);<br>
+    if (listener != nullptr) Append(listener);<br>
   }<br>
 }<br>
<br>
@@ -4494,52 +4608,66 @@ void TestEventListeners::SuppressEventForwarding() {<br>
 // call this before main() starts, from which point on the return<br>
 // value will never change.<br>
 UnitTest* UnitTest::GetInstance() {<br>
-  // When compiled with MSVC 7.1 in optimized mode, destroying the<br>
-  // UnitTest object upon exiting the program messes up the exit code,<br>
-  // causing successful tests to appear failed.  We have to use a<br>
-  // <br>
diff erent implementation in this case to bypass the compiler bug.<br>
-  // This implementation makes the compiler happy, at the cost of<br>
-  // leaking the UnitTest object.<br>
-<br>
   // CodeGear C++Builder insists on a public destructor for the<br>
   // default implementation.  Use this implementation to keep good OO<br>
   // design with private destructor.<br>
<br>
-#if (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)<br>
+#if defined(__BORLANDC__)<br>
   static UnitTest* const instance = new UnitTest;<br>
   return instance;<br>
 #else<br>
   static UnitTest instance;<br>
   return &instance;<br>
-#endif  // (_MSC_VER == 1310 && !defined(_DEBUG)) || defined(__BORLANDC__)<br>
+#endif  // defined(__BORLANDC__)<br>
 }<br>
<br>
-// Gets the number of successful test cases.<br>
-int UnitTest::successful_test_case_count() const {<br>
-  return impl()->successful_test_case_count();<br>
+// Gets the number of successful test suites.<br>
+int UnitTest::successful_test_suite_count() const {<br>
+  return impl()->successful_test_suite_count();<br>
 }<br>
<br>
-// Gets the number of failed test cases.<br>
-int UnitTest::failed_test_case_count() const {<br>
-  return impl()->failed_test_case_count();<br>
+// Gets the number of failed test suites.<br>
+int UnitTest::failed_test_suite_count() const {<br>
+  return impl()->failed_test_suite_count();<br>
 }<br>
<br>
-// Gets the number of all test cases.<br>
-int UnitTest::total_test_case_count() const {<br>
-  return impl()->total_test_case_count();<br>
+// Gets the number of all test suites.<br>
+int UnitTest::total_test_suite_count() const {<br>
+  return impl()->total_test_suite_count();<br>
 }<br>
<br>
-// Gets the number of all test cases that contain at least one test<br>
+// Gets the number of all test suites that contain at least one test<br>
 // that should run.<br>
+int UnitTest::test_suite_to_run_count() const {<br>
+  return impl()->test_suite_to_run_count();<br>
+}<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
+int UnitTest::successful_test_case_count() const {<br>
+  return impl()->successful_test_suite_count();<br>
+}<br>
+int UnitTest::failed_test_case_count() const {<br>
+  return impl()->failed_test_suite_count();<br>
+}<br>
+int UnitTest::total_test_case_count() const {<br>
+  return impl()->total_test_suite_count();<br>
+}<br>
 int UnitTest::test_case_to_run_count() const {<br>
-  return impl()->test_case_to_run_count();<br>
+  return impl()->test_suite_to_run_count();<br>
 }<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 // Gets the number of successful tests.<br>
 int UnitTest::successful_test_count() const {<br>
   return impl()->successful_test_count();<br>
 }<br>
<br>
+// Gets the number of skipped tests.<br>
+int UnitTest::skipped_test_count() const {<br>
+  return impl()->skipped_test_count();<br>
+}<br>
+<br>
 // Gets the number of failed tests.<br>
 int UnitTest::failed_test_count() const { return impl()->failed_test_count(); }<br>
<br>
@@ -4575,29 +4703,37 @@ internal::TimeInMillis UnitTest::elapsed_time() const {<br>
   return impl()->elapsed_time();<br>
 }<br>
<br>
-// Returns true iff the unit test passed (i.e. all test cases passed).<br>
+// Returns true if and only if the unit test passed (i.e. all test suites<br>
+// passed).<br>
 bool UnitTest::Passed() const { return impl()->Passed(); }<br>
<br>
-// Returns true iff the unit test failed (i.e. some test case failed<br>
-// or something outside of all tests failed).<br>
+// Returns true if and only if the unit test failed (i.e. some test suite<br>
+// failed or something outside of all tests failed).<br>
 bool UnitTest::Failed() const { return impl()->Failed(); }<br>
<br>
-// Gets the i-th test case among all the test cases. i can range from 0 to<br>
-// total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
+// Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+// total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+const TestSuite* UnitTest::GetTestSuite(int i) const {<br>
+  return impl()->GetTestSuite(i);<br>
+}<br>
+<br>
+//  Legacy API is deprecated but still available<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
 const TestCase* UnitTest::GetTestCase(int i) const {<br>
   return impl()->GetTestCase(i);<br>
 }<br>
+#endif  //  GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
<br>
 // Returns the TestResult containing information on test failures and<br>
-// properties logged outside of individual test cases.<br>
+// properties logged outside of individual test suites.<br>
 const TestResult& UnitTest::ad_hoc_test_result() const {<br>
   return *impl()->ad_hoc_test_result();<br>
 }<br>
<br>
-// Gets the i-th test case among all the test cases. i can range from 0 to<br>
-// total_test_case_count() - 1. If i is not in that range, returns NULL.<br>
-TestCase* UnitTest::GetMutableTestCase(int i) {<br>
-  return impl()->GetMutableTestCase(i);<br>
+// Gets the i-th test suite among all the test suites. i can range from 0 to<br>
+// total_test_suite_count() - 1. If i is not in that range, returns NULL.<br>
+TestSuite* UnitTest::GetMutableTestSuite(int i) {<br>
+  return impl()->GetMutableSuiteCase(i);<br>
 }<br>
<br>
 // Returns the list of event listeners that can be used to track events<br>
@@ -4617,8 +4753,8 @@ TestEventListeners& UnitTest::listeners() {<br>
 // We don't protect this under mutex_, as we only support calling it<br>
 // from the main thread.<br>
 Environment* UnitTest::AddEnvironment(Environment* env) {<br>
-  if (env == NULL) {<br>
-    return NULL;<br>
+  if (env == nullptr) {<br>
+    return nullptr;<br>
   }<br>
<br>
   impl_->environments().push_back(env);<br>
@@ -4642,25 +4778,24 @@ void UnitTest::AddTestPartResult(<br>
   if (impl_->gtest_trace_stack().size() > 0) {<br>
     msg << "\n" << GTEST_NAME_ << " trace:";<br>
<br>
-    for (int i = static_cast<int>(impl_->gtest_trace_stack().size());<br>
-         i > 0; --i) {<br>
+    for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {<br>
       const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];<br>
       msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)<br>
           << " " << trace.message;<br>
     }<br>
   }<br>
<br>
-  if (os_stack_trace.c_str() != NULL && !os_stack_trace.empty()) {<br>
+  if (os_stack_trace.c_str() != nullptr && !os_stack_trace.empty()) {<br>
     msg << internal::kStackTraceMarker << os_stack_trace;<br>
   }<br>
<br>
-  const TestPartResult result =<br>
-    TestPartResult(result_type, file_name, line_number,<br>
-                   msg.GetString().c_str());<br>
+  const TestPartResult result = TestPartResult(<br>
+      result_type, file_name, line_number, msg.GetString().c_str());<br>
   impl_->GetTestPartResultReporterForCurrentThread()-><br>
       ReportTestPartResult(result);<br>
<br>
-  if (result_type != TestPartResult::kSuccess) {<br>
+  if (result_type != TestPartResult::kSuccess &&<br>
+      result_type != TestPartResult::kSkip) {<br>
     // gtest_break_on_failure takes precedence over<br>
     // gtest_throw_on_failure.  This allows a user to set the latter<br>
     // in the code (perhaps in order to use Google Test assertions<br>
@@ -4678,11 +4813,10 @@ void UnitTest::AddTestPartResult(<br>
       // with clang/gcc we can achieve the same effect on x86 by invoking int3<br>
       asm("int3");<br>
 #else<br>
-      // Dereference NULL through a volatile pointer to prevent the compiler<br>
+      // Dereference nullptr through a volatile pointer to prevent the compiler<br>
       // from removing. We use this rather than abort() or __builtin_trap() for<br>
-      // portability: Symbian doesn't implement abort() well, and some debuggers<br>
-      // don't correctly trap abort().<br>
-      *static_cast<volatile int*>(NULL) = 1;<br>
+      // portability: some debuggers don't correctly trap abort().<br>
+      *static_cast<volatile int*>(nullptr) = 1;<br>
 #endif  // GTEST_OS_WINDOWS<br>
     } else if (GTEST_FLAG(throw_on_failure)) {<br>
 #if GTEST_HAS_EXCEPTIONS<br>
@@ -4697,8 +4831,8 @@ void UnitTest::AddTestPartResult(<br>
 }<br>
<br>
 // Adds a TestProperty to the current TestResult object when invoked from<br>
-// inside a test, to current TestCase's ad_hoc_test_result_ when invoked<br>
-// from SetUpTestCase or TearDownTestCase, or to the global property set<br>
+// inside a test, to current TestSuite's ad_hoc_test_result_ when invoked<br>
+// from SetUpTestSuite or TearDownTestSuite, or to the global property set<br>
 // when invoked elsewhere.  If the result already contains a property with<br>
 // the same key, the value will be updated.<br>
 void UnitTest::RecordProperty(const std::string& key,<br>
@@ -4737,8 +4871,9 @@ int UnitTest::Run() {<br>
   // that understands the premature-exit-file protocol to report the<br>
   // test as having failed.<br>
   const internal::ScopedPrematureExitFile premature_exit_file(<br>
-      in_death_test_child_process ?<br>
-      NULL : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));<br>
+      in_death_test_child_process<br>
+          ? nullptr<br>
+          : internal::posix::GetEnv("TEST_PREMATURE_EXIT_FILE"));<br>
<br>
   // Captures the value of GTEST_FLAG(catch_exceptions).  This value will be<br>
   // used for the duration of the program.<br>
@@ -4763,23 +4898,27 @@ int UnitTest::Run() {<br>
     _set_error_mode(_OUT_TO_STDERR);<br>
 # endif<br>
<br>
-# if _MSC_VER >= 1400 && !GTEST_OS_WINDOWS_MOBILE<br>
+# if defined(_MSC_VER) && !GTEST_OS_WINDOWS_MOBILE<br>
     // In the debug version, Visual Studio pops up a separate dialog<br>
     // offering a choice to debug the aborted program. We need to suppress<br>
     // this dialog or it will pop up for every EXPECT/ASSERT_DEATH statement<br>
     // executed. Google Test will notify the user of any unexpected<br>
     // failure via stderr.<br>
-    //<br>
-    // VC++ doesn't define _set_abort_behavior() prior to the version 8.0.<br>
-    // Users of prior VC versions shall suffer the agony and pain of<br>
-    // clicking through the countless debug dialogs.<br>
-    // FIXME: find a way to suppress the abort dialog() in the<br>
-    // debug mode when compiled with VC 7.1 or lower.<br>
     if (!GTEST_FLAG(break_on_failure))<br>
       _set_abort_behavior(<br>
           0x0,                                    // Clear the following flags:<br>
           _WRITE_ABORT_MSG | _CALL_REPORTFAULT);  // pop-up window, core dump.<br>
 # endif<br>
+<br>
+    // In debug mode, the Windows CRT can crash with an assertion over invalid<br>
+    // input (e.g. passing an invalid file descriptor).  The default handling<br>
+    // for these assertions is to pop up a dialog and wait for user input.<br>
+    // Instead ask the CRT to dump such assertions to stderr non-interactively.<br>
+    if (!IsDebuggerPresent()) {<br>
+      (void)_CrtSetReportMode(_CRT_ASSERT,<br>
+                              _CRTDBG_MODE_FILE | _CRTDBG_MODE_DEBUG);<br>
+      (void)_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDERR);<br>
+    }<br>
   }<br>
 #endif  // GTEST_OS_WINDOWS<br>
<br>
@@ -4795,13 +4934,22 @@ const char* UnitTest::original_working_dir() const {<br>
   return impl_->original_working_dir_.c_str();<br>
 }<br>
<br>
-// Returns the TestCase object for the test that's currently running,<br>
+// Returns the TestSuite object for the test that's currently running,<br>
 // or NULL if no test is running.<br>
+const TestSuite* UnitTest::current_test_suite() const<br>
+    GTEST_LOCK_EXCLUDED_(mutex_) {<br>
+  internal::MutexLock lock(&mutex_);<br>
+  return impl_->current_test_suite();<br>
+}<br>
+<br>
+// Legacy API is still available but deprecated<br>
+#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_<br>
 const TestCase* UnitTest::current_test_case() const<br>
     GTEST_LOCK_EXCLUDED_(mutex_) {<br>
   internal::MutexLock lock(&mutex_);<br>
-  return impl_->current_test_case();<br>
+  return impl_->current_test_suite();<br>
 }<br>
+#endif<br>
<br>
 // Returns the TestInfo object for the test that's currently running,<br>
 // or NULL if no test is running.<br>
@@ -4814,11 +4962,10 @@ const TestInfo* UnitTest::current_test_info() const<br>
 // Returns the random seed used at the start of the current test run.<br>
 int UnitTest::random_seed() const { return impl_->random_seed(); }<br>
<br>
-// Returns ParameterizedTestCaseRegistry object used to keep track of<br>
+// Returns ParameterizedTestSuiteRegistry object used to keep track of<br>
 // value-parameterized tests and instantiate and register them.<br>
-internal::ParameterizedTestCaseRegistry&<br>
-    UnitTest::parameterized_test_registry()<br>
-        GTEST_LOCK_EXCLUDED_(mutex_) {<br>
+internal::ParameterizedTestSuiteRegistry&<br>
+UnitTest::parameterized_test_registry() GTEST_LOCK_EXCLUDED_(mutex_) {<br>
   return impl_->parameterized_test_registry();<br>
 }<br>
<br>
@@ -4852,23 +4999,22 @@ namespace internal {<br>
 UnitTestImpl::UnitTestImpl(UnitTest* parent)<br>
     : parent_(parent),<br>
       GTEST_DISABLE_MSC_WARNINGS_PUSH_(4355 /* using this in initializer */)<br>
-      default_global_test_part_result_reporter_(this),<br>
+          default_global_test_part_result_reporter_(this),<br>
       default_per_thread_test_part_result_reporter_(this),<br>
-      GTEST_DISABLE_MSC_WARNINGS_POP_()<br>
-      global_test_part_result_repoter_(<br>
+      GTEST_DISABLE_MSC_WARNINGS_POP_() global_test_part_result_repoter_(<br>
           &default_global_test_part_result_reporter_),<br>
       per_thread_test_part_result_reporter_(<br>
           &default_per_thread_test_part_result_reporter_),<br>
       parameterized_test_registry_(),<br>
       parameterized_tests_registered_(false),<br>
-      last_death_test_case_(-1),<br>
-      current_test_case_(NULL),<br>
-      current_test_info_(NULL),<br>
+      last_death_test_suite_(-1),<br>
+      current_test_suite_(nullptr),<br>
+      current_test_info_(nullptr),<br>
       ad_hoc_test_result_(),<br>
-      os_stack_trace_getter_(NULL),<br>
+      os_stack_trace_getter_(nullptr),<br>
       post_flag_parse_init_performed_(false),<br>
       random_seed_(0),  // Will be overridden by the flag before first use.<br>
-      random_(0),  // Will be reseeded before first use.<br>
+      random_(0),       // Will be reseeded before first use.<br>
       start_timestamp_(0),<br>
       elapsed_time_(0),<br>
 #if GTEST_HAS_DEATH_TEST<br>
@@ -4880,8 +5026,8 @@ UnitTestImpl::UnitTestImpl(UnitTest* parent)<br>
 }<br>
<br>
 UnitTestImpl::~UnitTestImpl() {<br>
-  // Deletes every TestCase.<br>
-  ForEach(test_cases_, internal::Delete<TestCase>);<br>
+  // Deletes every TestSuite.<br>
+  ForEach(test_suites_, internal::Delete<TestSuite>);<br>
<br>
   // Deletes every Environment.<br>
   ForEach(environments_, internal::Delete<Environment>);<br>
@@ -4890,20 +5036,20 @@ UnitTestImpl::~UnitTestImpl() {<br>
 }<br>
<br>
 // Adds a TestProperty to the current TestResult object when invoked in a<br>
-// context of a test, to current test case's ad_hoc_test_result when invoke<br>
-// from SetUpTestCase/TearDownTestCase, or to the global property set<br>
+// context of a test, to current test suite's ad_hoc_test_result when invoke<br>
+// from SetUpTestSuite/TearDownTestSuite, or to the global property set<br>
 // otherwise.  If the result already contains a property with the same key,<br>
 // the value will be updated.<br>
 void UnitTestImpl::RecordProperty(const TestProperty& test_property) {<br>
   std::string xml_element;<br>
   TestResult* test_result;  // TestResult appropriate for property recording.<br>
<br>
-  if (current_test_info_ != NULL) {<br>
+  if (current_test_info_ != nullptr) {<br>
     xml_element = "testcase";<br>
     test_result = &(current_test_info_->result_);<br>
-  } else if (current_test_case_ != NULL) {<br>
+  } else if (current_test_suite_ != nullptr) {<br>
     xml_element = "testsuite";<br>
-    test_result = &(current_test_case_->ad_hoc_test_result_);<br>
+    test_result = &(current_test_suite_->ad_hoc_test_result_);<br>
   } else {<br>
     xml_element = "testsuites";<br>
     test_result = &ad_hoc_test_result_;<br>
@@ -4915,7 +5061,7 @@ void UnitTestImpl::RecordProperty(const TestProperty& test_property) {<br>
 // Disables event forwarding if the control is currently in a death test<br>
 // subprocess. Must not be called before InitGoogleTest.<br>
 void UnitTestImpl::SuppressTestEventsIfInSubprocess() {<br>
-  if (internal_run_death_test_flag_.get() != NULL)<br>
+  if (internal_run_death_test_flag_.get() != nullptr)<br>
     listeners()->SuppressEventForwarding();<br>
 }<br>
 #endif  // GTEST_HAS_DEATH_TEST<br>
@@ -4997,74 +5143,73 @@ void UnitTestImpl::PostFlagParsingInit() {<br>
   }<br>
 }<br>
<br>
-// A predicate that checks the name of a TestCase against a known<br>
+// A predicate that checks the name of a TestSuite against a known<br>
 // value.<br>
 //<br>
 // This is used for implementation of the UnitTest class only.  We put<br>
 // it in the anonymous namespace to prevent polluting the outer<br>
 // namespace.<br>
 //<br>
-// TestCaseNameIs is copyable.<br>
-class TestCaseNameIs {<br>
+// TestSuiteNameIs is copyable.<br>
+class TestSuiteNameIs {<br>
  public:<br>
   // Constructor.<br>
-  explicit TestCaseNameIs(const std::string& name)<br>
-      : name_(name) {}<br>
+  explicit TestSuiteNameIs(const std::string& name) : name_(name) {}<br>
<br>
-  // Returns true iff the name of test_case matches name_.<br>
-  bool operator()(const TestCase* test_case) const {<br>
-    return test_case != NULL && strcmp(test_case->name(), name_.c_str()) == 0;<br>
+  // Returns true if and only if the name of test_suite matches name_.<br>
+  bool operator()(const TestSuite* test_suite) const {<br>
+    return test_suite != nullptr &&<br>
+           strcmp(test_suite->name(), name_.c_str()) == 0;<br>
   }<br>
<br>
  private:<br>
   std::string name_;<br>
 };<br>
<br>
-// Finds and returns a TestCase with the given name.  If one doesn't<br>
+// Finds and returns a TestSuite with the given name.  If one doesn't<br>
 // exist, creates one and returns it.  It's the CALLER'S<br>
 // RESPONSIBILITY to ensure that this function is only called WHEN THE<br>
 // TESTS ARE NOT SHUFFLED.<br>
 //<br>
 // Arguments:<br>
 //<br>
-//   test_case_name: name of the test case<br>
-//   type_param:     the name of the test case's type parameter, or NULL if<br>
-//                   this is not a typed or a type-parameterized test case.<br>
-//   set_up_tc:      pointer to the function that sets up the test case<br>
-//   tear_down_tc:   pointer to the function that tears down the test case<br>
-TestCase* UnitTestImpl::GetTestCase(const char* test_case_name,<br>
-                                    const char* type_param,<br>
-                                    Test::SetUpTestCaseFunc set_up_tc,<br>
-                                    Test::TearDownTestCaseFunc tear_down_tc) {<br>
-  // Can we find a TestCase with the given name?<br>
-  const std::vector<TestCase*>::const_reverse_iterator test_case =<br>
-      std::find_if(test_cases_.rbegin(), test_cases_.rend(),<br>
-                   TestCaseNameIs(test_case_name));<br>
-<br>
-  if (test_case != test_cases_.rend())<br>
-    return *test_case;<br>
+//   test_suite_name: name of the test suite<br>
+//   type_param:     the name of the test suite's type parameter, or NULL if<br>
+//                   this is not a typed or a type-parameterized test suite.<br>
+//   set_up_tc:      pointer to the function that sets up the test suite<br>
+//   tear_down_tc:   pointer to the function that tears down the test suite<br>
+TestSuite* UnitTestImpl::GetTestSuite(<br>
+    const char* test_suite_name, const char* type_param,<br>
+    internal::SetUpTestSuiteFunc set_up_tc,<br>
+    internal::TearDownTestSuiteFunc tear_down_tc) {<br>
+  // Can we find a TestSuite with the given name?<br>
+  const auto test_suite =<br>
+      std::find_if(test_suites_.rbegin(), test_suites_.rend(),<br>
+                   TestSuiteNameIs(test_suite_name));<br>
+<br>
+  if (test_suite != test_suites_.rend()) return *test_suite;<br>
<br>
   // No.  Let's create one.<br>
-  TestCase* const new_test_case =<br>
-      new TestCase(test_case_name, type_param, set_up_tc, tear_down_tc);<br>
-<br>
-  // Is this a death test case?<br>
-  if (internal::UnitTestOptions::MatchesFilter(test_case_name,<br>
-                                               kDeathTestCaseFilter)) {<br>
-    // Yes.  Inserts the test case after the last death test case<br>
-    // defined so far.  This only works when the test cases haven't<br>
+  auto* const new_test_suite =<br>
+      new TestSuite(test_suite_name, type_param, set_up_tc, tear_down_tc);<br>
+<br>
+  // Is this a death test suite?<br>
+  if (internal::UnitTestOptions::MatchesFilter(test_suite_name,<br>
+                                               kDeathTestSuiteFilter)) {<br>
+    // Yes.  Inserts the test suite after the last death test suite<br>
+    // defined so far.  This only works when the test suites haven't<br>
     // been shuffled.  Otherwise we may end up running a death test<br>
     // after a non-death test.<br>
-    ++last_death_test_case_;<br>
-    test_cases_.insert(test_cases_.begin() + last_death_test_case_,<br>
-                       new_test_case);<br>
+    ++last_death_test_suite_;<br>
+    test_suites_.insert(test_suites_.begin() + last_death_test_suite_,<br>
+                        new_test_suite);<br>
   } else {<br>
     // No.  Appends to the end of the list.<br>
-    test_cases_.push_back(new_test_case);<br>
+    test_suites_.push_back(new_test_suite);<br>
   }<br>
<br>
-  test_case_indices_.push_back(static_cast<int>(test_case_indices_.size()));<br>
-  return new_test_case;<br>
+  test_suite_indices_.push_back(static_cast<int>(test_suite_indices_.size()));<br>
+  return new_test_suite;<br>
 }<br>
<br>
 // Helpers for setting up / tearing down the given environment.  They<br>
@@ -5082,7 +5227,8 @@ static void TearDownEnvironment(Environment* env) { env->TearDown(); }<br>
 // All other functions called from RunAllTests() may safely assume that<br>
 // parameterized tests are ready to be counted and run.<br>
 bool UnitTestImpl::RunAllTests() {<br>
-  // True iff Google Test is initialized before RUN_ALL_TESTS() is called.<br>
+  // True if and only if Google Test is initialized before RUN_ALL_TESTS() is<br>
+  // called.<br>
   const bool gtest_is_initialized_before_run_all_tests = GTestIsInitialized();<br>
<br>
   // Do not run any test if the --help flag was specified.<br>
@@ -5098,12 +5244,13 @@ bool UnitTestImpl::RunAllTests() {<br>
   // protocol.<br>
   internal::WriteToShardStatusFileIfNeeded();<br>
<br>
-  // True iff we are in a subprocess for running a thread-safe-style<br>
+  // True if and only if we are in a subprocess for running a thread-safe-style<br>
   // death test.<br>
   bool in_subprocess_for_death_test = false;<br>
<br>
 #if GTEST_HAS_DEATH_TEST<br>
-  in_subprocess_for_death_test = (internal_run_death_test_flag_.get() != NULL);<br>
+  in_subprocess_for_death_test =<br>
+      (internal_run_death_test_flag_.get() != nullptr);<br>
 # if defined(GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_)<br>
   if (in_subprocess_for_death_test) {<br>
     GTEST_EXTRA_DEATH_TEST_CHILD_SETUP_();<br>
@@ -5130,7 +5277,7 @@ bool UnitTestImpl::RunAllTests() {<br>
   random_seed_ = GTEST_FLAG(shuffle) ?<br>
       GetRandomSeedFromFlag(GTEST_FLAG(random_seed)) : 0;<br>
<br>
-  // True iff at least one test has failed.<br>
+  // True if and only if at least one test has failed.<br>
   bool failed = false;<br>
<br>
   TestEventListener* repeater = listeners()->repeater();<br>
@@ -5142,17 +5289,17 @@ bool UnitTestImpl::RunAllTests() {<br>
   // when we are inside the subprocess of a death test.<br>
   const int repeat = in_subprocess_for_death_test ? 1 : GTEST_FLAG(repeat);<br>
   // Repeats forever if the repeat count is negative.<br>
-  const bool forever = repeat < 0;<br>
-  for (int i = 0; forever || i != repeat; i++) {<br>
+  const bool gtest_repeat_forever = repeat < 0;<br>
+  for (int i = 0; gtest_repeat_forever || i != repeat; i++) {<br>
     // We want to preserve failures generated by ad-hoc test<br>
     // assertions executed before RUN_ALL_TESTS().<br>
     ClearNonAdHocTestResult();<br>
<br>
     const TimeInMillis start = GetTimeInMillis();<br>
<br>
-    // Shuffles test cases and tests if requested.<br>
+    // Shuffles test suites and tests if requested.<br>
     if (has_tests_to_run && GTEST_FLAG(shuffle)) {<br>
-      random()->Reseed(random_seed_);<br>
+      random()->Reseed(static_cast<UInt32>(random_seed_));<br>
       // This should be done before calling OnTestIterationStart(),<br>
       // such that a test event listener can see the actual test order<br>
       // in the event.<br>
@@ -5162,19 +5309,33 @@ bool UnitTestImpl::RunAllTests() {<br>
     // Tells the unit test event listeners that the tests are about to start.<br>
     repeater->OnTestIterationStart(*parent_, i);<br>
<br>
-    // Runs each test case if there is at least one test to run.<br>
+    // Runs each test suite if there is at least one test to run.<br>
     if (has_tests_to_run) {<br>
       // Sets up all environments beforehand.<br>
       repeater->OnEnvironmentsSetUpStart(*parent_);<br>
       ForEach(environments_, SetUpEnvironment);<br>
       repeater->OnEnvironmentsSetUpEnd(*parent_);<br>
<br>
-      // Runs the tests only if there was no fatal failure during global<br>
-      // set-up.<br>
-      if (!Test::HasFatalFailure()) {<br>
-        for (int test_index = 0; test_index < total_test_case_count();<br>
+      // Runs the tests only if there was no fatal failure or skip triggered<br>
+      // during global set-up.<br>
+      if (Test::IsSkipped()) {<br>
+        // Emit diagnostics when global set-up calls skip, as it will not be<br>
+        // emitted by default.<br>
+        TestResult& test_result =<br>
+            *internal::GetUnitTestImpl()->current_test_result();<br>
+        for (int j = 0; j < test_result.total_part_count(); ++j) {<br>
+          const TestPartResult& test_part_result =<br>
+              test_result.GetTestPartResult(j);<br>
+          if (test_part_result.type() == TestPartResult::kSkip) {<br>
+            const std::string& result = test_part_result.message();<br>
+            printf("%s\n", result.c_str());<br>
+          }<br>
+        }<br>
+        fflush(stdout);<br>
+      } else if (!Test::HasFatalFailure()) {<br>
+        for (int test_index = 0; test_index < total_test_suite_count();<br>
              test_index++) {<br>
-          GetMutableTestCase(test_index)->Run();<br>
+          GetMutableSuiteCase(test_index)->Run();<br>
         }<br>
       }<br>
<br>
@@ -5234,9 +5395,9 @@ bool UnitTestImpl::RunAllTests() {<br>
 // be created, prints an error and exits.<br>
 void WriteToShardStatusFileIfNeeded() {<br>
   const char* const test_shard_file = posix::GetEnv(kTestShardStatusFile);<br>
-  if (test_shard_file != NULL) {<br>
+  if (test_shard_file != nullptr) {<br>
     FILE* const file = posix::FOpen(test_shard_file, "w");<br>
-    if (file == NULL) {<br>
+    if (file == nullptr) {<br>
       ColoredPrintf(COLOR_RED,<br>
                     "Could not write to the test shard status file \"%s\" "<br>
                     "specified by the %s environment variable.\n",<br>
@@ -5271,7 +5432,7 @@ bool ShouldShard(const char* total_shards_env,<br>
       << "Invalid environment variables: you have "<br>
       << kTestShardIndex << " = " << shard_index<br>
       << ", but have left " << kTestTotalShards << " unset.\n";<br>
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
     fflush(stdout);<br>
     exit(EXIT_FAILURE);<br>
   } else if (total_shards != -1 && shard_index == -1) {<br>
@@ -5279,7 +5440,7 @@ bool ShouldShard(const char* total_shards_env,<br>
       << "Invalid environment variables: you have "<br>
       << kTestTotalShards << " = " << total_shards<br>
       << ", but have left " << kTestShardIndex << " unset.\n";<br>
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
     fflush(stdout);<br>
     exit(EXIT_FAILURE);<br>
   } else if (shard_index < 0 || shard_index >= total_shards) {<br>
@@ -5288,7 +5449,7 @@ bool ShouldShard(const char* total_shards_env,<br>
       << kTestShardIndex << " < " << kTestTotalShards<br>
       << ", but you have " << kTestShardIndex << "=" << shard_index<br>
       << ", " << kTestTotalShards << "=" << total_shards << ".\n";<br>
-    ColoredPrintf(COLOR_RED, msg.GetString().c_str());<br>
+    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());<br>
     fflush(stdout);<br>
     exit(EXIT_FAILURE);<br>
   }<br>
@@ -5301,7 +5462,7 @@ bool ShouldShard(const char* total_shards_env,<br>
 // and aborts.<br>
 Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {<br>
   const char* str_val = posix::GetEnv(var);<br>
-  if (str_val == NULL) {<br>
+  if (str_val == nullptr) {<br>
     return default_val;<br>
   }<br>
<br>
@@ -5314,8 +5475,8 @@ Int32 Int32FromEnvOrDie(const char* var, Int32 default_val) {<br>
 }<br>
<br>
 // Given the total number of shards, the shard index, and the test id,<br>
-// returns true iff the test should be run on this shard. The test id is<br>
-// some arbitrary but unique non-negative integer assigned to each test<br>
+// returns true if and only if the test should be run on this shard. The test id<br>
+// is some arbitrary but unique non-negative integer assigned to each test<br>
 // method. Assumes that 0 <= shard_index < total_shards.<br>
 bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {<br>
   return (test_id % total_shards) == shard_index;<br>
@@ -5323,7 +5484,7 @@ bool ShouldRunTestOnShard(int total_shards, int shard_index, int test_id) {<br>
<br>
 // Compares the name of each test with the user-specified filter to<br>
 // decide whether the test should be run, then records the result in<br>
-// each TestCase and TestInfo object.<br>
+// each TestSuite and TestInfo object.<br>
 // If shard_tests == true, further filters tests based on sharding<br>
 // variables in the environment - see<br>
 // <a href="https://github.com/google/googletest/blob/master/googletest/docs/advanced.md" rel="noreferrer" target="_blank">https://github.com/google/googletest/blob/master/googletest/docs/advanced.md</a><br>
@@ -5340,26 +5501,23 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
   // this shard.<br>
   int num_runnable_tests = 0;<br>
   int num_selected_tests = 0;<br>
-  for (size_t i = 0; i < test_cases_.size(); i++) {<br>
-    TestCase* const test_case = test_cases_[i];<br>
-    const std::string &test_case_name = test_case->name();<br>
-    test_case->set_should_run(false);<br>
+  for (auto* test_suite : test_suites_) {<br>
+    const std::string& test_suite_name = test_suite->name();<br>
+    test_suite->set_should_run(false);<br>
<br>
-    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {<br>
-      TestInfo* const test_info = test_case->test_info_list()[j];<br>
+    for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {<br>
+      TestInfo* const test_info = test_suite->test_info_list()[j];<br>
       const std::string test_name(test_info->name());<br>
-      // A test is disabled if test case name or test name matches<br>
+      // A test is disabled if test suite name or test name matches<br>
       // kDisableTestFilter.<br>
-      const bool is_disabled =<br>
-          internal::UnitTestOptions::MatchesFilter(test_case_name,<br>
-                                                   kDisableTestFilter) ||<br>
-          internal::UnitTestOptions::MatchesFilter(test_name,<br>
-                                                   kDisableTestFilter);<br>
+      const bool is_disabled = internal::UnitTestOptions::MatchesFilter(<br>
+                                   test_suite_name, kDisableTestFilter) ||<br>
+                               internal::UnitTestOptions::MatchesFilter(<br>
+                                   test_name, kDisableTestFilter);<br>
       test_info->is_disabled_ = is_disabled;<br>
<br>
-      const bool matches_filter =<br>
-          internal::UnitTestOptions::FilterMatchesTest(test_case_name,<br>
-                                                       test_name);<br>
+      const bool matches_filter = internal::UnitTestOptions::FilterMatchesTest(<br>
+          test_suite_name, test_name);<br>
       test_info->matches_filter_ = matches_filter;<br>
<br>
       const bool is_runnable =<br>
@@ -5376,7 +5534,7 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
       num_selected_tests += is_selected;<br>
<br>
       test_info->should_run_ = is_selected;<br>
-      test_case->set_should_run(test_case->should_run() || is_selected);<br>
+      test_suite->set_should_run(test_suite->should_run() || is_selected);<br>
     }<br>
   }<br>
   return num_selected_tests;<br>
@@ -5387,7 +5545,7 @@ int UnitTestImpl::FilterTests(ReactionToSharding shard_tests) {<br>
 // max_length characters, only prints the first max_length characters<br>
 // and "...".<br>
 static void PrintOnOneLine(const char* str, int max_length) {<br>
-  if (str != NULL) {<br>
+  if (str != nullptr) {<br>
     for (int i = 0; *str != '\0'; ++str) {<br>
       if (i >= max_length) {<br>
         printf("...");<br>
@@ -5409,27 +5567,25 @@ void UnitTestImpl::ListTestsMatchingFilter() {<br>
   // Print at most this many characters for each type/value parameter.<br>
   const int kMaxParamLength = 250;<br>
<br>
-  for (size_t i = 0; i < test_cases_.size(); i++) {<br>
-    const TestCase* const test_case = test_cases_[i];<br>
-    bool printed_test_case_name = false;<br>
+  for (auto* test_suite : test_suites_) {<br>
+    bool printed_test_suite_name = false;<br>
<br>
-    for (size_t j = 0; j < test_case->test_info_list().size(); j++) {<br>
-      const TestInfo* const test_info =<br>
-          test_case->test_info_list()[j];<br>
+    for (size_t j = 0; j < test_suite->test_info_list().size(); j++) {<br>
+      const TestInfo* const test_info = test_suite->test_info_list()[j];<br>
       if (test_info->matches_filter_) {<br>
-        if (!printed_test_case_name) {<br>
-          printed_test_case_name = true;<br>
-          printf("%s.", test_case->name());<br>
-          if (test_case->type_param() != NULL) {<br>
+        if (!printed_test_suite_name) {<br>
+          printed_test_suite_name = true;<br>
+          printf("%s.", test_suite->name());<br>
+          if (test_suite->type_param() != nullptr) {<br>
             printf("  # %s = ", kTypeParamLabel);<br>
             // We print the type parameter on a single line to make<br>
             // the output easy to parse by a program.<br>
-            PrintOnOneLine(test_case->type_param(), kMaxParamLength);<br>
+            PrintOnOneLine(test_suite->type_param(), kMaxParamLength);<br>
           }<br>
           printf("\n");<br>
         }<br>
         printf("  %s", test_info->name());<br>
-        if (test_info->value_param() != NULL) {<br>
+        if (test_info->value_param() != nullptr) {<br>
           printf("  # %s = ", kValueParamLabel);<br>
           // We print the value parameter on a single line to make the<br>
           // output easy to parse by a program.<br>
@@ -5448,11 +5604,11 @@ void UnitTestImpl::ListTestsMatchingFilter() {<br>
     if (output_format == "xml") {<br>
       XmlUnitTestResultPrinter(<br>
           UnitTestOptions::GetAbsolutePathToOutputFile().c_str())<br>
-          .PrintXmlTestsList(&stream, test_cases_);<br>
+          .PrintXmlTestsList(&stream, test_suites_);<br>
     } else if (output_format == "json") {<br>
       JsonUnitTestResultPrinter(<br>
           UnitTestOptions::GetAbsolutePathToOutputFile().c_str())<br>
-          .PrintJsonTestList(&stream, test_cases_);<br>
+          .PrintJsonTestList(&stream, test_suites_);<br>
     }<br>
     fprintf(fileout, "%s", StringStreamToString(&stream).c_str());<br>
     fclose(fileout);<br>
@@ -5476,7 +5632,7 @@ void UnitTestImpl::set_os_stack_trace_getter(<br>
 // otherwise, creates an OsStackTraceGetter, makes it the current<br>
 // getter, and returns it.<br>
 OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {<br>
-  if (os_stack_trace_getter_ == NULL) {<br>
+  if (os_stack_trace_getter_ == nullptr) {<br>
 #ifdef GTEST_OS_STACK_TRACE_GETTER_<br>
     os_stack_trace_getter_ = new GTEST_OS_STACK_TRACE_GETTER_;<br>
 #else<br>
@@ -5489,38 +5645,38 @@ OsStackTraceGetterInterface* UnitTestImpl::os_stack_trace_getter() {<br>
<br>
 // Returns the most specific TestResult currently running.<br>
 TestResult* UnitTestImpl::current_test_result() {<br>
-  if (current_test_info_ != NULL) {<br>
+  if (current_test_info_ != nullptr) {<br>
     return &current_test_info_->result_;<br>
   }<br>
-  if (current_test_case_ != NULL) {<br>
-    return &current_test_case_->ad_hoc_test_result_;<br>
+  if (current_test_suite_ != nullptr) {<br>
+    return &current_test_suite_->ad_hoc_test_result_;<br>
   }<br>
   return &ad_hoc_test_result_;<br>
 }<br>
<br>
-// Shuffles all test cases, and the tests within each test case,<br>
+// Shuffles all test suites, and the tests within each test suite,<br>
 // making sure that death tests are still run first.<br>
 void UnitTestImpl::ShuffleTests() {<br>
-  // Shuffles the death test cases.<br>
-  ShuffleRange(random(), 0, last_death_test_case_ + 1, &test_case_indices_);<br>
+  // Shuffles the death test suites.<br>
+  ShuffleRange(random(), 0, last_death_test_suite_ + 1, &test_suite_indices_);<br>
<br>
-  // Shuffles the non-death test cases.<br>
-  ShuffleRange(random(), last_death_test_case_ + 1,<br>
-               static_cast<int>(test_cases_.size()), &test_case_indices_);<br>
+  // Shuffles the non-death test suites.<br>
+  ShuffleRange(random(), last_death_test_suite_ + 1,<br>
+               static_cast<int>(test_suites_.size()), &test_suite_indices_);<br>
<br>
-  // Shuffles the tests inside each test case.<br>
-  for (size_t i = 0; i < test_cases_.size(); i++) {<br>
-    test_cases_[i]->ShuffleTests(random());<br>
+  // Shuffles the tests inside each test suite.<br>
+  for (auto& test_suite : test_suites_) {<br>
+    test_suite->ShuffleTests(random());<br>
   }<br>
 }<br>
<br>
-// Restores the test cases and tests to their order before the first shuffle.<br>
+// Restores the test suites and tests to their order before the first shuffle.<br>
 void UnitTestImpl::UnshuffleTests() {<br>
-  for (size_t i = 0; i < test_cases_.size(); i++) {<br>
-    // Unshuffles the tests in each test case.<br>
-    test_cases_[i]->UnshuffleTests();<br>
-    // Resets the index of each test case.<br>
-    test_case_indices_[i] = static_cast<int>(i);<br>
+  for (size_t i = 0; i < test_suites_.size(); i++) {<br>
+    // Unshuffles the tests in each test suite.<br>
+    test_suites_[i]->UnshuffleTests();<br>
+    // Resets the index of each test suite.<br>
+    test_suite_indices_[i] = static_cast<int>(i);<br>
   }<br>
 }<br>
<br>
@@ -5579,12 +5735,12 @@ bool SkipPrefix(const char* prefix, const char** pstr) {<br>
 static const char* ParseFlagValue(const char* str, const char* flag,<br>
                                   bool def_optional) {<br>
   // str and flag must not be NULL.<br>
-  if (str == NULL || flag == NULL) return NULL;<br>
+  if (str == nullptr || flag == nullptr) return nullptr;<br>
<br>
   // The flag must start with "--" followed by GTEST_FLAG_PREFIX_.<br>
   const std::string flag_str = std::string("--") + GTEST_FLAG_PREFIX_ + flag;<br>
   const size_t flag_len = flag_str.length();<br>
-  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL;<br>
+  if (strncmp(str, flag_str.c_str(), flag_len) != 0) return nullptr;<br>
<br>
   // Skips the flag name.<br>
   const char* flag_end = str + flag_len;<br>
@@ -5597,7 +5753,7 @@ static const char* ParseFlagValue(const char* str, const char* flag,<br>
   // If def_optional is true and there are more characters after the<br>
   // flag name, or if def_optional is false, there must be a '=' after<br>
   // the flag name.<br>
-  if (flag_end[0] != '=') return NULL;<br>
+  if (flag_end[0] != '=') return nullptr;<br>
<br>
   // Returns the string after "=".<br>
   return flag_end + 1;<br>
@@ -5618,7 +5774,7 @@ static bool ParseBoolFlag(const char* str, const char* flag, bool* value) {<br>
   const char* const value_str = ParseFlagValue(str, flag, true);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Converts the string value to a bool.<br>
   *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F');<br>
@@ -5635,7 +5791,7 @@ bool ParseInt32Flag(const char* str, const char* flag, Int32* value) {<br>
   const char* const value_str = ParseFlagValue(str, flag, false);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Sets *value to the value of the flag.<br>
   return ParseInt32(Message() << "The value of flag --" << flag,<br>
@@ -5653,7 +5809,7 @@ static bool ParseStringFlag(const char* str, const char* flag, String* value) {<br>
   const char* const value_str = ParseFlagValue(str, flag, false);<br>
<br>
   // Aborts if the parsing failed.<br>
-  if (value_str == NULL) return false;<br>
+  if (value_str == nullptr) return false;<br>
<br>
   // Sets *value to the value of the flag.<br>
   *value = value_str;<br>
@@ -5684,8 +5840,6 @@ static bool HasGoogleTestFlagPrefix(const char* str) {<br>
 //   @Y    changes the color to yellow.<br>
 //   @D    changes to the default terminal text color.<br>
 //<br>
-// FIXME: Write tests for this once we add stdout<br>
-// capturing to Google Test.<br>
 static void PrintColorEncoded(const char* str) {<br>
   GTestColor color = COLOR_DEFAULT;  // The current color.<br>
<br>
@@ -5695,7 +5849,7 @@ static void PrintColorEncoded(const char* str) {<br>
   // next segment.<br>
   for (;;) {<br>
     const char* p = strchr(str, '@');<br>
-    if (p == NULL) {<br>
+    if (p == nullptr) {<br>
       ColoredPrintf(color, "%s", str);<br>
       return;<br>
     }<br>
@@ -5753,7 +5907,7 @@ static const char kColorEncodedHelpMessage[] =<br>
 "  @G--" GTEST_FLAG_PREFIX_ "output=@Y(@Gjson@Y|@Gxml@Y)[@G:@YDIRECTORY_PATH@G"<br>
     GTEST_PATH_SEP_ "@Y|@G:@YFILE_PATH]@D\n"<br>
 "      Generate a JSON or XML report in the given directory or with the given\n"<br>
-"      file name. @YFILE_PATH@D defaults to @Gtest_details.xml@D.\n"<br>
+"      file name. @YFILE_PATH@D defaults to @Gtest_detail.xml@D.\n"<br>
 # if GTEST_CAN_STREAM_RESULTS_<br>
 "  @G--" GTEST_FLAG_PREFIX_ "stream_result_to=@YHOST@G:@YPORT@D\n"<br>
 "      Stream test results to the given server.\n"<br>
@@ -5895,7 +6049,7 @@ void ParseGoogleTestFlagsOnlyImpl(int* argc, CharType** argv) {<br>
 void ParseGoogleTestFlagsOnly(int* argc, char** argv) {<br>
   ParseGoogleTestFlagsOnlyImpl(argc, argv);<br>
<br>
-  // Fix the value of *_NSGetArgc() on macOS, but iff<br>
+  // Fix the value of *_NSGetArgc() on macOS, but if and only if<br>
   // *_NSGetArgv() == argv<br>
   // Only applicable to char** version of argv<br>
 #if GTEST_OS_MAC<br>
@@ -5963,6 +6117,22 @@ void InitGoogleTest(int* argc, wchar_t** argv) {<br>
 #endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
 }<br>
<br>
+// This overloaded version can be used on Arduino/embedded platforms where<br>
+// there is no argc/argv.<br>
+void InitGoogleTest() {<br>
+  // Since Arduino doesn't have a command line, fake out the argc/argv arguments<br>
+  int argc = 1;<br>
+  const auto arg0 = "dummy";<br>
+  char* argv0 = const_cast<char*>(arg0);<br>
+  char** argv = &argv0;<br>
+<br>
+#if defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+  GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_(&argc, argv);<br>
+#else  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+  internal::InitGoogleTestImpl(&argc, argv);<br>
+#endif  // defined(GTEST_CUSTOM_INIT_GOOGLE_TEST_FUNCTION_)<br>
+}<br>
+<br>
 std::string TempDir() {<br>
 #if defined(GTEST_CUSTOM_TEMPDIR_FUNCTION_)<br>
   return GTEST_CUSTOM_TEMPDIR_FUNCTION_();<br>
@@ -5972,7 +6142,7 @@ std::string TempDir() {<br>
   return "\\temp\\";<br>
 #elif GTEST_OS_WINDOWS<br>
   const char* temp_dir = internal::posix::GetEnv("TEMP");<br>
-  if (temp_dir == NULL || temp_dir[0] == '\0')<br>
+  if (temp_dir == nullptr || temp_dir[0] == '\0')<br>
     return "\\temp\\";<br>
   else if (temp_dir[strlen(temp_dir) - 1] == '\\')<br>
     return temp_dir;<br>
<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>