summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2023-06-27 18:14:33 (GMT)
committerCopybara-Service <copybara-worker@google.com>2023-06-27 18:17:00 (GMT)
commitf269e15c5cafa4ba7f4b543e0c395646bbbbd32d (patch)
tree5a477f55d220ade87076b3ae9fc8826a94017190
parent8e32de89cfe725dc9c084044b71e9c13246049c4 (diff)
downloadgoogletest-f269e15c5cafa4ba7f4b543e0c395646bbbbd32d.zip
googletest-f269e15c5cafa4ba7f4b543e0c395646bbbbd32d.tar.gz
googletest-f269e15c5cafa4ba7f4b543e0c395646bbbbd32d.tar.bz2
Resolve an issue where the resolution of `operator<<` overloads would attempt to instantiate the incomplete `testing::internal::Secret` type.
PiperOrigin-RevId: 543799815 Change-Id: Ic0a4f48d825bef26cb8cc74d8a0117b3a5ef3f14
-rw-r--r--googletest/include/gtest/internal/gtest-port.h6
-rw-r--r--googletest/test/gtest_unittest.cc16
2 files changed, 20 insertions, 2 deletions
diff --git a/googletest/include/gtest/internal/gtest-port.h b/googletest/include/gtest/internal/gtest-port.h
index 8b66714..5221540 100644
--- a/googletest/include/gtest/internal/gtest-port.h
+++ b/googletest/include/gtest/internal/gtest-port.h
@@ -925,9 +925,11 @@ using std::tuple_size;
namespace internal {
// A secret type that Google Test users don't know about. It has no
-// definition on purpose. Therefore it's impossible to create a
+// accessible constructors on purpose. Therefore it's impossible to create a
// Secret object, which is what we want.
-class Secret;
+class Secret {
+ Secret(const Secret&) = delete;
+};
// A helper for suppressing warnings on constant condition. It just
// returns 'condition'.
diff --git a/googletest/test/gtest_unittest.cc b/googletest/test/gtest_unittest.cc
index dd049a0..6caa03f 100644
--- a/googletest/test/gtest_unittest.cc
+++ b/googletest/test/gtest_unittest.cc
@@ -67,11 +67,27 @@ TEST(CommandLineFlagsTest, CanBeAccessedInCodeOnceGTestHIsIncluded) {
#include <string>
#include <type_traits>
#include <unordered_set>
+#include <utility>
#include <vector>
#include "gtest/gtest-spi.h"
#include "src/gtest-internal-inl.h"
+struct ConvertibleGlobalType {
+ // The inner enable_if is to ensure invoking is_constructible doesn't fail.
+ // The outer enable_if is to ensure the overload resolution doesn't encounter
+ // an ambiguity.
+ template <
+ class T,
+ std::enable_if_t<
+ false, std::enable_if_t<std::is_constructible<T>::value, int>> = 0>
+ operator T() const; // NOLINT(google-explicit-constructor)
+};
+void operator<<(ConvertibleGlobalType&, int);
+static_assert(sizeof(decltype(std::declval<ConvertibleGlobalType&>()
+ << 1)(*)()) > 0,
+ "error in operator<< overload resolution");
+
namespace testing {
namespace internal {