Commit 5bed9cc9 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook GitHub Bot

enable clang warning float-conversion

Summary: Enable it as an error and fix all resulting build failures in folly.

Reviewed By: luciang

Differential Revision: D33838564

fbshipit-source-id: 13130e4b9c090db6a4ec7c8fcd150d6aa9c000b9
parent a88662de
...@@ -222,7 +222,7 @@ static std::pair<double, UserCounters> runBenchmarkGetNSPerIterationEstimate( ...@@ -222,7 +222,7 @@ static std::pair<double, UserCounters> runBenchmarkGetNSPerIterationEstimate(
// We do measurements in several epochs to account for jitter. // We do measurements in several epochs to account for jitter.
constexpr unsigned int epochs = 1000; constexpr unsigned int epochs = 1000;
size_t actualEpochs = 0; size_t actualEpochs = 0;
const unsigned int estimateCount = max(1.0, 5e+7 / estPerIter); const unsigned int estimateCount = to_integral(max(1.0, 5e+7 / estPerIter));
std::vector<EpochResultType> epochResults(epochs); std::vector<EpochResultType> epochResults(epochs);
const auto maxRunTime = seconds(5); const auto maxRunTime = seconds(5);
auto globalStart = high_resolution_clock::now(); auto globalStart = high_resolution_clock::now();
......
...@@ -390,7 +390,7 @@ std::string prettyPrint(double val, PrettyType type, bool addSpace) { ...@@ -390,7 +390,7 @@ std::string prettyPrint(double val, PrettyType type, bool addSpace) {
buf, buf,
sizeof buf, sizeof buf,
"%.4g%s%s", "%.4g%s%s",
(suffixes[i].val ? (val / suffixes[i].val) : val), (suffixes[i].val != 0. ? (val / suffixes[i].val) : val),
(addSpace ? " " : ""), (addSpace ? " " : ""),
suffixes[i].suffix); suffixes[i].suffix);
return std::string(buf); return std::string(buf);
...@@ -434,8 +434,8 @@ double prettyToDouble( ...@@ -434,8 +434,8 @@ double prettyToDouble(
"Unable to parse suffix \"", *prettyString, "\"")); "Unable to parse suffix \"", *prettyString, "\""));
} }
prettyString->advance(size_t(longestPrefixLen)); prettyString->advance(size_t(longestPrefixLen));
return suffixes[bestPrefixId].val ? value * suffixes[bestPrefixId].val return suffixes[bestPrefixId].val != 0. ? value * suffixes[bestPrefixId].val
: value; : value;
} }
double prettyToDouble(folly::StringPiece prettyString, const PrettyType type) { double prettyToDouble(folly::StringPiece prettyString, const PrettyType type) {
......
...@@ -266,7 +266,7 @@ class alignas(64) BucketTable { ...@@ -266,7 +266,7 @@ class alignas(64) BucketTable {
(folly::popcount(max_size_ - 1) + ShardBits <= 32))); (folly::popcount(max_size_ - 1) + ShardBits <= 32)));
auto buckets = Buckets::create(initial_buckets, cohort); auto buckets = Buckets::create(initial_buckets, cohort);
buckets_.store(buckets, std::memory_order_release); buckets_.store(buckets, std::memory_order_release);
load_factor_nodes_ = initial_buckets * load_factor_; load_factor_nodes_ = to_integral(initial_buckets * load_factor_);
bucket_count_.store(initial_buckets, std::memory_order_relaxed); bucket_count_.store(initial_buckets, std::memory_order_relaxed);
} }
...@@ -332,7 +332,7 @@ class alignas(64) BucketTable { ...@@ -332,7 +332,7 @@ class alignas(64) BucketTable {
auto buckets = buckets_.load(std::memory_order_relaxed); auto buckets = buckets_.load(std::memory_order_relaxed);
DCHECK(buckets); // Use-after-destruction by user. DCHECK(buckets); // Use-after-destruction by user.
auto newbuckets = Buckets::create(bucket_count, cohort); auto newbuckets = Buckets::create(bucket_count, cohort);
load_factor_nodes_ = bucket_count * load_factor_; load_factor_nodes_ = to_integral(bucket_count * load_factor_);
for (size_t i = 0; i < oldcount; i++) { for (size_t i = 0; i < oldcount; i++) {
auto bucket = &buckets->buckets_[i](); auto bucket = &buckets->buckets_[i]();
auto node = bucket->load(std::memory_order_relaxed); auto node = bucket->load(std::memory_order_relaxed);
...@@ -1556,7 +1556,8 @@ class alignas(64) SIMDTable { ...@@ -1556,7 +1556,8 @@ class alignas(64) SIMDTable {
} }
auto new_chunks = Chunks::create(new_chunk_count, cohort); auto new_chunks = Chunks::create(new_chunk_count, cohort);
auto old_chunks = chunks_.load(std::memory_order_relaxed); auto old_chunks = chunks_.load(std::memory_order_relaxed);
grow_threshold_ = new_chunk_count * Chunk::kCapacity * load_factor_; grow_threshold_ =
to_integral(new_chunk_count * Chunk::kCapacity * load_factor_);
for (size_t i = 0; i < old_chunk_count; i++) { for (size_t i = 0; i < old_chunk_count; i++) {
DCHECK(old_chunks); // Use-after-destruction by user. DCHECK(old_chunks); // Use-after-destruction by user.
......
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
#include <folly/ConstexprMath.h> #include <folly/ConstexprMath.h>
#include <folly/Likely.h> #include <folly/Likely.h>
#include <folly/Random.h> #include <folly/Random.h>
#include <folly/Utility.h>
namespace folly { namespace folly {
...@@ -164,7 +165,7 @@ class Coinflip { ...@@ -164,7 +165,7 @@ class Coinflip {
// is a user-initialized state and that this shouldn't automatically // is a user-initialized state and that this shouldn't automatically
// generate an event. // generate an event.
double U = Random::randDouble01(std::forward<RNG>(rng)); double U = Random::randDouble01(std::forward<RNG>(rng));
return -log(1 - U) * kScale + 1; return to_integral(-log(1 - U) * kScale + 1);
} }
template <class RNG = ThreadLocalPRNG> template <class RNG = ThreadLocalPRNG>
...@@ -182,7 +183,7 @@ class Coinflip { ...@@ -182,7 +183,7 @@ class Coinflip {
// will only happen when *counter is manually initialized to 0. // will only happen when *counter is manually initialized to 0.
return coinflip_naive(wait, std::forward<RNG>(rng)); return coinflip_naive(wait, std::forward<RNG>(rng));
} }
const uint64_t step_precise = -log(1 - 1.0 / wait) * kScale; const uint64_t step_precise = to_integral(-log(1 - 1.0 / wait) * kScale);
// The false positive rate is close to 50% when wait is a power of 2 and // The false positive rate is close to 50% when wait is a power of 2 and
// is close to 0% when wait-1 is a power of 2. // is close to 0% when wait-1 is a power of 2.
return old_counter <= step_precise; return old_counter <= step_precise;
......
...@@ -28,7 +28,7 @@ QuotientMultiSetBuilder::QuotientMultiSetBuilder( ...@@ -28,7 +28,7 @@ QuotientMultiSetBuilder::QuotientMultiSetBuilder(
size_t keyBits, size_t expectedElements, double loadFactor) size_t keyBits, size_t expectedElements, double loadFactor)
: keyBits_(keyBits), maxKey_(qms_detail::maxValue(keyBits_)) { : keyBits_(keyBits), maxKey_(qms_detail::maxValue(keyBits_)) {
expectedElements = std::max<size_t>(expectedElements, 1); expectedElements = std::max<size_t>(expectedElements, 1);
uint64_t numSlots = ceil(expectedElements / loadFactor); uint64_t numSlots = to_integral(ceil(expectedElements / loadFactor));
// Make sure 1:1 mapping between key space and <divisor, remainder> pairs. // Make sure 1:1 mapping between key space and <divisor, remainder> pairs.
divisor_ = divCeil(maxKey_, numSlots); divisor_ = divCeil(maxKey_, numSlots);
......
...@@ -30,7 +30,7 @@ std::vector<uint8_t> buffer(kBufferSize + 16); ...@@ -30,7 +30,7 @@ std::vector<uint8_t> buffer(kBufferSize + 16);
template <class T> template <class T>
void benchmarkSet(size_t n, T) { void benchmarkSet(size_t n, T) {
size_t size = sizeof(T) * 6.9; // use 6.9 bits/byte size_t size = folly::to_integral(sizeof(T) * 6.9); // use 6.9 bits/byte
const size_t k = 16; const size_t k = 16;
T values[k]; T values[k];
BENCHMARK_SUSPEND { BENCHMARK_SUSPEND {
...@@ -78,7 +78,7 @@ std::atomic<int64_t> sum(0); ...@@ -78,7 +78,7 @@ std::atomic<int64_t> sum(0);
template <class T> template <class T>
void benchmarkGet(size_t n, T x) { void benchmarkGet(size_t n, T x) {
size_t size = sizeof(T) * 6.9; // use 6.9 bits/byte size_t size = folly::to_integral(sizeof(T) * 6.9); // use 6.9 bits/byte
for (size_t i = 0; i < n; ++i) { for (size_t i = 0; i < n; ++i) {
size_t bit = (i * 2973) % (kBufferSize * 8); size_t bit = (i * 2973) % (kBufferSize * 8);
size_t drop = i % size; size_t drop = i % size;
......
...@@ -166,7 +166,7 @@ uint64_t step_approx(uint32_t wait) { ...@@ -166,7 +166,7 @@ uint64_t step_approx(uint32_t wait) {
} }
uint64_t step_exact(uint32_t wait) { uint64_t step_exact(uint32_t wait) {
return -log(1 - 1.0 / wait) * kScale; return folly::to_integral(-log(1 - 1.0 / wait) * kScale);
} }
TEST(coinflip_test, approx_ge_exact) { TEST(coinflip_test, approx_ge_exact) {
......
...@@ -503,7 +503,7 @@ ReturnType BucketedTimeSeries<VT, CT>::rangeAdjust( ...@@ -503,7 +503,7 @@ ReturnType BucketedTimeSeries<VT, CT>::rangeAdjust(
TimePoint intervalEnd = std::min(end, nextBucketStart); TimePoint intervalEnd = std::min(end, nextBucketStart);
float scale = float scale =
(intervalEnd - intervalStart) * 1.f / (nextBucketStart - bucketStart); (intervalEnd - intervalStart) * 1.f / (nextBucketStart - bucketStart);
return input * scale; return static_cast<ReturnType>(input * scale);
} }
template <typename VT, typename CT> template <typename VT, typename CT>
......
...@@ -178,8 +178,8 @@ TEST_F(BufferedSlidingWindowTest, PartiallyPassedExpiry) { ...@@ -178,8 +178,8 @@ TEST_F(BufferedSlidingWindowTest, PartiallyPassedExpiry) {
EXPECT_EQ(1, digests.size()); EXPECT_EQ(1, digests.size());
EXPECT_EQ(3, digests[0].getValues().size()); EXPECT_EQ(3, digests[0].getValues().size());
for (double i = 0; i < 3; ++i) { for (size_t i = 0; i < 3; ++i) {
EXPECT_EQ(i, digests[0].getValues()[i]); EXPECT_EQ(double(i), digests[0].getValues()[i]);
} }
} }
...@@ -197,8 +197,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) { ...@@ -197,8 +197,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) {
digests = bsw->get(); digests = bsw->get();
EXPECT_EQ(1, digests.size()); EXPECT_EQ(1, digests.size());
EXPECT_EQ(3, digests[0].getValues().size()); EXPECT_EQ(3, digests[0].getValues().size());
for (double i = 0; i < 3; ++i) { for (size_t i = 0; i < 3; ++i) {
EXPECT_EQ(i, digests[0].getValues()[i]); EXPECT_EQ(double(i), digests[0].getValues()[i]);
} }
// append 3 and flush again; 3 will be merged with // append 3 and flush again; 3 will be merged with
...@@ -208,8 +208,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) { ...@@ -208,8 +208,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) {
digests = bsw->get(); digests = bsw->get();
EXPECT_EQ(1, digests.size()); EXPECT_EQ(1, digests.size());
EXPECT_EQ(4, digests[0].getValues().size()); EXPECT_EQ(4, digests[0].getValues().size());
for (double i = 0; i < 4; ++i) { for (size_t i = 0; i < 4; ++i) {
EXPECT_EQ(i, digests[0].getValues()[i]); EXPECT_EQ(double(i), digests[0].getValues()[i]);
} }
// append 4 and do a regular get. previous values // append 4 and do a regular get. previous values
...@@ -218,8 +218,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) { ...@@ -218,8 +218,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) {
digests = bsw->get(); digests = bsw->get();
EXPECT_EQ(1, digests.size()); EXPECT_EQ(1, digests.size());
EXPECT_EQ(4, digests[0].getValues().size()); EXPECT_EQ(4, digests[0].getValues().size());
for (double i = 0; i < 4; ++i) { for (size_t i = 0; i < 4; ++i) {
EXPECT_EQ(i, digests[0].getValues()[i]); EXPECT_EQ(double(i), digests[0].getValues()[i]);
} }
// pass expiry // pass expiry
...@@ -231,8 +231,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) { ...@@ -231,8 +231,8 @@ TEST_F(BufferedSlidingWindowTest, ForceUpdate) {
EXPECT_EQ(4, digests[0].getValues().front()); EXPECT_EQ(4, digests[0].getValues().front());
EXPECT_EQ(4, digests[1].getValues().size()); EXPECT_EQ(4, digests[1].getValues().size());
for (double i = 0; i < 4; ++i) { for (size_t i = 0; i < 4; ++i) {
EXPECT_EQ(i, digests[1].getValues()[i]); EXPECT_EQ(double(i), digests[1].getValues()[i]);
} }
} }
......
...@@ -61,7 +61,7 @@ template <typename SampleDataType> ...@@ -61,7 +61,7 @@ template <typename SampleDataType>
class StreamingStatsTest : public testing::Test { class StreamingStatsTest : public testing::Test {
public: public:
void SetUp() override { void SetUp() override {
for (SampleDataType value = 1.0; value < 11.0; value += 1.0) { for (SampleDataType value = 1; value < 11; value += 1) {
stats.add(value); stats.add(value);
} }
} }
......
...@@ -352,7 +352,8 @@ static void runFairness(std::size_t numThreads) { ...@@ -352,7 +352,8 @@ static void runFairness(std::size_t numThreads) {
} }
// Calulate some stats // Calulate some stats
unsigned long sum = std::accumulate(results.begin(), results.end(), 0.0); unsigned long sum =
folly::to_integral(std::accumulate(results.begin(), results.end(), 0.0));
double m = sum / results.size(); double m = sum / results.size();
double accum = 0.0; double accum = 0.0;
......
...@@ -887,8 +887,11 @@ TEST(Expected, TestUnique) { ...@@ -887,8 +887,11 @@ TEST(Expected, TestUnique) {
2, **mk().then([](auto r) { return std::make_unique<int>(*r + 1); })); 2, **mk().then([](auto r) { return std::make_unique<int>(*r + 1); }));
// Test converting errors works // Test converting errors works
struct Convertible {
/* implicit */ operator int() const noexcept { return 17; }
};
EXPECT_EQ( EXPECT_EQ(
2, **mk().then([](auto r) -> Expected<std::unique_ptr<int>, double> { 2, **mk().then([](auto r) -> Expected<std::unique_ptr<int>, Convertible> {
return std::make_unique<int>(*r + 1); return std::make_unique<int>(*r + 1);
})); }));
} }
......
...@@ -830,7 +830,12 @@ TEST(Function, ReturnConvertible) { ...@@ -830,7 +830,12 @@ TEST(Function, ReturnConvertible) {
Function<double()> f1 = []() -> int { return 5; }; Function<double()> f1 = []() -> int { return 5; };
EXPECT_EQ(5.0, f1()); EXPECT_EQ(5.0, f1());
Function<int()> f2 = []() -> double { return 5.2; }; struct Convertible {
double value;
/* implicit */ Convertible(double v) noexcept : value{v} {}
/* implicit */ operator int() const noexcept { return int(value); }
};
Function<int()> f2 = []() -> Convertible { return 5.2; };
EXPECT_EQ(5, f2()); EXPECT_EQ(5, f2());
CDerived derived; CDerived derived;
...@@ -868,14 +873,20 @@ TEST(Function, ConvertReturnType) { ...@@ -868,14 +873,20 @@ TEST(Function, ConvertReturnType) {
}; };
struct CDerived : CBase {}; struct CDerived : CBase {};
struct Convertible {
double value;
/* implicit */ Convertible(double v) noexcept : value{v} {}
/* implicit */ operator int() const noexcept { return int(value); }
};
Function<int()> f1 = []() -> int { return 5; }; Function<int()> f1 = []() -> int { return 5; };
Function<double()> cf1 = std::move(f1); Function<double()> cf1 = std::move(f1);
EXPECT_EQ(5.0, cf1()); EXPECT_EQ(5.0, cf1());
Function<int()> ccf1 = std::move(cf1); Function<Convertible()> ccf1 = std::move(cf1);
EXPECT_EQ(5, ccf1()); EXPECT_EQ(5, ccf1());
Function<double()> f2 = []() -> double { return 5.2; }; Function<double()> f2 = []() -> double { return 5.2; };
Function<int()> cf2 = std::move(f2); Function<Convertible()> cf2 = std::move(f2);
EXPECT_EQ(5, cf2()); EXPECT_EQ(5, cf2());
Function<double()> ccf2 = std::move(cf2); Function<double()> ccf2 = std::move(cf2);
EXPECT_EQ(5.0, ccf2()); EXPECT_EQ(5.0, ccf2());
......
...@@ -37,9 +37,10 @@ void bench( ...@@ -37,9 +37,10 @@ void bench(
static std::vector<size_t> src_offsets; static std::vector<size_t> src_offsets;
BENCHMARK_SUSPEND { BENCHMARK_SUSPEND {
size_t src_buffer_size = sysconf(_SC_PAGE_SIZE) * size_t src_buffer_size = folly::to_integral(
std::ceil(static_cast<double>(max + 2 * align) / sysconf(_SC_PAGE_SIZE) *
sysconf(_SC_PAGE_SIZE)); std::ceil(
static_cast<double>(max + 2 * align) / sysconf(_SC_PAGE_SIZE)));
size_t dst_buffer_size; size_t dst_buffer_size;
if (hot) { if (hot) {
dst_buffer_size = src_buffer_size; dst_buffer_size = src_buffer_size;
......
...@@ -656,7 +656,7 @@ static void runMixed( ...@@ -656,7 +656,7 @@ static void runMixed(
std::minstd_rand engine; std::minstd_rand engine;
engine.seed(t); engine.seed(t);
long writeThreshold = writeFraction * 0x7fffffff; long writeThreshold = to_integral(writeFraction * 0x7fffffff);
Lock privateLock; Lock privateLock;
Lock* lock = useSeparateLocks ? &privateLock : &(padded.globalLock); Lock* lock = useSeparateLocks ? &privateLock : &(padded.globalLock);
Locker locker; Locker locker;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment