diff --git a/include/gtest/internal/gtest-internal.h b/include/gtest/internal/gtest-internal.h index 3c5d1f76..bf8412b9 100644 --- a/include/gtest/internal/gtest-internal.h +++ b/include/gtest/internal/gtest-internal.h @@ -842,6 +842,10 @@ struct RemoveConst { #define GTEST_REMOVE_CONST_(T) \ typename ::testing::internal::RemoveConst::type +// Turns const U&, U&, const U, and U all into U. +#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ + GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(T)) + // Adds reference to a type if it is not a reference type, // otherwise leaves it unchanged. This is the same as // tr1::add_reference, which is not widely available yet. @@ -1046,7 +1050,7 @@ class NativeArray { // Ensures that the user doesn't instantiate NativeArray with a // const or reference type. static_cast(StaticAssertTypeEqHelper()); + GTEST_REMOVE_REFERENCE_AND_CONST_(Element)>()); if (relation_to_source_ == kCopy) delete[] array_; } diff --git a/test/gtest_unittest.cc b/test/gtest_unittest.cc index a92809f7..40049aef 100644 --- a/test/gtest_unittest.cc +++ b/test/gtest_unittest.cc @@ -6834,6 +6834,21 @@ TEST(RemoveConstTest, MacroVersion) { TestGTestRemoveConst(); } +// Tests GTEST_REMOVE_REFERENCE_AND_CONST_. + +template +void TestGTestRemoveReferenceAndConst() { + CompileAssertTypesEqual(); +} + +TEST(RemoveReferenceToConstTest, Works) { + TestGTestRemoveReferenceAndConst(); + TestGTestRemoveReferenceAndConst(); + TestGTestRemoveReferenceAndConst(); + TestGTestRemoveReferenceAndConst(); + TestGTestRemoveReferenceAndConst(); +} + // Tests that AddReference does not affect reference types. TEST(AddReferenceTest, DoesNotAffectReferenceType) { CompileAssertTypesEqual::type>();