Address some more `-Wsign-compare` warnings.

Fixes #499.

Change-Id: I5405db7dff30ba84387c89a6064902f948b1ee3c
Reviewed-on: https://code-review.googlesource.com/c/re2/+/63370
Reviewed-by: Alex Chernyakhovsky <achernya@google.com>
Reviewed-by: Paul Wankadia <junyer@google.com>
diff --git a/re2/testing/filtered_re2_test.cc b/re2/testing/filtered_re2_test.cc
index b951d7c..6da76b2 100644
--- a/re2/testing/filtered_re2_test.cc
+++ b/re2/testing/filtered_re2_test.cc
@@ -33,14 +33,14 @@
   FilterTestVars v;
 
   v.f.Compile(&v.atoms);
-  EXPECT_EQ(0, v.atoms.size());
+  EXPECT_EQ(size_t{0}, v.atoms.size());
 
   // Compile has no effect at all when called before Add: it will not
   // record that it has been called and it will not clear the vector.
   // The second point does not matter here, but the first point means
   // that an error will be logged during the call to AllMatches.
   v.f.AllMatches("foo", v.atom_indices, &v.matches);
-  EXPECT_EQ(0, v.matches.size());
+  EXPECT_EQ(size_t{0}, v.matches.size());
 }
 
 TEST(FilteredRE2Test, SmallOrTest) {
@@ -49,10 +49,10 @@
   v.f.Add("(foo|bar)", v.opts, &id);
 
   v.f.Compile(&v.atoms);
-  EXPECT_EQ(0, v.atoms.size());
+  EXPECT_EQ(size_t{0}, v.atoms.size());
 
   v.f.AllMatches("lemurs bar", v.atom_indices, &v.matches);
-  EXPECT_EQ(1, v.matches.size());
+  EXPECT_EQ(size_t{1}, v.matches.size());
   EXPECT_EQ(id, v.matches[0]);
 }
 
@@ -63,12 +63,12 @@
   v.opts.set_encoding(RE2::Options::EncodingLatin1);
   v.f.Add("\xde\xadQ\xbe\xef", v.opts, &id);
   v.f.Compile(&v.atoms);
-  EXPECT_EQ(1, v.atoms.size());
+  EXPECT_EQ(size_t{1}, v.atoms.size());
   EXPECT_EQ(v.atoms[0], "\xde\xadq\xbe\xef");
 
   v.atom_indices.push_back(0);
   v.f.AllMatches("foo\xde\xadQ\xbe\xeflemur", v.atom_indices, &v.matches);
-  EXPECT_EQ(1, v.matches.size());
+  EXPECT_EQ(size_t{1}, v.matches.size());
   EXPECT_EQ(id, v.matches[0]);
 }
 
@@ -256,7 +256,7 @@
   FindAtomIndices(v.atoms, atoms, &atom_ids);
   std::vector<int> matching_regexps;
   v.f.AllMatches(text, atom_ids, &matching_regexps);
-  EXPECT_EQ(1, matching_regexps.size());
+  EXPECT_EQ(size_t{1}, matching_regexps.size());
 
   text = "abc12312yyyzzz";
   atoms.clear();
@@ -265,7 +265,7 @@
   atoms.push_back("yyyzzz");
   FindAtomIndices(v.atoms, atoms, &atom_ids);
   v.f.AllMatches(text, atom_ids, &matching_regexps);
-  EXPECT_EQ(1, matching_regexps.size());
+  EXPECT_EQ(size_t{1}, matching_regexps.size());
 
   text = "abcd12yyy32yyyzzz";
   atoms.clear();
@@ -278,7 +278,7 @@
   for (size_t i = 0; i < atom_ids.size(); i++)
     ABSL_LOG(INFO) << "i: " << i << " : " << atom_ids[i];
   v.f.AllMatches(text, atom_ids, &matching_regexps);
