Merge pull request #2170 from ngie-eign:issue-2146-ver2

PiperOrigin-RevId: 244069956
This commit is contained in:
Gennadiy Civil 2019-04-18 09:44:23 -04:00
commit a0d60bed4d
15 changed files with 108 additions and 79 deletions

View File

@ -4,6 +4,10 @@
[![Build Status](https://api.travis-ci.org/google/googletest.svg?branch=master)](https://travis-ci.org/google/googletest) [![Build Status](https://api.travis-ci.org/google/googletest.svg?branch=master)](https://travis-ci.org/google/googletest)
[![Build status](https://ci.appveyor.com/api/projects/status/4o38plt0xbo1ubc8/branch/master?svg=true)](https://ci.appveyor.com/project/GoogleTestAppVeyor/googletest/branch/master) [![Build status](https://ci.appveyor.com/api/projects/status/4o38plt0xbo1ubc8/branch/master?svg=true)](https://ci.appveyor.com/project/GoogleTestAppVeyor/googletest/branch/master)
**PR FREEZE COMING SOON**
We are working on a large refactoring that would make it hard to accept external PRs. *Really Soon Now* we will not be accepting new PRs until the refactoring has been completed.
**Future Plans**: **Future Plans**:
* 1.8.x Release - [the 1.8.x](https://github.com/google/googletest/releases/tag/release-1.8.1) is the last release that works with pre-C++11 compilers. The 1.8.x will not accept any requests for any new features and any bugfix requests will only be accepted if proven "critical" * 1.8.x Release - [the 1.8.x](https://github.com/google/googletest/releases/tag/release-1.8.1) is the last release that works with pre-C++11 compilers. The 1.8.x will not accept any requests for any new features and any bugfix requests will only be accepted if proven "critical"
* Post 1.8.x - work to improve/cleanup/pay technical debt. When this work is completed there will be a 1.9.x tagged release * Post 1.8.x - work to improve/cleanup/pay technical debt. When this work is completed there will be a 1.9.x tagged release

View File

@ -17,7 +17,7 @@ If all this seems too abstract for you, don't worry - the most important thing t
Using Google Mock involves three basic steps: Using Google Mock involves three basic steps:
1. Use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class; 1. Use some simple macros to describe the interface you want to mock, and they will expand to the implementation of your mock class;
1. Create some mock objects and specify their expectations and behavior using an intuitive syntax; 1. Create some mock objects and specify its expectations and behavior using an intuitive syntax;
1. Exercise code that uses the mock objects. Google Mock will catch any violation of the expectations as soon as it arises. 1. Exercise code that uses the mock objects. Google Mock will catch any violation of the expectations as soon as it arises.
# Why Google Mock? # # Why Google Mock? #

View File

@ -4310,8 +4310,11 @@ TEST(ResultOfTest, WorksForPolymorphicFunctorsIgnoringResultType) {
} }
TEST(ResultOfTest, WorksForLambdas) { TEST(ResultOfTest, WorksForLambdas) {
Matcher<int> matcher = Matcher<int> matcher = ResultOf(
ResultOf([](int str_len) { return std::string(str_len, 'x'); }, "xxx"); [](int str_len) {
return std::string(static_cast<size_t>(str_len), 'x');
},
"xxx");
EXPECT_TRUE(matcher.Matches(3)); EXPECT_TRUE(matcher.Matches(3));
EXPECT_FALSE(matcher.Matches(1)); EXPECT_FALSE(matcher.Matches(1));
} }
@ -5812,11 +5815,11 @@ class BacktrackingBPMTest : public ::testing::Test { };
// Tests the MaxBipartiteMatching algorithm with square matrices. // Tests the MaxBipartiteMatching algorithm with square matrices.
// The single int param is the # of nodes on each of the left and right sides. // The single int param is the # of nodes on each of the left and right sides.
class BipartiteTest : public ::testing::TestWithParam<int> { }; class BipartiteTest : public ::testing::TestWithParam<size_t> {};
// Verify all match graphs up to some moderate number of edges. // Verify all match graphs up to some moderate number of edges.
TEST_P(BipartiteTest, Exhaustive) { TEST_P(BipartiteTest, Exhaustive) {
int nodes = GetParam(); size_t nodes = GetParam();
MatchMatrix graph(nodes, nodes); MatchMatrix graph(nodes, nodes);
do { do {
ElementMatcherPairs matches = ElementMatcherPairs matches =
@ -5841,7 +5844,7 @@ TEST_P(BipartiteTest, Exhaustive) {
} }
INSTANTIATE_TEST_SUITE_P(AllGraphs, BipartiteTest, INSTANTIATE_TEST_SUITE_P(AllGraphs, BipartiteTest,
::testing::Range(0, 5)); ::testing::Range(size_t{0}, size_t{5}));
// Parameterized by a pair interpreted as (LhsSize, RhsSize). // Parameterized by a pair interpreted as (LhsSize, RhsSize).
class BipartiteNonSquareTest class BipartiteNonSquareTest
@ -5857,7 +5860,7 @@ TEST_F(BipartiteNonSquareTest, SimpleBacktracking) {
// :.......: // :.......:
// 0 1 2 // 0 1 2
MatchMatrix g(4, 3); MatchMatrix g(4, 3);
static const int kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}}; static const size_t kEdges[][2] = {{0, 2}, {1, 1}, {2, 1}, {3, 0}};
for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) { for (size_t i = 0; i < GTEST_ARRAY_SIZE_(kEdges); ++i) {
g.SetEdge(kEdges[i][0], kEdges[i][1], true); g.SetEdge(kEdges[i][0], kEdges[i][1], true);
} }
@ -5902,15 +5905,15 @@ class BipartiteRandomTest
TEST_P(BipartiteRandomTest, LargerNets) { TEST_P(BipartiteRandomTest, LargerNets) {
int nodes = GetParam().first; int nodes = GetParam().first;
int iters = GetParam().second; int iters = GetParam().second;
MatchMatrix graph(nodes, nodes); MatchMatrix graph(static_cast<size_t>(nodes), static_cast<size_t>(nodes));
testing::internal::Int32 seed = GTEST_FLAG(random_seed); auto seed = static_cast<testing::internal::UInt32>(GTEST_FLAG(random_seed));
if (seed == 0) { if (seed == 0) {
seed = static_cast<testing::internal::Int32>(time(nullptr)); seed = static_cast<testing::internal::UInt32>(time(nullptr));
} }
for (; iters > 0; --iters, ++seed) { for (; iters > 0; --iters, ++seed) {
srand(static_cast<int>(seed)); srand(static_cast<unsigned int>(seed));
graph.Randomize(); graph.Randomize();
EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(), EXPECT_EQ(FindBacktrackingMaxBPM(graph).size(),
internal::FindMaxBipartiteMatching(graph).size()) internal::FindMaxBipartiteMatching(graph).size())

View File

@ -78,7 +78,7 @@ macro(config_compiler_and_linker)
# http://stackoverflow.com/questions/3232669 explains the issue. # http://stackoverflow.com/questions/3232669 explains the issue.
set(cxx_base_flags "${cxx_base_flags} -wd4702") set(cxx_base_flags "${cxx_base_flags} -wd4702")
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(cxx_base_flags "-Wall -Wshadow -Werror -Wno-error=sign-conversion") set(cxx_base_flags "-Wall -Wshadow -Werror -Wconversion")
set(cxx_exception_flags "-fexceptions") set(cxx_exception_flags "-fexceptions")
set(cxx_no_exception_flags "-fno-exceptions") set(cxx_no_exception_flags "-fno-exceptions")
set(cxx_strict_flags "-W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls") set(cxx_strict_flags "-W -Wpointer-arith -Wreturn-type -Wcast-qual -Wwrite-strings -Wswitch -Wunused-parameter -Wcast-align -Wchar-subscripts -Winline -Wredundant-decls")

View File

@ -700,7 +700,7 @@ class TypeParameterizedTest {
// list. // list.
MakeAndRegisterTestInfo( MakeAndRegisterTestInfo(
(std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name +
"/" + type_names[index]) "/" + type_names[static_cast<size_t>(index)])
.c_str(), .c_str(),
StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(),
GetTypeName<Type>().c_str(), GetTypeName<Type>().c_str(),

View File

@ -150,6 +150,9 @@ class GTEST_API_ String {
// Formats an int value as "%X". // Formats an int value as "%X".
static std::string FormatHexInt(int value); static std::string FormatHexInt(int value);
// Formats an int value as "%X".
static std::string FormatHexUInt32(UInt32 value);
// Formats a byte as "%02X". // Formats a byte as "%02X".
static std::string FormatByte(unsigned char value); static std::string FormatByte(unsigned char value);

View File

@ -1354,7 +1354,7 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
if (!use_fork) { if (!use_fork) {
static const bool stack_grows_down = StackGrowsDown(); static const bool stack_grows_down = StackGrowsDown();
const size_t stack_size = getpagesize(); const auto stack_size = static_cast<size_t>(getpagesize());
// MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead. // MMAP_ANONYMOUS is not defined on Mac, so we use MAP_ANON instead.
void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE, void* const stack = mmap(nullptr, stack_size, PROT_READ | PROT_WRITE,
MAP_ANON | MAP_PRIVATE, -1, 0); MAP_ANON | MAP_PRIVATE, -1, 0);
@ -1370,8 +1370,9 @@ static pid_t ExecDeathTestSpawnChild(char* const* argv, int close_fd) {
void* const stack_top = void* const stack_top =
static_cast<char*>(stack) + static_cast<char*>(stack) +
(stack_grows_down ? stack_size - kMaxStackAlignment : 0); (stack_grows_down ? stack_size - kMaxStackAlignment : 0);
GTEST_DEATH_TEST_CHECK_(stack_size > kMaxStackAlignment && GTEST_DEATH_TEST_CHECK_(
reinterpret_cast<intptr_t>(stack_top) % kMaxStackAlignment == 0); static_cast<size_t>(stack_size) > kMaxStackAlignment &&
reinterpret_cast<uintptr_t>(stack_top) % kMaxStackAlignment == 0);
child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args); child_pid = clone(&ExecDeathTestChildMain, stack_top, SIGCHLD, &args);

View File

@ -163,7 +163,7 @@ FilePath FilePath::RemoveFileName() const {
const char* const last_sep = FindLastPathSeparator(); const char* const last_sep = FindLastPathSeparator();
std::string dir; std::string dir;
if (last_sep) { if (last_sep) {
dir = std::string(c_str(), last_sep + 1 - c_str()); dir = std::string(c_str(), static_cast<size_t>(last_sep + 1 - c_str()));
} else { } else {
dir = kCurrentDirectoryString; dir = kCurrentDirectoryString;
} }

View File

@ -298,7 +298,8 @@ void ForEach(const Container& c, Functor functor) {
// in range [0, v.size()). // in range [0, v.size()).
template <typename E> template <typename E>
inline E GetElementOr(const std::vector<E>& v, int i, E default_value) { inline E GetElementOr(const std::vector<E>& v, int i, E default_value) {
return (i < 0 || i >= static_cast<int>(v.size())) ? default_value : v[i]; return (i < 0 || i >= static_cast<int>(v.size())) ? default_value
: v[static_cast<size_t>(i)];
} }
// Performs an in-place shuffle of a range of the vector's elements. // Performs an in-place shuffle of a range of the vector's elements.
@ -320,8 +321,11 @@ void ShuffleRange(internal::Random* random, int begin, int end,
// http://en.wikipedia.org/wiki/Fisher-Yates_shuffle // http://en.wikipedia.org/wiki/Fisher-Yates_shuffle
for (int range_width = end - begin; range_width >= 2; range_width--) { for (int range_width = end - begin; range_width >= 2; range_width--) {
const int last_in_range = begin + range_width - 1; const int last_in_range = begin + range_width - 1;
const int selected = begin + random->Generate(range_width); const int selected =
std::swap((*v)[selected], (*v)[last_in_range]); begin +
static_cast<int>(random->Generate(static_cast<UInt32>(range_width)));
std::swap((*v)[static_cast<size_t>(selected)],
(*v)[static_cast<size_t>(last_in_range)]);
} }
} }
@ -586,7 +590,7 @@ class GTEST_API_ UnitTestImpl {
// total_test_suite_count() - 1. If i is not in that range, returns NULL. // total_test_suite_count() - 1. If i is not in that range, returns NULL.
const TestSuite* GetTestSuite(int i) const { const TestSuite* GetTestSuite(int i) const {
const int index = GetElementOr(test_suite_indices_, i, -1); const int index = GetElementOr(test_suite_indices_, i, -1);
return index < 0 ? nullptr : test_suites_[i]; return index < 0 ? nullptr : test_suites_[static_cast<size_t>(i)];
} }
// Legacy API is deprecated but still available // Legacy API is deprecated but still available
@ -598,7 +602,7 @@ class GTEST_API_ UnitTestImpl {
// total_test_suite_count() - 1. If i is not in that range, returns NULL. // total_test_suite_count() - 1. If i is not in that range, returns NULL.
TestSuite* GetMutableSuiteCase(int i) { TestSuite* GetMutableSuiteCase(int i) {
const int index = GetElementOr(test_suite_indices_, i, -1); const int index = GetElementOr(test_suite_indices_, i, -1);
return index < 0 ? nullptr : test_suites_[index]; return index < 0 ? nullptr : test_suites_[static_cast<size_t>(index)];
} }
// Provides access to the event listener list. // Provides access to the event listener list.
@ -1083,8 +1087,8 @@ class StreamingListener : public EmptyTestEventListener {
GTEST_CHECK_(sockfd_ != -1) GTEST_CHECK_(sockfd_ != -1)
<< "Send() can be called only when there is a connection."; << "Send() can be called only when there is a connection.";
const int len = static_cast<int>(message.length()); const auto len = static_cast<size_t>(message.length());
if (write(sockfd_, message.c_str(), len) != len) { if (write(sockfd_, message.c_str(), len) != static_cast<ssize_t>(len)) {
GTEST_LOG_(WARNING) GTEST_LOG_(WARNING)
<< "stream_result_to: failed to stream to " << "stream_result_to: failed to stream to "
<< host_name_ << ":" << port_num_; << host_name_ << ":" << port_num_;

View File

@ -117,7 +117,7 @@ T ReadProcFileField(const std::string& filename, int field) {
size_t GetThreadCount() { size_t GetThreadCount() {
const std::string filename = const std::string filename =
(Message() << "/proc/" << getpid() << "/stat").GetString(); (Message() << "/proc/" << getpid() << "/stat").GetString();
return ReadProcFileField<int>(filename, 19); return ReadProcFileField<size_t>(filename, 19);
} }
#elif GTEST_OS_MAC #elif GTEST_OS_MAC
@ -175,7 +175,7 @@ size_t GetThreadCount() {
if (sysctl(mib, miblen, &info, &size, NULL, 0)) { if (sysctl(mib, miblen, &info, &size, NULL, 0)) {
return 0; return 0;
} }
return KP_NLWP(info); return static_cast<size_t>(KP_NLWP(info));
} }
#elif GTEST_OS_OPENBSD #elif GTEST_OS_OPENBSD

View File

@ -70,7 +70,7 @@ const TestPartResult& TestPartResultArray::GetTestPartResult(int index) const {
internal::posix::Abort(); internal::posix::Abort();
} }
return array_[index]; return array_[static_cast<size_t>(index)];
} }
// Returns the number of TestPartResult objects in the array. // Returns the number of TestPartResult objects in the array.

View File

@ -446,7 +446,8 @@ std::string UnitTestOptions::GetOutputFormat() {
const char* const colon = strchr(gtest_output_flag, ':'); const char* const colon = strchr(gtest_output_flag, ':');
return (colon == nullptr) return (colon == nullptr)
? std::string(gtest_output_flag) ? std::string(gtest_output_flag)
: std::string(gtest_output_flag, colon - gtest_output_flag); : std::string(gtest_output_flag,
static_cast<size_t>(colon - gtest_output_flag));
} }
// Returns the name of the requested output file, or the default if none // Returns the name of the requested output file, or the default if none
@ -1240,9 +1241,10 @@ std::string CreateUnifiedDiff(const std::vector<std::string>& left,
for (; edit_i < edits.size(); ++edit_i) { for (; edit_i < edits.size(); ++edit_i) {
if (n_suffix >= context) { if (n_suffix >= context) {
// Continue only if the next hunk is very close. // Continue only if the next hunk is very close.
std::vector<EditType>::const_iterator it = edits.begin() + edit_i; auto it = edits.begin() + static_cast<int>(edit_i);
while (it != edits.end() && *it == kMatch) ++it; while (it != edits.end() && *it == kMatch) ++it;
if (it == edits.end() || (it - edits.begin()) - edit_i >= context) { if (it == edits.end() ||
static_cast<size_t>(it - edits.begin()) - edit_i >= context) {
// There is no next edit or it is too far away. // There is no next edit or it is too far away.
break; break;
} }
@ -1767,7 +1769,7 @@ inline UInt32 ChopLowBits(UInt32* bits, int n) {
// to "(Invalid Unicode 0xXXXXXXXX)". // to "(Invalid Unicode 0xXXXXXXXX)".
std::string CodePointToUtf8(UInt32 code_point) { std::string CodePointToUtf8(UInt32 code_point) {
if (code_point > kMaxCodePoint4) { if (code_point > kMaxCodePoint4) {
return "(Invalid Unicode 0x" + String::FormatHexInt(code_point) + ")"; return "(Invalid Unicode 0x" + String::FormatHexUInt32(code_point) + ")";
} }
char str[5]; // Big enough for the largest valid code point. char str[5]; // Big enough for the largest valid code point.
@ -1808,12 +1810,15 @@ inline bool IsUtf16SurrogatePair(wchar_t first, wchar_t second) {
// Creates a Unicode code point from UTF16 surrogate pair. // Creates a Unicode code point from UTF16 surrogate pair.
inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first, inline UInt32 CreateCodePointFromUtf16SurrogatePair(wchar_t first,
wchar_t second) { wchar_t second) {
const auto first_u = static_cast<UInt32>(first);
const auto second_u = static_cast<UInt32>(second);
const UInt32 mask = (1 << 10) - 1; const UInt32 mask = (1 << 10) - 1;
return (sizeof(wchar_t) == 2) ? return (sizeof(wchar_t) == 2)
(((first & mask) << 10) | (second & mask)) + 0x10000 : ? (((first_u & mask) << 10) | (second_u & mask)) + 0x10000
:
// This function should not be called when the condition is // This function should not be called when the condition is
// false, but we provide a sensible default in case it is. // false, but we provide a sensible default in case it is.
static_cast<UInt32>(first); first_u;
} }
// Converts a wide string to a narrow string in UTF-8 encoding. // Converts a wide string to a narrow string in UTF-8 encoding.
@ -1970,12 +1975,17 @@ std::string String::FormatIntWidth2(int value) {
} }
// Formats an int value as "%X". // Formats an int value as "%X".
std::string String::FormatHexInt(int value) { std::string String::FormatHexUInt32(UInt32 value) {
std::stringstream ss; std::stringstream ss;
ss << std::hex << std::uppercase << value; ss << std::hex << std::uppercase << value;
return ss.str(); return ss.str();
} }
// Formats an int value as "%X".
std::string String::FormatHexInt(int value) {
return FormatHexUInt32(static_cast<UInt32>(value));
}
// Formats a byte as "%02X". // Formats a byte as "%02X".
std::string String::FormatByte(unsigned char value) { std::string String::FormatByte(unsigned char value) {
std::stringstream ss; std::stringstream ss;
@ -1992,7 +2002,7 @@ std::string StringStreamToString(::std::stringstream* ss) {
const char* const end = start + str.length(); const char* const end = start + str.length();
std::string result; std::string result;
result.reserve(2 * (end - start)); result.reserve(static_cast<size_t>(2 * (end - start)));
for (const char* ch = start; ch != end; ++ch) { for (const char* ch = start; ch != end; ++ch) {
if (*ch == '\0') { if (*ch == '\0') {
result += "\\0"; // Replaces NUL with "\\0"; result += "\\0"; // Replaces NUL with "\\0";
@ -2036,7 +2046,7 @@ TestResult::~TestResult() {
const TestPartResult& TestResult::GetTestPartResult(int i) const { const TestPartResult& TestResult::GetTestPartResult(int i) const {
if (i < 0 || i >= total_part_count()) if (i < 0 || i >= total_part_count())
internal::posix::Abort(); internal::posix::Abort();
return test_part_results_.at(i); return test_part_results_.at(static_cast<size_t>(i));
} }
// Returns the i-th test property. i can range from 0 to // Returns the i-th test property. i can range from 0 to
@ -2045,7 +2055,7 @@ const TestPartResult& TestResult::GetTestPartResult(int i) const {
const TestProperty& TestResult::GetTestProperty(int i) const { const TestProperty& TestResult::GetTestProperty(int i) const {
if (i < 0 || i >= test_property_count()) if (i < 0 || i >= test_property_count())
internal::posix::Abort(); internal::posix::Abort();
return test_properties_.at(i); return test_properties_.at(static_cast<size_t>(i));
} }
// Clears the test part results. // Clears the test part results.
@ -2776,14 +2786,14 @@ TestSuite::~TestSuite() {
// total_test_count() - 1. If i is not in that range, returns NULL. // total_test_count() - 1. If i is not in that range, returns NULL.
const TestInfo* TestSuite::GetTestInfo(int i) const { const TestInfo* TestSuite::GetTestInfo(int i) const {
const int index = GetElementOr(test_indices_, i, -1); const int index = GetElementOr(test_indices_, i, -1);
return index < 0 ? nullptr : test_info_list_[index]; return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];
} }
// Returns the i-th test among all the tests. i can range from 0 to // Returns the i-th test among all the tests. i can range from 0 to
// total_test_count() - 1. If i is not in that range, returns NULL. // total_test_count() - 1. If i is not in that range, returns NULL.
TestInfo* TestSuite::GetMutableTestInfo(int i) { TestInfo* TestSuite::GetMutableTestInfo(int i) {
const int index = GetElementOr(test_indices_, i, -1); const int index = GetElementOr(test_indices_, i, -1);
return index < 0 ? nullptr : test_info_list_[index]; return index < 0 ? nullptr : test_info_list_[static_cast<size_t>(index)];
} }
// Adds a test to this test suite. Will delete the test upon // Adds a test to this test suite. Will delete the test upon
@ -3401,7 +3411,7 @@ void TestEventRepeater::Append(TestEventListener *listener) {
TestEventListener* TestEventRepeater::Release(TestEventListener *listener) { TestEventListener* TestEventRepeater::Release(TestEventListener *listener) {
for (size_t i = 0; i < listeners_.size(); ++i) { for (size_t i = 0; i < listeners_.size(); ++i) {
if (listeners_[i] == listener) { if (listeners_[i] == listener) {
listeners_.erase(listeners_.begin() + i); listeners_.erase(listeners_.begin() + static_cast<int>(i));
return listener; return listener;
} }
} }
@ -3424,8 +3434,8 @@ void TestEventRepeater::Name(const Type& parameter) { \
#define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \ #define GTEST_REVERSE_REPEATER_METHOD_(Name, Type) \
void TestEventRepeater::Name(const Type& parameter) { \ void TestEventRepeater::Name(const Type& parameter) { \
if (forwarding_enabled_) { \ if (forwarding_enabled_) { \
for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { \ for (size_t i = listeners_.size(); i != 0; i--) { \
listeners_[i]->Name(parameter); \ listeners_[i - 1]->Name(parameter); \
} \ } \
} \ } \
} }
@ -3465,8 +3475,8 @@ void TestEventRepeater::OnTestIterationStart(const UnitTest& unit_test,
void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test, void TestEventRepeater::OnTestIterationEnd(const UnitTest& unit_test,
int iteration) { int iteration) {
if (forwarding_enabled_) { if (forwarding_enabled_) {
for (int i = static_cast<int>(listeners_.size()) - 1; i >= 0; i--) { for (size_t i = listeners_.size(); i > 0; i--) {
listeners_[i]->OnTestIterationEnd(unit_test, iteration); listeners_[i - 1]->OnTestIterationEnd(unit_test, iteration);
} }
} }
} }
@ -4069,7 +4079,7 @@ static std::string FormatEpochTimeInMillisAsRFC3339(TimeInMillis ms) {
String::FormatIntWidth2(time_struct.tm_sec) + "Z"; String::FormatIntWidth2(time_struct.tm_sec) + "Z";
} }
static inline std::string Indent(int width) { static inline std::string Indent(size_t width) {
return std::string(width, ' '); return std::string(width, ' ');
} }
@ -4726,8 +4736,7 @@ void UnitTest::AddTestPartResult(
if (impl_->gtest_trace_stack().size() > 0) { if (impl_->gtest_trace_stack().size() > 0) {
msg << "\n" << GTEST_NAME_ << " trace:"; msg << "\n" << GTEST_NAME_ << " trace:";
for (int i = static_cast<int>(impl_->gtest_trace_stack().size()); for (size_t i = impl_->gtest_trace_stack().size(); i > 0; --i) {
i > 0; --i) {
const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1]; const internal::TraceInfo& trace = impl_->gtest_trace_stack()[i - 1];
msg << "\n" << internal::FormatFileLocation(trace.file, trace.line) msg << "\n" << internal::FormatFileLocation(trace.file, trace.line)
<< " " << trace.message; << " " << trace.message;
@ -5237,7 +5246,7 @@ bool UnitTestImpl::RunAllTests() {
// Shuffles test suites and tests if requested. // Shuffles test suites and tests if requested.
if (has_tests_to_run && GTEST_FLAG(shuffle)) { if (has_tests_to_run && GTEST_FLAG(shuffle)) {
random()->Reseed(random_seed_); random()->Reseed(static_cast<UInt32>(random_seed_));
// This should be done before calling OnTestIterationStart(), // This should be done before calling OnTestIterationStart(),
// such that a test event listener can see the actual test order // such that a test event listener can see the actual test order
// in the event. // in the event.

View File

@ -884,10 +884,12 @@ class MockDeathTestFactory : public DeathTestFactory {
int AssumeRoleCalls() const { return assume_role_calls_; } int AssumeRoleCalls() const { return assume_role_calls_; }
int WaitCalls() const { return wait_calls_; } int WaitCalls() const { return wait_calls_; }
size_t PassedCalls() const { return passed_args_.size(); } size_t PassedCalls() const { return passed_args_.size(); }
bool PassedArgument(int n) const { return passed_args_[n]; } bool PassedArgument(int n) const {
return passed_args_[static_cast<size_t>(n)];
}
size_t AbortCalls() const { return abort_args_.size(); } size_t AbortCalls() const { return abort_args_.size(); }
DeathTest::AbortReason AbortArgument(int n) const { DeathTest::AbortReason AbortArgument(int n) const {
return abort_args_[n]; return abort_args_[static_cast<size_t>(n)];
} }
bool TestDeleted() const { return test_deleted_; } bool TestDeleted() const { return test_deleted_; }

View File

@ -1048,7 +1048,7 @@ class AtomicCounterWithMutex {
pthread_mutex_init(&memory_barrier_mutex, nullptr)); pthread_mutex_init(&memory_barrier_mutex, nullptr));
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex)); GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&memory_barrier_mutex));
SleepMilliseconds(random_.Generate(30)); SleepMilliseconds(static_cast<int>(random_.Generate(30)));
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex)); GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&memory_barrier_mutex));
GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex)); GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&memory_barrier_mutex));
@ -1056,7 +1056,7 @@ class AtomicCounterWithMutex {
// On Windows, performing an interlocked access puts up a memory barrier. // On Windows, performing an interlocked access puts up a memory barrier.
volatile LONG dummy = 0; volatile LONG dummy = 0;
::InterlockedIncrement(&dummy); ::InterlockedIncrement(&dummy);
SleepMilliseconds(random_.Generate(30)); SleepMilliseconds(static_cast<int>(random_.Generate(30)));
::InterlockedIncrement(&dummy); ::InterlockedIncrement(&dummy);
#else #else
# error "Memory barrier not implemented on this platform." # error "Memory barrier not implemented on this platform."

View File

@ -899,23 +899,23 @@ TEST(ContainerUtilityDeathTest, ShuffleRange) {
class VectorShuffleTest : public Test { class VectorShuffleTest : public Test {
protected: protected:
static const int kVectorSize = 20; static const size_t kVectorSize = 20;
VectorShuffleTest() : random_(1) { VectorShuffleTest() : random_(1) {
for (int i = 0; i < kVectorSize; i++) { for (int i = 0; i < static_cast<int>(kVectorSize); i++) {
vector_.push_back(i); vector_.push_back(i);
} }
} }
static bool VectorIsCorrupt(const TestingVector& vector) { static bool VectorIsCorrupt(const TestingVector& vector) {
if (kVectorSize != static_cast<int>(vector.size())) { if (kVectorSize != vector.size()) {
return true; return true;
} }
bool found_in_vector[kVectorSize] = { false }; bool found_in_vector[kVectorSize] = { false };
for (size_t i = 0; i < vector.size(); i++) { for (size_t i = 0; i < vector.size(); i++) {
const int e = vector[i]; const int e = vector[i];
if (e < 0 || e >= kVectorSize || found_in_vector[e]) { if (e < 0 || e >= static_cast<int>(kVectorSize) || found_in_vector[e]) {
return true; return true;
} }
found_in_vector[e] = true; found_in_vector[e] = true;
@ -932,7 +932,7 @@ class VectorShuffleTest : public Test {
static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) { static bool RangeIsShuffled(const TestingVector& vector, int begin, int end) {
for (int i = begin; i < end; i++) { for (int i = begin; i < end; i++) {
if (i != vector[i]) { if (i != vector[static_cast<size_t>(i)]) {
return true; return true;
} }
} }
@ -956,7 +956,7 @@ class VectorShuffleTest : public Test {
TestingVector vector_; TestingVector vector_;
}; // class VectorShuffleTest }; // class VectorShuffleTest
const int VectorShuffleTest::kVectorSize; const size_t VectorShuffleTest::kVectorSize;
TEST_F(VectorShuffleTest, HandlesEmptyRange) { TEST_F(VectorShuffleTest, HandlesEmptyRange) {
// Tests an empty range at the beginning... // Tests an empty range at the beginning...
@ -1008,7 +1008,7 @@ TEST_F(VectorShuffleTest, ShufflesEntireVector) {
// Tests the first and last elements in particular to ensure that // Tests the first and last elements in particular to ensure that
// there are no off-by-one problems in our shuffle algorithm. // there are no off-by-one problems in our shuffle algorithm.
EXPECT_NE(0, vector_[0]); EXPECT_NE(0, vector_[0]);
EXPECT_NE(kVectorSize - 1, vector_[kVectorSize - 1]); EXPECT_NE(static_cast<int>(kVectorSize - 1), vector_[kVectorSize - 1]);
} }
TEST_F(VectorShuffleTest, ShufflesStartOfVector) { TEST_F(VectorShuffleTest, ShufflesStartOfVector) {
@ -1018,7 +1018,8 @@ TEST_F(VectorShuffleTest, ShufflesStartOfVector) {
ASSERT_PRED1(VectorIsNotCorrupt, vector_); ASSERT_PRED1(VectorIsNotCorrupt, vector_);
EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize); EXPECT_PRED3(RangeIsShuffled, vector_, 0, kRangeSize);
EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize, kVectorSize); EXPECT_PRED3(RangeIsUnshuffled, vector_, kRangeSize,
static_cast<int>(kVectorSize));
} }
TEST_F(VectorShuffleTest, ShufflesEndOfVector) { TEST_F(VectorShuffleTest, ShufflesEndOfVector) {
@ -1027,23 +1028,25 @@ TEST_F(VectorShuffleTest, ShufflesEndOfVector) {
ASSERT_PRED1(VectorIsNotCorrupt, vector_); ASSERT_PRED1(VectorIsNotCorrupt, vector_);
EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, kVectorSize); EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize,
static_cast<int>(kVectorSize));
} }
TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) { TEST_F(VectorShuffleTest, ShufflesMiddleOfVector) {
int kRangeSize = kVectorSize/3; const int kRangeSize = static_cast<int>(kVectorSize) / 3;
ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_); ShuffleRange(&random_, kRangeSize, 2*kRangeSize, &vector_);
ASSERT_PRED1(VectorIsNotCorrupt, vector_); ASSERT_PRED1(VectorIsNotCorrupt, vector_);
EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize); EXPECT_PRED3(RangeIsUnshuffled, vector_, 0, kRangeSize);
EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize); EXPECT_PRED3(RangeIsShuffled, vector_, kRangeSize, 2*kRangeSize);
EXPECT_PRED3(RangeIsUnshuffled, vector_, 2*kRangeSize, kVectorSize); EXPECT_PRED3(RangeIsUnshuffled, vector_, 2 * kRangeSize,
static_cast<int>(kVectorSize));
} }
TEST_F(VectorShuffleTest, ShufflesRepeatably) { TEST_F(VectorShuffleTest, ShufflesRepeatably) {
TestingVector vector2; TestingVector vector2;
for (int i = 0; i < kVectorSize; i++) { for (size_t i = 0; i < kVectorSize; i++) {
vector2.push_back(i); vector2.push_back(static_cast<int>(i));
} }
random_.Reseed(1234); random_.Reseed(1234);
@ -1054,7 +1057,7 @@ TEST_F(VectorShuffleTest, ShufflesRepeatably) {
ASSERT_PRED1(VectorIsNotCorrupt, vector_); ASSERT_PRED1(VectorIsNotCorrupt, vector_);
ASSERT_PRED1(VectorIsNotCorrupt, vector2); ASSERT_PRED1(VectorIsNotCorrupt, vector2);
for (int i = 0; i < kVectorSize; i++) { for (size_t i = 0; i < kVectorSize; i++) {
EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i; EXPECT_EQ(vector_[i], vector2[i]) << " where i is " << i;
} }
} }
@ -3496,7 +3499,7 @@ std::string EditsToString(const std::vector<EditType>& edits) {
std::vector<size_t> CharsToIndices(const std::string& str) { std::vector<size_t> CharsToIndices(const std::string& str) {
std::vector<size_t> out; std::vector<size_t> out;
for (size_t i = 0; i < str.size(); ++i) { for (size_t i = 0; i < str.size(); ++i) {
out.push_back(str[i]); out.push_back(static_cast<size_t>(str[i]));
} }
return out; return out;
} }
@ -5654,11 +5657,11 @@ class ParseFlagsTest : public Test {
// Asserts that two narrow or wide string arrays are equal. // Asserts that two narrow or wide string arrays are equal.
template <typename CharType> template <typename CharType>
static void AssertStringArrayEq(size_t size1, CharType** array1, static void AssertStringArrayEq(int size1, CharType** array1, int size2,
size_t size2, CharType** array2) { CharType** array2) {
ASSERT_EQ(size1, size2) << " Array sizes different."; ASSERT_EQ(size1, size2) << " Array sizes different.";
for (size_t i = 0; i != size1; i++) { for (int i = 0; i != size1; i++) {
ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i; ASSERT_STREQ(array1[i], array2[i]) << " where i == " << i;
} }
} }