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
This commit is contained in:
Joseph Myers 2013-12-10 01:23:37 +00:00 committed by Joseph Myers
parent e73d2479dd
commit 3a4efce7c2
4 changed files with 71 additions and 1 deletions

View File

@ -1,3 +1,8 @@
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

View File

@ -0,0 +1,44 @@
/* 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

View File

@ -1,3 +1,9 @@
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.

View File

@ -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;