-  EXPECT_EQ(2, matching_regexps.size());
+  EXPECT_EQ(size_t{2}, matching_regexps.size());
 }
 
 TEST(FilteredRE2Test, EmptyStringInStringSetBug) {
@@ -301,43 +301,43 @@
   v1.f.Add("foo\\d+", v1.opts, &id);
   EXPECT_EQ(0, id);
   v1.f.Compile(&v1.atoms);
-  EXPECT_EQ(1, v1.atoms.size());
+  EXPECT_EQ(size_t{1}, v1.atoms.size());
   EXPECT_EQ("foo", v1.atoms[0]);
   v1.f.AllMatches("abc foo1 xyz", {0}, &v1.matches);
-  EXPECT_EQ(1, v1.matches.size());
+  EXPECT_EQ(size_t{1}, v1.matches.size());
   EXPECT_EQ(0, v1.matches[0]);
   v1.f.AllMatches("abc bar2 xyz", {0}, &v1.matches);
-  EXPECT_EQ(0, v1.matches.size());
+  EXPECT_EQ(size_t{0}, v1.matches.size());
 
   // The moved-to object should do what the moved-from object did.
   FilterTestVars v2;
   v2.f = std::move(v1.f);
   v2.f.AllMatches("abc foo1 xyz", {0}, &v2.matches);
-  EXPECT_EQ(1, v2.matches.size());
+  EXPECT_EQ(size_t{1}, v2.matches.size());
   EXPECT_EQ(0, v2.matches[0]);
   v2.f.AllMatches("abc bar2 xyz", {0}, &v2.matches);
-  EXPECT_EQ(0, v2.matches.size());
+  EXPECT_EQ(size_t{0}, v2.matches.size());
 
   // The moved-from object should have been reset and be reusable.
   v1.f.Add("bar\\d+", v1.opts, &id);
   EXPECT_EQ(0, id);
   v1.f.Compile(&v1.atoms);
-  EXPECT_EQ(1, v1.atoms.size());
+  EXPECT_EQ(size_t{1}, v1.atoms.size());
   EXPECT_EQ("bar", v1.atoms[0]);
   v1.f.AllMatches("abc foo1 xyz", {0}, &v1.matches);
-  EXPECT_EQ(0, v1.matches.size());
+  EXPECT_EQ(size_t{0}, v1.matches.size());
   v1.f.AllMatches("abc bar2 xyz", {0}, &v1.matches);
-  EXPECT_EQ(1, v1.matches.size());
+  EXPECT_EQ(size_t{1}, v1.matches.size());
   EXPECT_EQ(0, v1.matches[0]);
 
   // Verify that "overwriting" works and also doesn't leak memory.
   // (The latter will need a leak detector such as LeakSanitizer.)
   v1.f = std::move(v2.f);
   v1.f.AllMatches("abc foo1 xyz", {0}, &v1.matches);
-  EXPECT_EQ(1, v1.matches.size());
+  EXPECT_EQ(size_t{1}, v1.matches.size());
   EXPECT_EQ(0, v1.matches[0]);
   v1.f.AllMatches("abc bar2 xyz", {0}, &v1.matches);
-  EXPECT_EQ(0, v1.matches.size());
+  EXPECT_EQ(size_t{0}, v1.matches.size());
 }
 
 }  //  namespace re2
diff --git a/re2/testing/re2_test.cc b/re2/testing/re2_test.cc
index d46666b..04c040e 100644
--- a/re2/testing/re2_test.cc
+++ b/re2/testing/re2_test.cc
@@ -558,14 +558,14 @@
     RE2 re("(hello world)");
     ASSERT_EQ(re.NumberOfCapturingGroups(), 1);
     const std::map<std::string, int>& m = re.NamedCapturingGroups();
-    ASSERT_EQ(m.size(), 0);
+    ASSERT_EQ(m.size(), size_t{0});
   }
 
   {
     RE2 re("(?P<A>expr(?P<B>expr)(?P<C>expr))((expr)(?P<D>expr))");
     ASSERT_EQ(re.NumberOfCapturingGroups(), 6);
     const std::map<std::string, int>& m = re.NamedCapturingGroups();
-    ASSERT_EQ(m.size(), 4);
+    ASSERT_EQ(m.size(), size_t{4});
     ASSERT_EQ(m.find("A")->second, 1);
     ASSERT_EQ(m.find("B")->second, 2);
     ASSERT_EQ(m.find("C")->second, 3);
@@ -687,7 +687,7 @@
   absl::string_view sp;
   // string_view-arg
   ASSERT_TRUE(RE2::FullMatch("ruby:1234", "(\\w+):(\\d+)", &sp, &i));
-  ASSERT_EQ(sp.size(), 4);
+  ASSERT_EQ(sp.size(), size_t{4});
   ASSERT_TRUE(memcmp(sp.data(), "ruby", 4) == 0);
   ASSERT_EQ(i, 1234);
 }
