On 25/02/21 13:46 +0000, Cassio Neri via Libstdc++ wrote:
Hi Jonathan,
The issue is that I didn't cast __dp.count() to uint32_t:
- const auto __r0 = __dp.count() + __r2_e3;
+ const auto __r0 = static_cast<uint32_t>(__dp.count()) + __r2_e3;
The above would be a better fix. Indeed, __r0 belongs to [0, 2^32[ which allows
all arithmetics that follow to be performed on uint32_t values. For performance
this is better than using signed integers.
OK, I'll make that change shortly, thanks.
I wrongly assumed __dp.count() was int32_t which would make __r0 also uint32_t.
It turns out, it is int64_t so are __r0 and other expressions including
__y1 + __z2. Hence, we're losing a bit of performance. I'm glad the compiler
warned us. (Although I don't understand why I didn't get the warning.)
You won't see it without -Wsystem-headers because warnings are
suppressed by default in libstdc++ headers.
There are a few annoyances in <chrono> due to the unnecessary use of
64-bit integers, which then causes narrowing conversions because some
constructors take int parameters.
e.g. https://github.com/cplusplus/draft/pull/4184