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:
parent
e73d2479dd
commit
3a4efce7c2
@ -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
|
||||
|
44
gcc/testsuite/gcc.dg/cpp/expr-overflow-1.c
Normal file
44
gcc/testsuite/gcc.dg/cpp/expr-overflow-1.c
Normal 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
|
@ -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.
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user