Commit 7bee49dc by Steven G. Kargl

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
parent aa9ecf58
2006-09-05 Paul Thomas <pault@gcc.gnu.org> 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.
2006-09-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/28908 PR fortran/28908
* gfortran.h : Restore the gfc_dt_list structure and reference * gfortran.h : Restore the gfc_dt_list structure and reference
......
...@@ -195,7 +195,7 @@ gfc_arith_init_1 (void) ...@@ -195,7 +195,7 @@ gfc_arith_init_1 (void)
/* These are the numbers that are actually representable by the /* These are the numbers that are actually representable by the
target. For bases other than two, this needs to be changed. */ target. For bases other than two, this needs to be changed. */
if (int_info->radix != 2) if (int_info->radix != 2)
gfc_internal_error ("Fix min_int, max_int calculation"); gfc_internal_error ("Fix min_int calculation");
/* See PRs 13490 and 17912, related to integer ranges. /* See PRs 13490 and 17912, related to integer ranges.
The pedantic_min_int exists for range checking when a program The pedantic_min_int exists for range checking when a program
...@@ -210,10 +210,6 @@ gfc_arith_init_1 (void) ...@@ -210,10 +210,6 @@ gfc_arith_init_1 (void)
mpz_init (int_info->min_int); mpz_init (int_info->min_int);
mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1); mpz_sub_ui (int_info->min_int, int_info->pedantic_min_int, 1);
mpz_init (int_info->max_int);
mpz_add (int_info->max_int, int_info->huge, int_info->huge);
mpz_add_ui (int_info->max_int, int_info->max_int, 1);
/* Range */ /* Range */
mpfr_set_z (a, int_info->huge, GFC_RND_MODE); mpfr_set_z (a, int_info->huge, GFC_RND_MODE);
mpfr_log10 (a, a, GFC_RND_MODE); mpfr_log10 (a, a, GFC_RND_MODE);
...@@ -321,7 +317,6 @@ gfc_arith_done_1 (void) ...@@ -321,7 +317,6 @@ gfc_arith_done_1 (void)
for (ip = gfc_integer_kinds; ip->kind; ip++) for (ip = gfc_integer_kinds; ip->kind; ip++)
{ {
mpz_clear (ip->min_int); mpz_clear (ip->min_int);
mpz_clear (ip->max_int);
mpz_clear (ip->pedantic_min_int); mpz_clear (ip->pedantic_min_int);
mpz_clear (ip->huge); mpz_clear (ip->huge);
} }
...@@ -356,7 +351,7 @@ gfc_check_integer_range (mpz_t p, int kind) ...@@ -356,7 +351,7 @@ gfc_check_integer_range (mpz_t p, int kind)
} }
if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0 if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
|| mpz_cmp (p, gfc_integer_kinds[i].max_int) > 0) || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
result = ARITH_OVERFLOW; result = ARITH_OVERFLOW;
return result; return result;
......
...@@ -1299,7 +1299,7 @@ gfc_expr; ...@@ -1299,7 +1299,7 @@ gfc_expr;
typedef struct typedef struct
{ {
/* Values really representable by the target. */ /* Values really representable by the target. */
mpz_t huge, pedantic_min_int, min_int, max_int; mpz_t huge, pedantic_min_int, min_int;
int kind, radix, digits, bit_size, range; int kind, radix, digits, bit_size, range;
......
...@@ -2590,6 +2590,7 @@ gfc_simplify_not (gfc_expr * e) ...@@ -2590,6 +2590,7 @@ gfc_simplify_not (gfc_expr * e)
{ {
gfc_expr *result; gfc_expr *result;
int i; int i;
mpz_t mask;
if (e->expr_type != EXPR_CONSTANT) if (e->expr_type != EXPR_CONSTANT)
return NULL; return NULL;
...@@ -2599,15 +2600,20 @@ gfc_simplify_not (gfc_expr * e) ...@@ -2599,15 +2600,20 @@ gfc_simplify_not (gfc_expr * e)
mpz_com (result->value.integer, e->value.integer); mpz_com (result->value.integer, e->value.integer);
/* Because of how GMP handles numbers, the result must be ANDed with /* 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); i = gfc_validate_kind (BT_INTEGER, e->ts.kind, false);
mpz_and (result->value.integer, result->value.integer, mpz_init (mask);
gfc_integer_kinds[i].max_int); 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); twos_complement (result->value.integer, gfc_integer_kinds[i].bit_size);
mpz_clear (mask);
return range_check (result, "NOT"); return range_check (result, "NOT");
} }
......
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 Feng Wang <fengwang@nudt.edu.cn> 2006-09-07 Feng Wang <fengwang@nudt.edu.cn>
* gfortran.fortran-torture/execute/intrinsic_set_exponent.f90: Fix * gfortran.fortran-torture/execute/intrinsic_set_exponent.f90: Fix
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
program main program main
implicit none implicit none
enum, bind (c) enum, bind (c)
enumerator :: pp , qq = 4294967295, rr ! { dg-error "not initialized with integer" } enumerator :: pp, qq = 4294967295, rr ! { dg-error "too big for its kind" }
end enum ! { dg-error "has no ENUMERATORS" } end enum ! { dg-error "has no ENUMERATORS" }
enum, bind (c) enum, bind (c)
......
...@@ -6,5 +6,5 @@ ...@@ -6,5 +6,5 @@
! For gfortran, see PR 13490 ! For gfortran, see PR 13490
! !
integer c integer c
c = -2147483648 / (-1) ! { dg-warning "outside symmetric range" "" } c = -2147483648 / (-1) ! { dg-error "too big for its kind" "" }
end end
...@@ -7,5 +7,5 @@ DATA y /a(1.)/ ! used to give an error about non-PARAMETER ...@@ -7,5 +7,5 @@ DATA y /a(1.)/ ! used to give an error about non-PARAMETER
END END
! this tests the fix for PR 13940 ! this tests the fix for PR 13940
SUBROUTINE a SUBROUTINE a
DATA i /x'f95f95f9'/ DATA i /z'f95f95'/
END END
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment