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
This commit is contained in:
Abseil Team 2023-06-27 11:14:33 -07:00 committed by Copybara-Service
parent 8e32de89cf
commit f269e15c5c
2 changed files with 20 additions and 2 deletions

View File

@ -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'.

View File

@ -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 {