diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index cf92deaf7ca..f8d99302298 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2006-07-07 Paul Thomas + + PR fortran/28237 + PR fortran/23420 + * io.c (resolve_tag): Any integer that is not an assigned + variable is an error. + 2006-07-06 Francois-Xavier Coudert PR fortran/28129 diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index aab5d39dc34..725e2da6655 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -1063,6 +1063,13 @@ resolve_tag (const io_tag * tag, gfc_expr * e) return FAILURE; } } + else if (e->ts.type == BT_INTEGER) + { + gfc_error ("scalar '%s' FORMAT tag at %L is not an ASSIGNED " + "variable", gfc_basic_typename (e->ts.type), &e->where); + return FAILURE; + } + return SUCCESS; } else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 272acc98a1b..095a51ced6d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2006-07-07 Paul Thomas + + PR fortran/28237 + PR fortran/23420 + * gfortran.dg/print_fmt_5.f90: New test. + 2006-07-06 Francois-Xavier Coudert PR fortran/28129 diff --git a/gcc/testsuite/gfortran.dg/print_fmt_5.f90 b/gcc/testsuite/gfortran.dg/print_fmt_5.f90 new file mode 100644 index 00000000000..fb37d753971 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/print_fmt_5.f90 @@ -0,0 +1,45 @@ +! { dg-do compile } +! print_fmt_5.f90 +! Test of fix for PR28237 and the last bit of PR23420. See +! below for the description of the problem. +! +program r + character(12) :: for = '(i5)', left = '(i', right = ')' + integer :: i, j + integer :: h(4) & + = (/1h(, 1hi, 1h5, 1h)/)! { dg-warning "HOLLERITH|Hollerith" } + namelist /mynml/ i + i = fact () +! +! All these are "legal" things to do; note however the warnings +! for extensions or obsolete features! +! + print *, fact() + print 100, fact() + print '(i5)', fact() + print mynml ! { dg-warning "is an extension" } + do i = 1, 5 + print trim(left)//char(iachar('0') + i)//trim(right), i + end do + assign 100 to i ! { dg-warning "ASSIGN statement" } + print i, fact() ! { dg-warning "ASSIGNED variable" } + print h, fact () ! { dg-warning "Non-character in FORMAT" } +! +! These are not and caused a segfault in trans-io:560 +! +! PR28237 + print fact() ! { dg-error "not an ASSIGNED variable" } +! original PR23420 + print precision(1.2_8) ! { dg-error "type default CHARACTER" } +! PR23420 points 4 and 5 + print j + j ! { dg-error "not an ASSIGNED variable" } +! An extension of the above, encountered in writing the fix + write (*, fact())! { dg-error "not an ASSIGNED variable" } + 100 format (i5) +contains + function fact() + integer :: fact + fact = 1 + end function fact +end +