]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/88205 (ICE in gfc_wide_strncasecmp, at fortran/scanner.c:249)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 10 Dec 2018 01:25:47 +0000 (01:25 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Mon, 10 Dec 2018 01:25:47 +0000 (01:25 +0000)
2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88205
* io.c (gfc_match_open): Move NEWUNIT checks to after STATUS checks.

2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88205
* gfortran.dg/pr88205.f90: New unit.

From-SVN: r266941

gcc/fortran/ChangeLog
gcc/fortran/io.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr88205.f90 [new file with mode: 0644]

index df57d39fc3cbd4e5dc993ce02ad4a62577556351..17832687e642c7bbeefebc4e86461cc28e4562c9 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88205
+       * io.c (gfc_match_open): Move NEWUNIT checks to after STATUS checks.
+
 2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88206
index b2fa741d03f0dc39f5b4e7dfc17cfb23acb531e9..8fd47c40fd1cf15960127ce49d8349be640c56f6 100644 (file)
@@ -2090,33 +2090,6 @@ gfc_match_open (void)
 
   warn = (open->err || open->iostat) ? true : false;
 
-  /* Checks on NEWUNIT specifier.  */
-  if (open->newunit)
-    {
-      if (open->unit)
-       {
-         gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
-         goto cleanup;
-       }
-
-      if (!open->file && open->status)
-        {
-         if (open->status->expr_type == EXPR_CONSTANT
-            && gfc_wide_strncasecmp (open->status->value.character.string,
-                                      "scratch", 7) != 0)
-          {
-            gfc_error ("NEWUNIT specifier must have FILE= "
-                       "or STATUS='scratch' at %C");
-            goto cleanup;
-          }
-       }
-    }
-  else if (!open->unit)
-    {
-      gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
-      goto cleanup;
-    }
-
   /* Checks on the ACCESS specifier.  */
   if (open->access && open->access->expr_type == EXPR_CONSTANT)
     {
@@ -2441,6 +2414,33 @@ gfc_match_open (void)
        }
     }
 
+  /* Checks on NEWUNIT specifier.  */
+  if (open->newunit)
+    {
+      if (open->unit)
+       {
+         gfc_error ("UNIT specifier not allowed with NEWUNIT at %C");
+         goto cleanup;
+       }
+
+      if (!open->file && open->status)
+        {
+         if (open->status->expr_type == EXPR_CONSTANT
+            && gfc_wide_strncasecmp (open->status->value.character.string,
+                                      "scratch", 7) != 0)
+          {
+            gfc_error ("NEWUNIT specifier must have FILE= "
+                       "or STATUS='scratch' at %C");
+            goto cleanup;
+          }
+       }
+    }
+  else if (!open->unit)
+    {
+      gfc_error ("OPEN statement at %C must have UNIT or NEWUNIT specified");
+      goto cleanup;
+    }
+
   /* Things that are not allowed for unformatted I/O.  */
   if (open->form && open->form->expr_type == EXPR_CONSTANT
       && (open->delim || open->decimal || open->encoding || open->round
index 0e212e667fd24c0a3287ab606da7dd7888622d13..f1159c7ed98d2cbc3544bf4fad3f594022b4ee8c 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88205
+       * gfortran.dg/pr88205.f90: New unit.
+
 2018-12-09  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88206
diff --git a/gcc/testsuite/gfortran.dg/pr88205.f90 b/gcc/testsuite/gfortran.dg/pr88205.f90
new file mode 100644 (file)
index 0000000..d9e0806
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+! PR fortran/88205
+subroutine s1
+   real, parameter :: status = 0
+   open (newunit=n, status=status)        ! { dg-error "STATUS requires" }
+end
+subroutine s2
+   complex, parameter :: status = 0
+   open (newunit=n, status=status)        ! { dg-error "STATUS requires" }
+end
+program p
+  logical, parameter :: status = .false.
+  open (newunit=a, status=status)         ! { dg-error "STATUS requires" }
+end