From: Francesco Chemolli Date: Mon, 30 Mar 2020 21:22:45 +0000 (+0000) Subject: Fix clang-10 build [-Wimplicit-int-float-conversion] (#582) X-Git-Tag: SQUID_5_0_2~6 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=ce17bf7022db9b3bb34eea64cfa56998958e7e8a;p=thirdparty%2Fsquid.git Fix clang-10 build [-Wimplicit-int-float-conversion] (#582) Converting std::chrono::nanoseconds::rep to double may lead to rounding errors [-Wimplicit-int-float-conversion]. Use explicit cast to signal that we want to ignore those errors in the max-value checking context. Also polished CheckTimeValue()-related code. --- diff --git a/src/cache_cf.cc b/src/cache_cf.cc index f694fe3d47..b022270a60 100644 --- a/src/cache_cf.cc +++ b/src/cache_cf.cc @@ -1115,18 +1115,17 @@ parseTimeUnit(const char *unitName, std::chrono::nanoseconds &ns) } static std::chrono::nanoseconds -CheckTimeValue(const double value, const std::chrono::nanoseconds &unit) +ToNanoSeconds(const double value, const std::chrono::nanoseconds &unit) { - if (value < 0) + if (value < 0.0) throw TexcHere("time must have a positive value"); - const auto maxNanoseconds = std::chrono::nanoseconds::max().count(); - if (value > maxNanoseconds/static_cast(unit.count())) { - const auto maxYears = maxNanoseconds/(HoursPerYear*3600*1000000000); + if (value > (static_cast(std::chrono::nanoseconds::max().count()) / unit.count())) { + const auto maxYears = std::chrono::duration_cast(std::chrono::nanoseconds::max()).count()/HoursPerYear; throw TexcHere(ToSBuf("time values cannot exceed ", maxYears, " years")); } - return std::chrono::nanoseconds(static_cast(unit.count() * value)); + return std::chrono::duration_cast(unit * value); } template @@ -1166,7 +1165,7 @@ parseTimeLine() (void)ConfigParser::NextToken(); - const auto nanoseconds = CheckTimeValue(parsedValue, parsedUnitDuration); + const auto nanoseconds = ToNanoSeconds(parsedValue, parsedUnitDuration); // validate precisions (time-units-small only) if (TimeUnit(1) <= std::chrono::microseconds(1)) { @@ -4967,7 +4966,7 @@ ParseUrlRewriteTimeout() ": WARNING: missing time unit, using deprecated default '" << T_SECOND_STR << "'"); } - const auto nanoseconds = CheckTimeValue(parsedTimeValue, parsedUnitDuration); + const auto nanoseconds = ToNanoSeconds(parsedTimeValue, parsedUnitDuration); return FromNanoseconds(nanoseconds, parsedTimeValue); }