293eaa4
2007-12-12  Jakub Jelinek  <jakub@redhat.com>
293eaa4
293eaa4
	PR libfortran/34427
293eaa4
293eaa4
	Revert:
293eaa4
	2007-12-08  Tobias Burnus  <burnus@net-b.de>
293eaa4
293eaa4
	PR fortran/34319
293eaa4
	* io/list_read.c (parse_real, read_real): Support NaN/Infinity.
293eaa4
293eaa4
	* gfortran.dg/nan_3.f90: New.
293eaa4
293eaa4
--- libgfortran/io/list_read.c	(revision 130708)
293eaa4
+++ libgfortran/io/list_read.c	(revision 130707)
293eaa4
@@ -1078,12 +1078,7 @@ parse_real (st_parameter_dt *dtp, void *
293eaa4
     }
293eaa4
 
293eaa4
   if (!isdigit (c) && c != '.')
293eaa4
-    {
293eaa4
-      if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
293eaa4
-	goto inf_nan;
293eaa4
-      else
293eaa4
-	goto bad;
293eaa4
-    }
293eaa4
+    goto bad;
293eaa4
 
293eaa4
   push_char (dtp, c);
293eaa4
 
3daebbc
@@ -1141,13 +1136,7 @@ parse_real (st_parameter_dt *dtp, void *
293eaa4
 
293eaa4
  exp2:
293eaa4
   if (!isdigit (c))
293eaa4
-    {
293eaa4
-      if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
293eaa4
-	goto inf_nan;
293eaa4
-      else
293eaa4
-	goto bad;
293eaa4
-    }
293eaa4
-
3daebbc
+    goto bad;
293eaa4
   push_char (dtp, c);
293eaa4
 
3daebbc
   for (;;)
3daebbc
@@ -1177,41 +1166,6 @@ parse_real (st_parameter_dt *dtp, void *
293eaa4
 
293eaa4
   return m;
293eaa4
 
293eaa4
- inf_nan:
293eaa4
-  /* Match INF and Infinity.  */
293eaa4
-  if ((c == 'i' || c == 'I')
293eaa4
-      && ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-      && ((c = next_char (dtp)) == 'f' || c == 'F'))
293eaa4
-    {
293eaa4
-	c = next_char (dtp);
293eaa4
-	if ((c != 'i' && c != 'I')
293eaa4
-	    || ((c == 'i' || c == 'I')
293eaa4
-		&& ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-		&& ((c = next_char (dtp)) == 'i' || c == 'I')
293eaa4
-		&& ((c = next_char (dtp)) == 't' || c == 'T')
293eaa4
-		&& ((c = next_char (dtp)) == 'y' || c == 'Y')
293eaa4
-		&& (c = next_char (dtp))))
293eaa4
-	  {
293eaa4
-	     if (is_separator (c))
293eaa4
-	       unget_char (dtp, c);
293eaa4
-	     push_char (dtp, 'i');
293eaa4
-	     push_char (dtp, 'n');
293eaa4
-	     push_char (dtp, 'f');
293eaa4
-	     goto done;
293eaa4
-	  }
293eaa4
-    } /* Match NaN.  */
293eaa4
-  else if (((c = next_char (dtp)) == 'a' || c == 'A')
293eaa4
-	   && ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-	   && (c = next_char (dtp)))
293eaa4
-    {
293eaa4
-      if (is_separator (c))
293eaa4
-	unget_char (dtp, c);
293eaa4
-      push_char (dtp, 'n');
293eaa4
-      push_char (dtp, 'a');
293eaa4
-      push_char (dtp, 'n');
293eaa4
-      goto done;
293eaa4
-    }
293eaa4
-
293eaa4
  bad:
293eaa4
 
293eaa4
   if (nml_bad_return (dtp, c))
3daebbc
@@ -1339,12 +1293,6 @@ read_real (st_parameter_dt *dtp, int len
293eaa4
       eat_separator (dtp);
293eaa4
       return;
293eaa4
 
293eaa4
-    case 'i':
293eaa4
-    case 'I':
293eaa4
-    case 'n':
293eaa4
-    case 'N':
293eaa4
-      goto inf_nan;
293eaa4
-
293eaa4
     default:
293eaa4
       goto bad_real;
293eaa4
     }
3daebbc
@@ -1419,12 +1367,7 @@ read_real (st_parameter_dt *dtp, int len
293eaa4
     }
293eaa4
 
293eaa4
   if (!isdigit (c) && c != '.')
293eaa4
-    {
293eaa4
-      if (c == 'i' || c == 'I' || c == 'n' || c == 'N')
293eaa4
-	goto inf_nan;
293eaa4
-      else
293eaa4
-	goto bad_real;
293eaa4
-    }
293eaa4
+    goto bad_real;
293eaa4
 
293eaa4
   if (c == '.')
293eaa4
     {
3daebbc
@@ -1521,37 +1464,6 @@ read_real (st_parameter_dt *dtp, int len
293eaa4
   dtp->u.p.saved_type = BT_REAL;
293eaa4
   return;
293eaa4
 
293eaa4
- inf_nan:
293eaa4
-  /* Match INF and Infinity.  */
293eaa4
-  if ((c == 'i' || c == 'I')
293eaa4
-      && ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-      && ((c = next_char (dtp)) == 'f' || c == 'F'))
293eaa4
-    {
293eaa4
-	c = next_char (dtp);
293eaa4
-	if (is_separator (c)
293eaa4
-	    || ((c == 'i' || c == 'I')
293eaa4
-		&& ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-		&& ((c = next_char (dtp)) == 'i' || c == 'I')
293eaa4
-		&& ((c = next_char (dtp)) == 't' || c == 'T')
293eaa4
-		&& ((c = next_char (dtp)) == 'y' || c == 'Y')
293eaa4
-		&& (c = next_char (dtp)) && is_separator (c)))
293eaa4
-	  {
293eaa4
-	     push_char (dtp, 'i');
293eaa4
-	     push_char (dtp, 'n');
293eaa4
-	     push_char (dtp, 'f');
293eaa4
-	     goto done;
293eaa4
-	  }
293eaa4
-    } /* Match NaN.  */
293eaa4
-  else if (((c = next_char (dtp)) == 'a' || c == 'A')
293eaa4
-	   && ((c = next_char (dtp)) == 'n' || c == 'N')
293eaa4
-	   && (c = next_char (dtp)) && is_separator (c))
293eaa4
-    {
293eaa4
-      push_char (dtp, 'n');
293eaa4
-      push_char (dtp, 'a');
293eaa4
-      push_char (dtp, 'n');
293eaa4
-      goto done;
293eaa4
-    }
293eaa4
-
293eaa4
  bad_real:
293eaa4
 
293eaa4
   if (nml_bad_return (dtp, c))
293eaa4
--- gcc/testsuite/gfortran.dg/nan_3.f90	(revision 130708)
293eaa4
+++ gcc/testsuite/gfortran.dg/nan_3.f90	(revision 130707)
293eaa4
@@ -1,45 +0,0 @@
293eaa4
-! { dg-do run }
293eaa4
-! { dg-options "-fno-range-check" }
293eaa4
-! { dg-options "-fno-range-check -mieee" { target sh*-*-* } }
293eaa4
-!
293eaa4
-! PR fortran/34319
293eaa4
-!
293eaa4
-! Check support of INF/NaN for I/O.
293eaa4
-!
293eaa4
-program main
293eaa4
-  implicit none
293eaa4
-  real :: r
293eaa4
-  complex :: z
293eaa4
-  character(len=30) :: str
293eaa4
-
293eaa4
-  str = "nan"
293eaa4
-  read(str,*) r
293eaa4
-  if (.not.isnan(r)) call abort()
293eaa4
-  str = "(nan,4.0)"
293eaa4
-  read(str,*) z
293eaa4
-  if (.not.isnan(real(z)) .or. aimag(z) /= 4.0) call abort()
293eaa4
-  str = "(7.0,nan)"
293eaa4
-  read(str,*) z
293eaa4
-  if (.not.isnan(aimag(z)) .or. real(z) /= 7.0) call abort()
293eaa4
-
293eaa4
-  str = "inFinity"
293eaa4
-  read(str,*) r
293eaa4
-  if (r <= huge(r)) call abort()
293eaa4
-  str = "(+inFinity,4.0)"
293eaa4
-  read(str,*) z
293eaa4
-  if ((real(z) <= huge(r)) .or. aimag(z) /= 4.0) call abort()
293eaa4
-  str = "(7.0,-inFinity)"
293eaa4
-  read(str,*) z
293eaa4
-  if ((aimag(z) >= -huge(r)) .or. real(z) /= 7.0) call abort()
293eaa4
-
293eaa4
-  str = "inf"
293eaa4
-  read(str,*) r
293eaa4
-  if (r <= huge(r)) call abort()
293eaa4
-  str = "(+inf,4.0)"
293eaa4
-  read(str,*) z
293eaa4
-  if ((real(z) <= huge(r)) .or. aimag(z) /= 4.0) call abort()
293eaa4
-  str = "(7.0,-inf)"
293eaa4
-  read(str,*) z
293eaa4
-  if ((aimag(z) >= -huge(r)) .or. real(z) /= 7.0) call abort()
293eaa4
-
293eaa4
-end program main