aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/simplify.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2006-09-07 16:48:18 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2006-09-07 16:48:18 +0000
commit7bee49dcaa2b662f6f1bad736d4d5d0cf142a123 (patch)
tree4f1d503f946ad196afc135214a5ab73b0196136d /gcc/fortran/simplify.c
parentaa9ecf58cc2a846e1d18c163469dcab437ac8a2e (diff)
downloadgcc-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.c12
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");
}