This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch,fortran] Give an error when using non-integers with BOZ edit descriptors with -std=f* (PR29625)


:ADDPATCH fortran:

Fortran 95 and Fortran 2003 only allow BOZ edit descriptors for
integers. gfortran accepts as extension also OZ edit descriptors for
non-integers, even when using -std=f95/-std=f2003.

See PR29625 and also
http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/231b28d62ed52d2b

(Let's see what Fortran 2008 will do. Fortran 2003 gave us real BOZ
(e.g. "real(z'FFFFF')"); it would then only be consequent to allow using
them with BOZ edit descriptors.)

This patch allows to use binary edit descriptors for non-integers (for
octal and hexadecimal it was allowed) and gives an error for -std=f95
and -std=f2003.

The output is actually the same for the real variables as in ifort;
ifort, however, fails with character variables("insufficient virtual
memory"). NAG f95, g95 and sunf95 don't accept BOZ edit descriptors for
reals.

Tobias


2006-10-28  Tobias Burnus  <burnus@net-b.de>

    PR fortran/29625
    * io/transfer.c (formatted_transfer_scalar): Allow binary edit
      descriptors for real variables; give error for BOZ edit
      descriptor for non-integers when using -std=f*.


2006-10-28  Tobias Burnus  <burnus@net-b.de>

    PR fortran/29625
    * gfortran.dg/io_real_boz.f90: Add.
    * gfortran.dg/io_real_boz2.f90: Add.
Index: libgfortran/io/transfer.c
===================================================================
--- libgfortran/io/transfer.c	(Revision 118083)
+++ libgfortran/io/transfer.c	(Arbeitskopie)
@@ -844,7 +844,9 @@
 	case FMT_B:
 	  if (n == 0)
 	    goto need_data;
-	  if (require_type (dtp, BT_INTEGER, type, f))
+
+	  if (compile_options.allow_std < GFC_STD_GNU
+              && require_type (dtp, BT_INTEGER, type, f))
 	    return;
 
 	  if (dtp->u.p.mode == READING)
@@ -856,8 +858,12 @@
 
 	case FMT_O:
 	  if (n == 0)
-	    goto need_data;
+	    goto need_data; 
 
+	  if (compile_options.allow_std < GFC_STD_GNU
+              && require_type (dtp, BT_INTEGER, type, f))
+	    return;
+
 	  if (dtp->u.p.mode == READING)
 	    read_radix (dtp, f, p, len, 8);
 	  else
@@ -869,6 +875,10 @@
 	  if (n == 0)
 	    goto need_data;
 
+	  if (compile_options.allow_std < GFC_STD_GNU
+              && require_type (dtp, BT_INTEGER, type, f))
+	    return;
+
 	  if (dtp->u.p.mode == READING)
 	    read_radix (dtp, f, p, len, 16);
 	  else
--- /dev/null	2006-10-21 23:34:46.000000000 +0200
+++ gcc/testsuite/gfortran.dg/io_real_boz.f90	2006-10-28 18:00:42.000000000 +0200
@@ -0,0 +1,66 @@
+! { dg-do run }
+! Test reading/writing of integer, real and character BOZ
+! non-integer BOZ are not valid in standard Fortran, however.
+! PR fortran/29625
+program real_boz
+  implicit none
+  integer(4)        :: i,i2
+  real(4)           :: r,r2
+  complex(4)        :: z,z2
+  character         :: c,c2
+  character(len=100) :: str,fmt
+
+  i = 43
+  r = 325.56
+  z = cmplx(14.456, 345342.456)
+  c ='g'
+
+  write(str,'(b0)') i
+  write(fmt,'(a,i0,a)') '(b',len_trim(str),')'
+  read(str,fmt) i2
+  if(i /= i2) call abort()
+
+  write(str,'(o0)') i
+  write(fmt,'(a,i0,a)') '(o',len_trim(str),')'
+  read(str,fmt) i2
+  if(i /= i2) call abort()
+
+  write(str,'(z0)') i
+  write(fmt,'(a,i0,a)') '(z',len_trim(str),')'
+  read(str,fmt) i2
+  if(i /= i2) call abort()
+
+
+  write(str,'(b0)') r
+  write(fmt,'(a,i0,a)') '(b',len_trim(str),')'
+  read(str,fmt) r2
+  if(r /= r2) call abort()
+  
+  write(str,'(o0)') r
+  write(fmt,'(a,i0,a)') '(o',len_trim(str),')'
+  read(str,fmt) r2
+  if(r /= r2) call abort()
+
+  write(str,'(z0)') r
+  write(fmt,'(a,i0,a)') '(z',len_trim(str),')'
+  read(str,fmt) r2
+  if(r /= r2) call abort()
+
+
+  write(str,'(b0)') c
+  write(fmt,'(a,i0,a)') '(b',len_trim(str),')'
+  read(str,fmt) c2
+  if(c /= c2) call abort()
+
+  write(str,'(o0)') c
+  write(fmt,'(a,i0,a)') '(o',len_trim(str),')'
+  read(str,fmt) c2
+  if(c /= c2) call abort()
+
+  write(str,'(z0)') c
+  write(fmt,'(a,i0,a)') '(z',len_trim(str),')'
+  read(str,fmt) c2
+  if(c /= c2) call abort()
+
+end program real_boz
+  
--- /dev/null	2006-10-21 23:34:46.000000000 +0200
+++ gcc/testsuite/gfortran.dg/io_real_boz2.f90	2006-10-28 18:02:53.000000000 +0200
@@ -0,0 +1,15 @@
+! { dg-do run }
+! { dg-shouldfail "Real BOZ not allowed" }
+! { dg-options "-fall-intrinsics -std=f2003" }
+! Test for invalid (F95/F2003) writing of real with octal edit descriptor
+! PR fortran/29625
+program real_boz
+  implicit none
+  real(4)           :: r
+  character(len=100) :: str
+
+  r = 325.56
+  write(str,'(o0)') r
+end program real_boz
+! { dg-output "At line 12 .*" }
+! { dg-output "Expected INTEGER .* in formatted transfer, got REAL" }

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]