2015-08-31 22:19 GMT+02:00 Kai Tietz <ktiet...@googlemail.com>: > 2015-08-31 21:43 GMT+02:00 Kai Tietz <ktiet...@googlemail.com>: >> 2015-08-31 21:29 GMT+02:00 Jason Merrill <ja...@redhat.com>: >>> On 08/31/2015 03:08 PM, Kai Tietz wrote: >>>> >>>> I will need to verify that this patch doesn't introduce regressions. >>>> The wacky thing here is the encapsulation of overflowed-arguments in >>>> maybe_constant_value function by nop-expr. >>> >>> >>> Do we need to worry about that? If one of the operands is overflowed, we >>> don't care whether the result is overflowed. >> >> Well, we would introduce, if we don't see in condition that operand >> already overflowed, double overflow-warning, which seems to be >> something we avoided until now. So I would say, it matters. >> >> Kai > > Similar to the binary-operation we want to do then the same for > unary-operations, too. > > Eg. testcase: > > #include <limits.h> > > constexpr int f() { return INT_MIN; } > > int main() > { > return -f(); // { dg-warning "overflow" } > } > With following patch we do diagnostics for it. > > Kai > > Index: semantics.c > =================================================================== > --- semantics.c (Revision 227339) > +++ semantics.c (Arbeitskopie) > @@ -2553,9 +2553,11 @@ finish_unary_op_expr (location_t loc, enum tree_co > tree result = build_x_unary_op (loc, code, expr, complain); > tree result_ovl = result; > > - expr_ovl = fold_simple (expr_ovl); > - result_ovl = fold_simple (result); > - > + expr_ovl = maybe_constant_value (expr_ovl); > + result_ovl = maybe_constant_value (result); > + /* Strip nop-expressions added by maybe_constant_value on overflow. */ > + STRIP_NOPS (expr_ovl); > + STRIP_NOPS (result_ovl); > if ((complain & tf_warning) > && TREE_OVERFLOW_P (result_ovl) && !TREE_OVERFLOW_P (expr_ovl)) > overflow_warning (input_location, result_ovl);
I committed patches for binary & unary operations together with testcases. Regression-run still running. There seems to be additional expressions needed in constexpr for this. For now we have a bootstrap-issue due cast_expr in cxx_eval_constant_expression. There might be more of them ... Kai