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

Reply via email to