Fix MSVC warning C4244.
This warns about potential value truncation. Instead of disabling
the warning, fix it, generally by adding explicit casts to make it
clear that a type change is occurring.
Change-Id: I737f9080a86adeaa2afb461fe9429dc1dcb5d6c3
Reviewed-on: https://code-review.googlesource.com/1441
Reviewed-by: Paul Wankadia <[email protected]>
diff --git a/re2/compile.cc b/re2/compile.cc
index e92baeb..e5d6088 100644
--- a/re2/compile.cc
+++ b/re2/compile.cc
@@ -435,7 +435,10 @@
if (empty & (kEmptyWordBoundary|kEmptyNonWordBoundary)) {
int j;
for (int i = 0; i < 256; i = j) {
- for (j = i+1; j < 256 && Prog::IsWordChar(i) == Prog::IsWordChar(j); j++)
+ for (j = i + 1; j < 256 &&
+ Prog::IsWordChar(static_cast<uint8>(i)) ==
+ Prog::IsWordChar(static_cast<uint8>(j));
+ j++)
;
prog_->MarkByteRange(i, j-1);
}
@@ -558,7 +561,8 @@
return;
if (hi > 0xFF)
hi = 0xFF;
- AddSuffix(RuneByteSuffix(lo, hi, foldcase, 0));
+ AddSuffix(RuneByteSuffix(static_cast<uint8>(lo), static_cast<uint8>(hi),
+ foldcase, 0));
}
// Table describing how to make a UTF-8 matching machine
@@ -599,7 +603,8 @@
int next = 0;
if (p.next >= 0)
next = inst[p.next];
- inst[i] = UncachedRuneByteSuffix(p.lo, p.hi, false, next);
+ inst[i] = UncachedRuneByteSuffix(static_cast<uint8>(p.lo),
+ static_cast<uint8>(p.hi), false, next);
if ((p.lo & 0xC0) != 0x80)
AddSuffix(inst[i]);
}
@@ -628,7 +633,8 @@
// ASCII range is always a special case.
if (hi < Runeself) {
- AddSuffix(RuneByteSuffix(lo, hi, foldcase, 0));
+ AddSuffix(RuneByteSuffix(static_cast<uint8>(lo), static_cast<uint8>(hi),
+ foldcase, 0));
return;
}
@@ -982,7 +988,7 @@
if (m > Prog::Inst::kMaxInst)
m = Prog::Inst::kMaxInst;
- max_inst_ = m;
+ max_inst_ = static_cast<int>(m);
}
anchor_ = anchor;
diff --git a/re2/dfa.cc b/re2/dfa.cc
index d1e31c3..0b9a009 100644
--- a/re2/dfa.cc
+++ b/re2/dfa.cc
@@ -143,7 +143,7 @@
if (sizeof(size_t) == sizeof(uint32))
return Hash32StringWithSeed(s, len, a->flag_);
else
- return Hash64StringWithSeed(s, len, a->flag_);
+ return static_cast<size_t>(Hash64StringWithSeed(s, len, a->flag_));
}
#ifdef STL_MSVC
// Less than operator.
@@ -1016,7 +1016,7 @@
// byte processed was a word character. Use that info to
// insert empty-width (non-)word boundaries.
bool islastword = state->flag_ & kFlagLastWord;
- bool isword = (c != kByteEndText && Prog::IsWordChar(c));
+ bool isword = (c != kByteEndText && Prog::IsWordChar(static_cast<uint8>(c)));
if (isword == islastword)
beforeflag |= kEmptyNonWordBoundary;
else
@@ -2036,7 +2036,7 @@
if (ns == FullMatchState ||
(ns > SpecialStateMax && ns->ninst_ > 0)) {
extended = true;
- min->append(1, j);
+ min->append(1, static_cast<char>(j));
s = ns;
break;
}
@@ -2066,7 +2066,7 @@
if (ns == FullMatchState ||
(ns > SpecialStateMax && ns->ninst_ > 0)) {
extended = true;
- max->append(1, j);
+ max->append(1, static_cast<char>(j));
s = ns;
break;
}
diff --git a/re2/nfa.cc b/re2/nfa.cc
index 57a18fe..3ca275e 100644
--- a/re2/nfa.cc
+++ b/re2/nfa.cc
@@ -468,7 +468,7 @@
if (text.begin() > context.begin()) {
c = text.begin()[-1] & 0xFF;
- wasword = Prog::IsWordChar(c);
+ wasword = Prog::IsWordChar(static_cast<uint8>(c));
}
// Loop over the text, stepping the machine.
diff --git a/re2/parse.cc b/re2/parse.cc
index 5236265..3c15bbd 100644
--- a/re2/parse.cc
+++ b/re2/parse.cc
@@ -1147,7 +1147,7 @@
if (r >= 0) {
re1->op_ = kRegexpLiteral;
re1->rune_ = r;
- re1->parse_flags_ = flags;
+ re1->parse_flags_ = static_cast<uint16>(flags);
return true;
}
diff --git a/re2/prog.cc b/re2/prog.cc
index f326ffd..499f560 100644
--- a/re2/prog.cc
+++ b/re2/prog.cc
@@ -25,7 +25,7 @@
set_out_opcode(out, kInstByteRange);
lo_ = lo & 0xFF;
hi_ = hi & 0xFF;
- foldcase_ = foldcase;
+ foldcase_ = foldcase & 0xFF;
}
void Prog::Inst::InitCapture(int cap, uint32 out) {
@@ -327,12 +327,12 @@
bytemap_range_ = bytemap_[255] + 1;
unbytemap_ = new uint8[bytemap_range_];
for (int i = 0; i < 256; i++)
- unbytemap_[bytemap_[i]] = i;
+ unbytemap_[bytemap_[i]] = static_cast<uint8>(i);
if (0) { // For debugging: use trivial byte map.
for (int i = 0; i < 256; i++) {
- bytemap_[i] = i;
- unbytemap_[i] = i;
+ bytemap_[i] = static_cast<uint8>(i);
+ unbytemap_[i] = static_cast<uint8>(i);
}
bytemap_range_ = 256;
LOG(INFO) << "Using trivial bytemap.";
diff --git a/re2/prog.h b/re2/prog.h
index 26c8676..3e6be8f 100644
--- a/re2/prog.h
+++ b/re2/prog.h
@@ -201,10 +201,10 @@
int start_unanchored() { return start_unanchored_; }
void set_start(int start) { start_ = start; }
void set_start_unanchored(int start) { start_unanchored_ = start; }
- int64 size() { return size_; }
+ int size() { return size_; }
bool reversed() { return reversed_; }
void set_reversed(bool reversed) { reversed_ = reversed; }
- int64 byte_inst_count() { return byte_inst_count_; }
+ int byte_inst_count() { return byte_inst_count_; }
const Bitmap<256>& byterange() { return byterange_; }
void set_dfa_mem(int64 dfa_mem) { dfa_mem_ = dfa_mem; }
int64 dfa_mem() { return dfa_mem_; }
diff --git a/re2/re2.cc b/re2/re2.cc
index 8da58e2..099491c 100644
--- a/re2/re2.cc
+++ b/re2/re2.cc
@@ -878,31 +878,30 @@
const StringPiece *vec, int veclen) const {
for (const char *s = rewrite.data(), *end = s + rewrite.size();
s < end; s++) {
- int c = *s;
- if (c == '\\') {
- s++;
- c = (s < end) ? *s : -1;
- if (isdigit(c)) {
- int n = (c - '0');
- if (n >= veclen) {
- if (options_.log_errors()) {
- LOG(ERROR) << "requested group " << n
- << " in regexp " << rewrite.data();
- }
- return false;
+ if (*s != '\\') {
+ out->push_back(*s);
+ continue;
+ }
+ s++;
+ int c = (s < end) ? *s : -1;
+ if (isdigit(c)) {
+ int n = (c - '0');
+ if (n >= veclen) {
+ if (options_.log_errors()) {
+ LOG(ERROR) << "requested group " << n
+ << " in regexp " << rewrite.data();
}
- StringPiece snip = vec[n];
- if (snip.size() > 0)
- out->append(snip.data(), snip.size());
- } else if (c == '\\') {
- out->push_back('\\');
- } else {
- if (options_.log_errors())
- LOG(ERROR) << "invalid rewrite pattern: " << rewrite.data();
return false;
}
+ StringPiece snip = vec[n];
+ if (snip.size() > 0)
+ out->append(snip.data(), snip.size());
+ } else if (c == '\\') {
+ out->push_back('\\');
} else {
- out->push_back(c);
+ if (options_.log_errors())
+ LOG(ERROR) << "invalid rewrite pattern: " << rewrite.data();
+ return false;
}
}
return true;
@@ -1101,7 +1100,7 @@
if (!parse_long_radix(str, n, &r, radix)) return false; // Could not parse
if ((short)r != r) return false; // Out of range
if (dest == NULL) return true;
- *(reinterpret_cast<short*>(dest)) = r;
+ *(reinterpret_cast<short*>(dest)) = (short)r;
return true;
}
@@ -1113,7 +1112,7 @@
if (!parse_ulong_radix(str, n, &r, radix)) return false; // Could not parse
if ((ushort)r != r) return false; // Out of range
if (dest == NULL) return true;
- *(reinterpret_cast<unsigned short*>(dest)) = r;
+ *(reinterpret_cast<unsigned short*>(dest)) = (ushort)r;
return true;
}
@@ -1199,7 +1198,7 @@
if (errno) return false;
if (dest == NULL) return true;
if (isfloat) {
- *(reinterpret_cast<float*>(dest)) = r;
+ *(reinterpret_cast<float*>(dest)) = (float)r;
} else {
*(reinterpret_cast<double*>(dest)) = r;
}
diff --git a/re2/regexp.cc b/re2/regexp.cc
index 3667fda..b09b5ca 100644
--- a/re2/regexp.cc
+++ b/re2/regexp.cc
@@ -14,7 +14,7 @@
// Constructor. Allocates vectors as appropriate for operator.
Regexp::Regexp(RegexpOp op, ParseFlags parse_flags)
- : op_(op),
+ : op_(static_cast<uint8>(op)),
simple_(false),
parse_flags_(static_cast<uint16>(parse_flags)),
ref_(1),
@@ -107,7 +107,7 @@
GLOBAL_MUTEX_LOCK(ref_mutex);
int r = (*ref_map)[this] - 1;
if (r < kMaxRef) {
- ref_ = r;
+ ref_ = static_cast<uint16>(r);
ref_map->erase(this);
} else {
(*ref_map)[this] = r;
@@ -651,7 +651,7 @@
if (re->parse_flags() & Latin1) {
prefix->resize(re->nrunes_);
for (int j = 0; j < re->nrunes_; j++)
- (*prefix)[j] = re->runes_[j];
+ (*prefix)[j] = static_cast<char>(re->runes_[j]);
} else {
// Convert to UTF-8 in place.
// Assume worst-case space and then trim.
@@ -660,7 +660,7 @@
for (int j = 0; j < re->nrunes_; j++) {
Rune r = re->runes_[j];
if (r < Runeself)
- *p++ = r;
+ *p++ = static_cast<char>(r);
else
p += runetochar(p, &r);
}
@@ -670,7 +670,7 @@
case kRegexpLiteral:
if ((re->parse_flags() & Latin1) || re->rune_ < Runeself) {
- prefix->append(1, re->rune_);
+ prefix->append(1, static_cast<char>(re->rune_));
} else {
char buf[UTFmax];
prefix->append(buf, runetochar(buf, &re->rune_));
diff --git a/re2/tostring.cc b/re2/tostring.cc
index 56ca7df..5438c67 100644
--- a/re2/tostring.cc
+++ b/re2/tostring.cc
@@ -120,13 +120,13 @@
static void AppendLiteral(string *t, Rune r, bool foldcase) {
if (r != 0 && r < 0x80 && strchr("(){}[]*+?|.^$\\", r)) {
t->append(1, '\\');
- t->append(1, r);
+ t->append(1, static_cast<char>(r));
} else if (foldcase && 'a' <= r && r <= 'z') {
if ('a' <= r && r <= 'z')
r += 'A' - 'a';
t->append(1, '[');
- t->append(1, r);
- t->append(1, r + 'a' - 'A');
+ t->append(1, static_cast<char>(r));
+ t->append(1, static_cast<char>(r) + 'a' - 'A');
t->append(1, ']');
} else {
AppendCCRange(t, r, r);
@@ -297,7 +297,7 @@
if (0x20 <= r && r <= 0x7E) {
if (strchr("[]^-\\", r))
t->append("\\");
- t->append(1, r);
+ t->append(1, static_cast<char>(r));
return;
}
switch (r) {