On Fri, Apr 19, 2013 at 11:01 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >> Maybe we should detect overflow as if the input and output were signed >> while computing an unsigned result. As far as I can see int_const_binop_1 >> does detect overflow as if operations were signed (it passes 'false' as >> uns to all double-int operations rather than TYPE_UNSIGNED). >> For example sub_with_overflow simply does >> >> neg_double (b.low, b.high, &ret.low, &ret.high); >> add_double (low, high, ret.low, ret.high, &ret.low, &ret.high); >> *overflow = OVERFLOW_SUM_SIGN (ret.high, b.high, high); >> >> which I believe is wrong. Shouldn't it be >> >> neg_double (b.low, b.high, &ret.low, &ret.high); >> HOST_WIDE_INT tem = ret.high; >> add_double (low, high, ret.low, ret.high, &ret.low, &ret.high); >> *overflow = OVERFLOW_SUM_SIGN (ret.high, tem, high); >> >> ? Because we are computing a + (-b) and thus OVERFLOW_SUM_SIGN >> expects the sign of a and -b, not a and b to verify against the >> sign of ret. > > But int_const_binop_1 is called from int_const_binop, so why would we want to > introduce any overflow for unsigned types other than sizetypes? > >> I'm sceptical. Where do you compute the size expression for variable-sized >> arrays? I suppose with the testcase in the initial patch I can then inspect >> myself what actually happens? > > Sure, but we already went through this in the PR. It's because of the formula > used for the length of variable-sized arrays, which needs to handle the case > of superflat arrays.
Ah, indeed. I added a comment there. Richard. > -- > Eric Botcazou