On 06/05/2014 11:53 AM, Steven Rostedt wrote:
On Thu, 05 Jun 2014 11:44:45 -0700
David Daney <ddaney.cavm@xxxxxxxxx> wrote:
But stddev is s64. Ah, but the compare is:
(void)(((typeof((n)) *)0) == ((uint64_t *)0));
so it's complaining about a signed verses unsigned compare, not length.
I think I can ignore this warning then.
The pedant in me thinks that you should fix your code if using do_div()
on a signed object is undefined. But if you aren't planning on merging
the code, then it probably doesn't matter.
It's undefined on signed 64 numbers?
Evidently it is.
The top of asm-generic/div64.h has:
.
.
.
* The semantics of do_div() are:
*
* uint32_t do_div(uint64_t *n, uint32_t base)
* {
.
.
.
do_div() really passes the first parameter by reference, and C doesn't
have by reference parameters, so the example is not quite right. But it
does seem to imply the thing should be an *unsigned* 64-bit wide variable.
It has been like this since the beginning of the git epoch.
Where is that documented.
The code is the documentation.
I don't
see it in the comments, and I don't see anything in the Documentation
directory. It only states that n must be 64bit. It doesn't say unsigned
64 bit.
The handful of call sites I examined, seem to all use u64 or unsigned
long long.
I get:
$ grep -r do_div Documentation | wc
0 0 0
So it would seem that most of the do_div() documentation actually is the
code.
David Daney