On Wed, Mar 06, 2019 at 02:37:17PM +0200, Leon Romanovsky wrote: > From: Leon Romanovsky <leonro@xxxxxxxxxxxx> > > Attempt to use check_shl_overflow() with inputs of unsigned type > produces the following compilation warnings. > > drivers/infiniband/hw/mlx5/qp.c: In function _set_user_rq_size_: > ./include/linux/overflow.h:230:6: warning: comparison of unsigned > expression >= 0 is always true [-Wtype-limits] > _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ > ^~ > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, > &rwq->buf_size)) > ^~~~~~~~~~~~~~~~~~ > ./include/linux/overflow.h:232:26: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] > (_to_shift != _s || *_d < 0 || _a < 0 || \ > ^ > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift, &rwq->buf_size)) > ^~~~~~~~~~~~~~~~~~ > ./include/linux/overflow.h:232:36: warning: comparison of unsigned expression < 0 is always false [-Wtype-limits] > (_to_shift != _s || *_d < 0 || _a < 0 || \ > ^ > drivers/infiniband/hw/mlx5/qp.c:5820:6: note: in expansion of macro _check_shl_overflow_ > if (check_shl_overflow(rwq->wqe_count, rwq->wqe_shift,&rwq->buf_size)) > ^~~~~~~~~~~~~~~~~~ > > Fixes: 0c66847793d1 ("overflow.h: Add arithmetic shift helper") > Signed-off-by: Leon Romanovsky <leonro@xxxxxxxxxxxx> > Changelog v0->v1: > * fixed wrong checks > include/linux/overflow.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/include/linux/overflow.h b/include/linux/overflow.h > index 40b48e2133cb..a47fb6046c0a 100644 > +++ b/include/linux/overflow.h > @@ -227,10 +227,10 @@ > typeof(d) _d = d; \ > u64 _a_full = _a; \ > unsigned int _to_shift = \ > - _s >= 0 && _s < 8 * sizeof(*d) ? _s : 0; \ > + (_s == 0 || _s > 0) && _s < 8 * sizeof(*d) ? _s : 0; \ I think this is just trading a tautological compare gcc happens to know about today (_s >= 0) with one it currently doesn't (_s == 0 || _s > 0) Maybe cc the various people that helped review this macro and see if we can find another solution? Jason