@@ -797,6 +797,11 @@
     ASSERT_EQ(c, 'H');
   }
   {
+    signed char c;
+    ASSERT_TRUE(RE2::FullMatch("Hello", "(H)ello", &c));
+    ASSERT_EQ(c, static_cast<signed char>('H'));
+  }
+  {
     unsigned char c;
     ASSERT_TRUE(RE2::FullMatch("Hello", "(H)ello", &c));
     ASSERT_EQ(c, static_cast<unsigned char>('H'));
@@ -841,7 +846,7 @@
   {
     uint32_t v;
     static const uint32_t max = UINT32_C(0xffffffff);
-    ASSERT_TRUE(RE2::FullMatch("100",         "(\\d+)", &v)); ASSERT_EQ(v, 100);
+    ASSERT_TRUE(RE2::FullMatch("100",         "(\\d+)", &v)); ASSERT_EQ(v, uint32_t{100});
     ASSERT_TRUE(RE2::FullMatch("4294967295",  "(\\d+)", &v)); ASSERT_EQ(v, max);
     ASSERT_FALSE(RE2::FullMatch("4294967296", "(\\d+)", &v));
     ASSERT_FALSE(RE2::FullMatch("-1",         "(\\d+)", &v));
@@ -879,7 +884,7 @@
     static const uint64_t max = UINT64_C(0xffffffffffffffff);
     std::string str;
 
-    ASSERT_TRUE(RE2::FullMatch("100",  "(-?\\d+)", &v));  ASSERT_EQ(v, 100);
+    ASSERT_TRUE(RE2::FullMatch("100",  "(-?\\d+)", &v));  ASSERT_EQ(v, uint64_t{100});
     ASSERT_TRUE(RE2::FullMatch("-100", "(-?\\d+)", &v2)); ASSERT_EQ(v2, -100);
 
     str = std::to_string(max);
@@ -897,11 +902,11 @@
     float v;
     ASSERT_TRUE(RE2::FullMatch("100",   "(.*)", &v)); ASSERT_EQ(v, 100);
     ASSERT_TRUE(RE2::FullMatch("-100.", "(.*)", &v)); ASSERT_EQ(v, -100);
-    ASSERT_TRUE(RE2::FullMatch("1e23",  "(.*)", &v)); ASSERT_EQ(v, float(1e23));
+    ASSERT_TRUE(RE2::FullMatch("1e23",  "(.*)", &v)); ASSERT_EQ(v, float{1e23});
     ASSERT_TRUE(RE2::FullMatch(" 100",  "(.*)", &v)); ASSERT_EQ(v, 100);
 
     ASSERT_TRUE(RE2::FullMatch(zeros + "1e23",  "(.*)", &v));
-    ASSERT_EQ(v, float(1e23));
+    ASSERT_EQ(v, float{1e23});
 
     // 6700000000081920.1 is an edge case.
     // 6700000000081920 is exactly halfway between
@@ -930,9 +935,11 @@
     double v;
     ASSERT_TRUE(RE2::FullMatch("100",   "(.*)", &v)); ASSERT_EQ(v, 100);
     ASSERT_TRUE(RE2::FullMatch("-100.", "(.*)", &v)); ASSERT_EQ(v, -100);
-    ASSERT_TRUE(RE2::FullMatch("1e23",  "(.*)", &v)); ASSERT_EQ(v, 1e23);
+    ASSERT_TRUE(RE2::FullMatch("1e23",  "(.*)", &v)); ASSERT_EQ(v, double{1e23});
+    ASSERT_TRUE(RE2::FullMatch(" 100",  "(.*)", &v)); ASSERT_EQ(v, 100);
+
     ASSERT_TRUE(RE2::FullMatch(zeros + "1e23", "(.*)", &v));
-    ASSERT_EQ(v, double(1e23));
+    ASSERT_EQ(v, double{1e23});
 
     ASSERT_TRUE(RE2::FullMatch("0.1", "(.*)", &v));
     ASSERT_EQ(v, 0.1) << absl::StrFormat("%.17g != %.17g", v, 0.1);
diff --git a/re2/testing/regexp_test.cc b/re2/testing/regexp_test.cc
index e971bd0..edbbe08 100644
--- a/re2/testing/regexp_test.cc
+++ b/re2/testing/regexp_test.cc
@@ -54,8 +54,8 @@
   EXPECT_EQ(4, x->NumCaptures());
   const std::map<std::string, int>* have = x->NamedCaptures();
   EXPECT_TRUE(have != NULL);
-  EXPECT_EQ(2, have->size());  // there are only two named groups in
-                               // the regexp: 'g1' and 'g2'.
+  // there are only two named groups in the regexp: 'g1' and 'g2'.
+  EXPECT_EQ(size_t{2}, have->size());
   std::map<std::string, int> want;
   want["g1"] = 1;
   want["g2"] = 3;
@@ -73,7 +73,7 @@
   EXPECT_EQ(4, x->NumCaptures());
   const std::map<int, std::string>* have = x->CaptureNames();
   EXPECT_TRUE(have != NULL);
-  EXPECT_EQ(3, have->size());
+  EXPECT_EQ(size_t{3}, have->size());
   std::map<int, std::string> want;
   want[1] = "g1";
   want[3] = "g2";
diff --git a/re2/testing/set_test.cc b/re2/testing/set_test.cc
index 5962295..b4aaf92 100644
--- a/re2/testing/set_test.cc
+++ b/re2/testing/set_test.cc
@@ -28,16 +28,16 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("foobar", &v), true);
-  ASSERT_EQ(v.size(), 2);
+  ASSERT_EQ(v.size(), size_t{2});
   ASSERT_EQ(v[0], 0);
   ASSERT_EQ(v[1], 1);
 
   ASSERT_EQ(s.Match("fooba", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("oobar", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 1);
 }
 
@@ -56,21 +56,21 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("foobar", &v), true);
-  ASSERT_EQ(v.size(), 2);
+  ASSERT_EQ(v.size(), size_t{2});
   ASSERT_EQ(v[0], 0);
   ASSERT_EQ(v[1], 1);
 
   ASSERT_EQ(s.Match("obarfoobaroo", &v), true);
-  ASSERT_EQ(v.size(), 2);
+  ASSERT_EQ(v.size(), size_t{2});
   ASSERT_EQ(v[0], 0);
   ASSERT_EQ(v[1], 1);
 
   ASSERT_EQ(s.Match("fooba", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("oobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 }
 
 TEST(Set, UnanchoredDollar) {
@@ -84,11 +84,11 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("foo", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("foobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 }
 
 TEST(Set, UnanchoredWordBoundary) {
@@ -103,14 +103,14 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("foo", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("foobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("foo bar", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 }
 
@@ -130,20 +130,20 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("foobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("fooba", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("oobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("foo", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("bar", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 1);
 }
 
@@ -157,10 +157,10 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("foobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 }
 
 TEST(Set, EmptyAnchored) {
@@ -173,10 +173,10 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("foobar", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 }
 
 TEST(Set, Prefix) {
@@ -191,14 +191,14 @@
 
   std::vector<int> v;
   ASSERT_EQ(s.Match("/prefix", &v), false);
-  ASSERT_EQ(v.size(), 0);
+  ASSERT_EQ(v.size(), size_t{0});
 
   ASSERT_EQ(s.Match("/prefix/", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 
   ASSERT_EQ(s.Match("/prefix/42", &v), true);
-  ASSERT_EQ(v.size(), 1);
+  ASSERT_EQ(v.size(), size_t{1});
   ASSERT_EQ(v[0], 0);
 }
 
diff --git a/re2/testing/string_generator_test.cc b/re2/testing/string_generator_test.cc
index 62868d5..9098434 100644
--- a/re2/testing/string_generator_test.cc
+++ b/re2/testing/string_generator_test.cc
@@ -47,7 +47,7 @@
     EXPECT_TRUE(g.HasNext());
     absl::string_view sp = g.Next();
     EXPECT_EQ(sp.data(), static_cast<const char*>(NULL));
-    EXPECT_EQ(sp.size(), 0);
+    EXPECT_EQ(sp.size(), size_t{0});
   }
 
   while (g.HasNext()) {