Commit 3a4efce7 by Joseph Myers Committed by Joseph Myers

re PR preprocessor/55715 (bogus overflow warning for #if A-B when A<0 & B==minimum integer)

	PR preprocessor/55715
libcpp:
	* expr.c (num_binary_op): Implement subtraction directly rather
	than with negation and falling through into addition case.

gcc/testsuite:
	* gcc.dg/cpp/expr-overflow-1.c: New test.

From-SVN: r205846
parent e73d2479
2013-12-09 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/55715
* gcc.dg/cpp/expr-overflow-1.c: New test.
2013-12-10 Tobias Burnus <burnus@net-b.de>
PR fortran/59428
......
/* Test overflow in preprocessor arithmetic. PR 55715. */
/* { dg-do preprocess } */
/* { dg-options "-std=c99" } */
#include <stdint.h>
#if -1 - INTMAX_MIN
#endif
#if 0 - INTMAX_MIN /* { dg-warning "overflow" } */
#endif
#if 1 * INTMAX_MIN
#endif
#if -1 * INTMAX_MIN /* { dg-warning "overflow" } */
#endif
#if 0 * INTMAX_MIN
#endif
#if -INTMAX_MIN /* { dg-warning "overflow" } */
#endif
#if +INTMAX_MIN
#endif
#if INTMAX_MIN / 1
#endif
#if INTMAX_MIN / -1 /* { dg-warning "overflow" } */
#endif
#if UINTMAX_MAX * UINTMAX_MAX
#endif
#if UINTMAX_MAX / -1
#endif
#if UINTMAX_MAX + INTMAX_MAX
#endif
#if UINTMAX_MAX - INTMAX_MIN
#endif
2013-12-09 Joseph Myers <joseph@codesourcery.com>
PR preprocessor/55715
* expr.c (num_binary_op): Implement subtraction directly rather
than with negation and falling through into addition case.
2013-11-18 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
* lex.c (search_line_fast): Correct for little endian.
......
......@@ -1836,7 +1836,22 @@ num_binary_op (cpp_reader *pfile, cpp_num lhs, cpp_num rhs, enum cpp_ttype op)
/* Arithmetic. */
case CPP_MINUS:
rhs = num_negate (rhs, precision);
result.low = lhs.low - rhs.low;
result.high = lhs.high - rhs.high;
if (result.low > lhs.low)
result.high--;
result.unsignedp = lhs.unsignedp || rhs.unsignedp;
result.overflow = false;
result = num_trim (result, precision);
if (!result.unsignedp)
{
bool lhsp = num_positive (lhs, precision);
result.overflow = (lhsp != num_positive (rhs, precision)
&& lhsp != num_positive (result, precision));
}
return result;
case CPP_PLUS:
result.low = lhs.low + rhs.low;
result.high = lhs.high + rhs.high;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment