In free-form source code, DATA must be followed by whitespace. This patch checks for whitespace, and if none is found, returns MATCH_NO to give other matchers a chance to run.
2019-08-02 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/90985 * decl.c (gfc_match_data): In free-form code, DATA be followed by whitespace. 2019-08-02 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/90985 * gfortran.dg/pr90985.f90: New test. -- Steve
Index: gcc/fortran/decl.c =================================================================== --- gcc/fortran/decl.c (revision 274031) +++ gcc/fortran/decl.c (working copy) @@ -621,6 +621,13 @@ gfc_match_data (void) gfc_expr *e; gfc_ref *ref; match m; + char c; + + /* DATA has been matched. In free form source code, the next character + needs to be whitespace. Check that here. */ + c = gfc_peek_ascii_char (); + if (gfc_current_form == FORM_FREE && !gfc_is_whitespace (c)) + return MATCH_NO; /* Before parsing the rest of a DATA statement, check F2008:c1206. */ if ((gfc_current_state () == COMP_FUNCTION Index: gcc/testsuite/gfortran.dg/pr90985.f90 =================================================================== --- gcc/testsuite/gfortran.dg/pr90985.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/pr90985.f90 (working copy) @@ -0,0 +1,14 @@ +! { dg-do compile } +module mymod + type :: mytyp + integer :: i + end type mytyp +contains + subroutine mysub + implicit none + type(mytyp) :: a + integer :: datai,dataj + datai = a%i + dataj = a%j ! { dg-error "is not a member of the" } + end subroutine mysub +end module mymod