]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/88249 (ICE in gfc_resolve_filepos, at fortran/io.c:2853)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 12 Dec 2018 00:08:12 +0000 (00:08 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 12 Dec 2018 00:08:12 +0000 (00:08 +0000)
2018-12-11  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/88249
* gfortran.h: Update prototype for gfc_resolve_filepos().
* io.c (gfc_resolve_filepos): Check for UNIT number if ERR= is present.
Use passed in locus for error message.
* resolve.c (gfc_resolve_code): Pass locus in gfc_resolve_filepos()
call.

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

PR fortran/88249
* gfortran.dg/pr88249.f90: New test.

From-SVN: r267037

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

index cba5c430e224af165cbd7dec0aee5b6cc949c04d..f62f826acba73832d60c8ee39800e384ce388694 100644 (file)
@@ -1,3 +1,12 @@
+2018-12-11  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88249
+       * gfortran.h: Update prototype for gfc_resolve_filepos().
+       * io.c (gfc_resolve_filepos): Check for UNIT number if ERR= is present.
+       Use passed in locus for error message.
+       * resolve.c (gfc_resolve_code): Pass locus in gfc_resolve_filepos()
+       call.
+
 2018-12-10  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88269
index e5287c5d8d949d6850e9b603a2a0be2403d5f90f..071dece717ce2eff7155fd70f838a8e6ab6843f5 100644 (file)
@@ -3269,7 +3269,7 @@ bool gfc_resolve_open (gfc_open *);
 void gfc_free_close (gfc_close *);
 bool gfc_resolve_close (gfc_close *);
 void gfc_free_filepos (gfc_filepos *);
-bool gfc_resolve_filepos (gfc_filepos *);
+bool gfc_resolve_filepos (gfc_filepos *, locus *);
 void gfc_free_inquire (gfc_inquire *);
 bool gfc_resolve_inquire (gfc_inquire *);
 void gfc_free_dt (gfc_dt *);
index 6bb2faa74fe94fa113276dd93891e21d9b3d1cc8..90f4baafd746813462585c1ce093580bf7284f11 100644 (file)
@@ -2774,22 +2774,21 @@ cleanup:
 
 
 bool
-gfc_resolve_filepos (gfc_filepos *fp)
+gfc_resolve_filepos (gfc_filepos *fp, locus *where)
 {
   RESOLVE_TAG (&tag_unit, fp->unit);
   RESOLVE_TAG (&tag_iostat, fp->iostat);
   RESOLVE_TAG (&tag_iomsg, fp->iomsg);
-  if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET))
-    return false;
 
-  if (!fp->unit && (fp->iostat || fp->iomsg))
+  if (!fp->unit && (fp->iostat || fp->iomsg || fp->err))
     {
-      locus where;
-      where = fp->iostat ? fp->iostat->where : fp->iomsg->where;
-      gfc_error ("UNIT number missing in statement at %L", &where);
+      gfc_error ("UNIT number missing in statement at %L", where);
       return false;
     }
 
+  if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET))
+    return false;
+
   if (fp->unit->expr_type == EXPR_CONSTANT
       && fp->unit->ts.type == BT_INTEGER
       && mpz_sgn (fp->unit->value.integer) < 0)
index 85e93870642c9c5d0fb7e2b158250576d33638d2..4850f99a0b211b0876fbe22ea25c57c7a0e59f90 100644 (file)
@@ -11163,7 +11163,7 @@ start:
        case EXEC_ENDFILE:
        case EXEC_REWIND:
        case EXEC_FLUSH:
-         if (!gfc_resolve_filepos (code->ext.filepos))
+         if (!gfc_resolve_filepos (code->ext.filepos, &code->loc))
            break;
 
          resolve_branch (code->ext.filepos->err, code);
index ee66741534379188a6f5586a0c1211c7e8d80d3e..200ff75476b15fa78a272d14fe7b62997b49e146 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-11  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/88249
+       * gfortran.dg/pr88249.f90: New test.
+
 2018-12-10  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88269
diff --git a/gcc/testsuite/gfortran.dg/pr88249.f90 b/gcc/testsuite/gfortran.dg/pr88249.f90
new file mode 100644 (file)
index 0000000..401fb35
--- /dev/null
@@ -0,0 +1,7 @@
+! { dg-do compile }
+program p
+   backspace (err=1) ! { dg-error "UNIT number missing" }
+   endfile (err=1)   ! { dg-error "UNIT number missing" }
+   flush (err=1)     ! { dg-error "UNIT number missing" }
+   rewind (err=1)    ! { dg-error "UNIT number missing" }
+end