I've committed the attached patch. After matching EQUIVALNCE, the patch goobles any possible whitespace and then checks that the next character is '('. If it isn't '(', return MATCH_NO to give other matches a chance to run.
2019-08-02 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/90297 * match.c (gfc_match_equivalence): Check that EQUIVALENCE is followed by '('. 2019-08-02 Steven G. Kargl <ka...@gcc.gnu.org> PR fortran/90297 * gfortran.dg/equiv_10.f90: New test. -- Steve
Index: gcc/fortran/match.c =================================================================== --- gcc/fortran/match.c (revision 274021) +++ gcc/fortran/match.c (working copy) @@ -5552,6 +5552,15 @@ gfc_match_equivalence (void) gfc_common_head *common_head = NULL; bool common_flag; int cnt; + char c; + + /* EQUIVALENCE has been matched. After gobbling any possible whitespace, + the next character needs to be '('. Check that here, and return + MATCH_NO for a variable of the form equivalencej. */ + gfc_gobble_whitespace (); + c = gfc_peek_ascii_char (); + if (c != '(') + return MATCH_NO; tail = NULL; Index: gcc/testsuite/gfortran.dg/equiv_10.f90 =================================================================== --- gcc/testsuite/gfortran.dg/equiv_10.f90 (nonexistent) +++ gcc/testsuite/gfortran.dg/equiv_10.f90 (working copy) @@ -0,0 +1,15 @@ +! { dg-do compile } +! PR fortran/90986 +module mymod + type :: mytyp + integer :: i + end type mytyp +contains + subroutine mysub + implicit none + type(mytyp) :: a + integer :: equivalencei,equivalencej + equivalencei = a%i + equivalencej = a%j ! { dg-error "is not a member of the" } + end subroutine mysub +end module mymod