Hi all, another simple fix for a rather old PR. This one adds a new check, in order to provide better error messages than just "Unclassifiable statement".
Regtests cleanly on x86_64-linux-gnu. Ok for trunk? Cheers, Janus 2016-12-02 Janus Weil <ja...@gcc.gnu.org> PR fortran/42188 * primary.c (gfc_match_rvalue): Add a new check that gives better error messages. 2016-12-02 Janus Weil <ja...@gcc.gnu.org> PR fortran/42188 * gfortran.dg/derived_result_2.f90.f90: New test case.
Index: gcc/fortran/primary.c =================================================================== --- gcc/fortran/primary.c (revision 243176) +++ gcc/fortran/primary.c (working copy) @@ -3298,6 +3298,15 @@ gfc_match_rvalue (gfc_expr **result) if (sym->result == NULL) sym->result = sym; + gfc_gobble_whitespace (); + /* F08:C612. */ + if (gfc_peek_ascii_char() == '%') + { + gfc_error ("The leftmost part-ref in a data-ref can not be a " + "function reference at %C"); + m = MATCH_ERROR; + } + m = MATCH_YES; break;
! { dg-do compile } ! ! PR 42188: [OOP] F03:C612. The leftmost part-name shall be the name of a data object ! ! Contributed by Janus Weil <ja...@gcc.gnu.org> module grid_module implicit none type grid contains procedure :: new_grid procedure :: new_int end type contains subroutine new_grid(this) class(grid) :: this end subroutine integer function new_int(this) class(grid) :: this new_int = 42 end function end module module field_module use grid_module implicit none type field type(grid) :: mesh end type contains type(field) function new_field() end function subroutine test integer :: i type(grid) :: g g = new_field()%mesh ! { dg-error "can not be a function reference" } call new_field()%mesh%new_grid() ! { dg-error "Syntax error" } i = new_field() % mesh%new_int() ! { dg-error "can not be a function reference" } end subroutine end module