diff options
author | Steven G. Kargl <kargl@gcc.gnu.org> | 2006-09-07 16:48:18 +0000 |
---|---|---|
committer | Steven G. Kargl <kargl@gcc.gnu.org> | 2006-09-07 16:48:18 +0000 |
commit | 7bee49dcaa2b662f6f1bad736d4d5d0cf142a123 (patch) | |
tree | 4f1d503f946ad196afc135214a5ab73b0196136d /gcc/fortran/simplify.c | |
parent | aa9ecf58cc2a846e1d18c163469dcab437ac8a2e (diff) | |
download | gcc-7bee49dcaa2b662f6f1bad736d4d5d0cf142a123.zip gcc-7bee49dcaa2b662f6f1bad736d4d5d0cf142a123.tar.gz gcc-7bee49dcaa2b662f6f1bad736d4d5d0cf142a123.tar.bz2 |
data_1.f90: Fix integer oveflow in integer literal constant.
2006-09-07 Steven G. Kargl <kargls@comcast.net>
* 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 <kargls@comcast.net>
* 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
Diffstat (limited to 'gcc/fortran/simplify.c')
-rw-r--r-- | gcc/fortran/simplify.c | 12 |
1 files changed, 9 insertions, 3 deletions
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"); } |