From 7bee49dcaa2b662f6f1bad736d4d5d0cf142a123 Mon Sep 17 00:00:00 2001 From: "Steven G. Kargl" Date: Thu, 7 Sep 2006 16:48:18 +0000 Subject: data_1.f90: Fix integer oveflow in integer literal constant. 2006-09-07 Steven G. Kargl * gfortran.fortran-torture/compile/data_1.f90: Fix integer oveflow in integer literal constant. * gfortran.dg/enum_8.f90: Ditto. * gfortran.dg/g77/20030326-1.f: Ditto. 2006-09-07 Steven G. Kargl * gfortran.h (gfc_integer_info): Eliminate max_int. * arith.c (gfc_arith_init_1): Remove initialization of max_int. (gfc_arith_done_1): Remove clearing of max_int. (gfc_check_integer_range): Fix range chekcing of overflow. * simplify.c (gfc_simplify_not): Construct mask that was max_int. From-SVN: r116753 --- gcc/fortran/simplify.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'gcc/fortran/simplify.c') diff --git a/gcc/fortran/simplify.c b/gcc/fortran/simplify.c index 8a7d79b..48d8e6b 100644 --- a/gcc/fortran/simplify.c +++ b/gcc/fortran/simplify.c @@ -2590,6 +2590,7 @@ gfc_simplify_not (gfc_expr * e) { gfc_expr *result; int i; + mpz_t mask; if (e->expr_type != EXPR_CONSTANT) return NULL; @@ -2599,15 +2600,20 @@ gfc_simplify_not (gfc_expr * e) mpz_com (result->value.integer, e->value.integer); /* Because of how GMP handles numbers, the result must be ANDed with - the max_int mask. For radices <> 2, this will require change. */ + a mask. For radices <> 2, this will require change. */ i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false); - mpz_and (result->value.integer, result->value.integer, - gfc_integer_kinds[i].max_int); + mpz_init (mask); + mpz_add (mask, gfc_integer_kinds[i].huge, gfc_integer_kinds[i].huge); + mpz_add_ui (mask, mask, 1); + + mpz_and (result->value.integer, result->value.integer, mask); twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size); + mpz_clear (mask); + return range_check (result, "NOT"); } -- cgit v1.1