re PR fortran/66979 (gfortran internal compiler error with malformed FLUSH statement)

2015-10-01  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/66979
	* io.c (gfc_resolve_filepos): Check for a UNIT number.  Add a nearby
	missing 'return false'.

2015-10-01  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/66979
	gfortran.dg/pr66979.f90: new test.

From-SVN: r228364
This commit is contained in:
Steven G. Kargl 2015-10-02 00:49:28 +00:00
parent b64c3d0696
commit 220ab6b433
4 changed files with 27 additions and 0 deletions

View File

@ -1,3 +1,9 @@
2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/66979
* io.c (gfc_resolve_filepos): Check for a UNIT number. Add a nearby
missing 'return false'.
2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org> 2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67616 PR fortran/67616

View File

@ -2515,12 +2515,21 @@ gfc_resolve_filepos (gfc_filepos *fp)
if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET)) if (!gfc_reference_st_label (fp->err, ST_LABEL_TARGET))
return false; return false;
if (!fp->unit && (fp->iostat || fp->iomsg))
{
locus where;
where = fp->iostat ? fp->iostat->where : fp->iomsg->where;
gfc_error ("UNIT number missing in statement at %L", &where);
return false;
}
if (fp->unit->expr_type == EXPR_CONSTANT if (fp->unit->expr_type == EXPR_CONSTANT
&& fp->unit->ts.type == BT_INTEGER && fp->unit->ts.type == BT_INTEGER
&& mpz_sgn (fp->unit->value.integer) < 0) && mpz_sgn (fp->unit->value.integer) < 0)
{ {
gfc_error ("UNIT number in statement at %L must be non-negative", gfc_error ("UNIT number in statement at %L must be non-negative",
&fp->unit->where); &fp->unit->where);
return false;
} }
return true; return true;

View File

@ -1,3 +1,8 @@
2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/66979
gfortran.dg/pr66979.f90: new test.
2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org> 2015-10-01 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/67616 PR fortran/67616

View File

@ -0,0 +1,7 @@
! { dg-do compile }
! PR fortran/66979
program p
implicit none
integer::i
flush (iostat=i) ! { dg-error "UNIT number missing" }
end program p