[PATCH] fortran/29147 -- Disable integer range checking.

Jerry DeLisle jvdelisle@verizon.net
Fri Sep 29 04:37:00 GMT 2006


Steve Kargl wrote:
> Against my better judgement, I've produced the attached
> patch to disable integer range checking.  This patch allows 
> gfortran to compile code as the programmer intended not as
> the programmer wrote!  Consider,
> 
>     program a
>     integer(4) b
>     data b /Z'FFFFFFFF'/
>     end program
> 
> where gfortran supports an integer(4) and an integer(8) type.
> The standard explicitly states that the BOZ is converted 
> to an integer with a kind type parameter with the largest
> decimal range.  So, the BOZ above becomes 4294967295, which
> overflows a 32-bit (signed) integer(4) type.  On a twos-compliment
> OS without range checking, the value of b would be -1 due
> to the usual wrap around.  Unfortunately, some programmers
> have come to depend on the nonportable, processor-dependent,
> behavior.  Therefore, a gfortran user will need to explicitly
> request no range checking via the -fno-range-check option.
> 
> Regression tested on amd64-*-freebsd.  There were no new
> regressions.
> 
> OK for trunk and 4.1?  (It's borderline "obviously correct").
> 
> 2006-09-28  Steven G. Kargl  <kargl@gcc.gnu.org>
> 
> 	PR fortran/29147
> 	* arith.c (gfc_check_integer_range):  Disable range checking via
> 	-fno-range-check.
> 
> 
> 
> ------------------------------------------------------------------------
> 
> Index: arith.c
> ===================================================================
> --- arith.c	(revision 117289)
> +++ arith.c	(working copy)
> @@ -351,6 +351,10 @@ gfc_check_integer_range (mpz_t p, int ki
>          result = ARITH_ASYMMETRIC;
>      }
>  
> +
> +  if (gfc_option.flag_range_check == 0)
> +    return result;
> +
>    if (mpz_cmp (p, gfc_integer_kinds[i].min_int) < 0
>        || mpz_cmp (p, gfc_integer_kinds[i].huge) > 0)
>      result = ARITH_OVERFLOW;

This is OK to commit.

Jerry



More information about the Fortran mailing list