From 55d166a2228d7e3b3500b8651ab9b8e56fb43b7e Mon Sep 17 00:00:00 2001
From: "zhanyong.wan" <zhanyong.wan@861a406c-534a-0410-8894-cb66d6ee9925>
Date: Mon, 17 May 2010 19:31:00 +0000
Subject: [PATCH] Adds GTEST_REMOVE_REFERENCE_AND_CONST_.

---
 include/gtest/internal/gtest-internal.h |  6 +++++-
 test/gtest_unittest.cc                  | 15 +++++++++++++++
 2 files changed, 20 insertions(+), 1 deletion(-)

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<T[N]> {
 #define GTEST_REMOVE_CONST_(T) \
     typename ::testing::internal::RemoveConst<T>::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<void>(StaticAssertTypeEqHelper<Element,
-        GTEST_REMOVE_CONST_(GTEST_REMOVE_REFERENCE_(Element))>());
+        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<char, const char>();
 }
 
+// Tests GTEST_REMOVE_REFERENCE_AND_CONST_.
+
+template <typename T1, typename T2>
+void TestGTestRemoveReferenceAndConst() {
+  CompileAssertTypesEqual<T1, GTEST_REMOVE_REFERENCE_AND_CONST_(T2)>();
+}
+
+TEST(RemoveReferenceToConstTest, Works) {
+  TestGTestRemoveReferenceAndConst<int, int>();
+  TestGTestRemoveReferenceAndConst<double, double&>();
+  TestGTestRemoveReferenceAndConst<char, const char>();
+  TestGTestRemoveReferenceAndConst<char, const char&>();
+  TestGTestRemoveReferenceAndConst<const char*, const char*>();
+}
+
 // Tests that AddReference does not affect reference types.
 TEST(AddReferenceTest, DoesNotAffectReferenceType) {
   CompileAssertTypesEqual<int&, AddReference<int&>::type>();