aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2018-12-11 23:13:19 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2018-12-11 23:13:19 +0000
commit3d07fb21d2aaf83548efc4f7ca42fc9deb4028b6 (patch)
tree9d1f2cbf8af8c12e601d7acd76e402e6e4c9d88b
parent3b31a906085899ffea090ef9945ffda785dcad78 (diff)
downloadgcc-3d07fb21d2aaf83548efc4f7ca42fc9deb4028b6.zip
gcc-3d07fb21d2aaf83548efc4f7ca42fc9deb4028b6.tar.gz
gcc-3d07fb21d2aaf83548efc4f7ca42fc9deb4028b6.tar.bz2
re PR fortran/88249 (ICE in gfc_resolve_filepos, at fortran/io.c:2853)
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: r267035
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/gfortran.h2
-rw-r--r--gcc/fortran/io.c13
-rw-r--r--gcc/fortran/resolve.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/pr88249.f907
6 files changed, 29 insertions, 9 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index f5e3979..945bb23 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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/97922
diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h
index a14b4c4..fd0bc36f 100644
--- a/gcc/fortran/gfortran.h
+++ b/gcc/fortran/gfortran.h
@@ -3395,7 +3395,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 *);
diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c
index 8415df1..9c3e689 100644
--- a/gcc/fortran/io.c
+++ b/gcc/fortran/io.c
@@ -2849,22 +2849,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)
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index f4bf84b..dd705ed 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -11545,7 +11545,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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 36c4232..8c04149 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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-11 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/80520
diff --git a/gcc/testsuite/gfortran.dg/pr88249.f90 b/gcc/testsuite/gfortran.dg/pr88249.f90
new file mode 100644
index 0000000..401fb35
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr88249.f90
@@ -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