For the mangled code in the new testcase, gfortran issues a somewhat obtuse error message. The problem is the matcher for a complex entity runs prior to the matcher for an implied do-loop. Errors are queued in that order so an error messagei for a mangled complex constant is emitted.
Regression tested on x86_64-*-freebsd. 2018-03-07 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/56667 * primary.c (match_sym_complex_part): Give the matcher for an implied do-loop a chance to run. 2018-03-07 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/56667 * gfortran.dg/implied_do_2.f90: New test. * gfortran.dg/coarray_8.f90: Update for new error message. -- Steve
Index: gcc/fortran/primary.c =================================================================== --- gcc/fortran/primary.c (revision 258227) +++ gcc/fortran/primary.c (working copy) @@ -1248,8 +1248,22 @@ match_sym_complex_part (gfc_expr **result) if (sym->attr.flavor != FL_PARAMETER) { - gfc_error ("Expected PARAMETER symbol in complex constant at %C"); - return MATCH_ERROR; + /* Give the matcher for implied do-loops a chance to run. This yields + a much saner error message for "write(*,*) (i, i=1, 6" where the + right parenthesis is missing. */ + char c; + gfc_gobble_whitespace (); + c = gfc_peek_ascii_char (); + if (c == '=' || c == ',') + { + m = MATCH_NO; + } + else + { + gfc_error ("Expected PARAMETER symbol in complex constant at %C"); + m = MATCH_ERROR; + } + return m; } if (!sym->value) Index: gcc/testsuite/gfortran.dg/implied_do_2.f90 =================================================================== --- gcc/testsuite/gfortran.dg/implied_do_2.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/implied_do_2.f90 (working copy) @@ -0,0 +1,7 @@ +! { dg-do compile } +! PR fortran/56667 +program error_message + implicit none + integer :: ir + write(*,*) ( ir, ir = 1,10 ! { dg-error "Expected a right parenthesis" } +end program error_message Index: gcc/testsuite/gfortran.dg/coarray_8.f90 =================================================================== --- gcc/testsuite/gfortran.dg/coarray_8.f90 (revision 258227) +++ gcc/testsuite/gfortran.dg/coarray_8.f90 (working copy) @@ -145,7 +145,7 @@ end module mmm4 subroutine tfgh() integer :: i(2) - DATA i/(i, i=1,2)/ ! { dg-error "Expected PARAMETER symbol" } + DATA i/(i, i=1,2)/ ! { dg-error "Syntax error in DATA" } do i = 1, 5 ! { dg-error "cannot be an array" } end do ! { dg-error "Expecting END SUBROUTINE" } end subroutine tfgh @@ -153,7 +153,7 @@ end subroutine tfgh subroutine tfgh2() integer, save :: x[*] integer :: i(2) - DATA i/(x, x=1,2)/ ! { dg-error "Expected PARAMETER symbol" } + DATA i/(x, x=1,2)/ ! { dg-error "Syntax error in DATA" } do x = 1, 5 ! { dg-error "cannot be a coarray" } end do ! { dg-error "Expecting END SUBROUTINE" } end subroutine tfgh2