Dear All, This patch is straightforward, verging on 'obvious'.
Bootstraps and regtests on FC23/x86_64 - OK for trunk and 6 branch? Cheers Paul 2017-02-15 Paul Thomas <pa...@gcc.gnu.org> PR fortran/79447 * decl.c (gfc_set_constant_character_len): Whitespace. (gfc_match_end): Catch case where a procedure is contained in a module procedure and ensure that 'end procedure' is the correct termination. 2017-02-15 Paul Thomas <pa...@gcc.gnu.org> PR fortran/79447 * gfortran.dg/submodule_24.f08 : New test.
Index: gcc/fortran/decl.c =================================================================== *** gcc/fortran/decl.c (revision 245196) --- gcc/fortran/decl.c (working copy) *************** gfc_set_constant_character_len (int len, *** 1499,1505 **** if (expr->ts.type != BT_CHARACTER) return; ! if (expr->expr_type != EXPR_CONSTANT) { gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where); --- 1499,1505 ---- if (expr->ts.type != BT_CHARACTER) return; ! if (expr->expr_type != EXPR_CONSTANT) { gfc_error_now ("CHARACTER length must be a constant at %L", &expr->where); *************** gfc_match_end (gfc_statement *st) *** 6756,6762 **** match m; gfc_namespace *parent_ns, *ns, *prev_ns; gfc_namespace **nsp; ! bool abreviated_modproc_decl; bool got_matching_end = false; old_loc = gfc_current_locus; --- 6756,6762 ---- match m; gfc_namespace *parent_ns, *ns, *prev_ns; gfc_namespace **nsp; ! bool abreviated_modproc_decl = false; bool got_matching_end = false; old_loc = gfc_current_locus; *************** gfc_match_end (gfc_statement *st) *** 6780,6794 **** state = gfc_state_stack->previous->state; block_name = gfc_state_stack->previous->sym == NULL ? NULL : gfc_state_stack->previous->sym->name; break; default: break; } ! abreviated_modproc_decl ! = gfc_current_block () ! && gfc_current_block ()->abr_modproc_decl; switch (state) { --- 6780,6796 ---- state = gfc_state_stack->previous->state; block_name = gfc_state_stack->previous->sym == NULL ? NULL : gfc_state_stack->previous->sym->name; + abreviated_modproc_decl = gfc_state_stack->previous->sym + && gfc_state_stack->previous->sym->abr_modproc_decl; break; default: break; } ! if (!abreviated_modproc_decl) ! abreviated_modproc_decl = gfc_current_block () ! && gfc_current_block ()->abr_modproc_decl; switch (state) { Index: gcc/testsuite/gfortran.dg/submodule_24.f08 =================================================================== *** gcc/testsuite/gfortran.dg/submodule_24.f08 (nonexistent) --- gcc/testsuite/gfortran.dg/submodule_24.f08 (working copy) *************** *** 0 **** --- 1,23 ---- + ! { dg-do compile } + ! Test the fix for PR79447, in which the END PROCEDURE statement + ! for MODULE PROCEDURE foo was not accepted. + ! + ! Contributed by Damian Rouson <dam...@sourceryinstitute.org> + ! + module foo_interface + implicit none + interface + module subroutine foo() + end subroutine + end interface + end module foo_interface + + submodule(foo_interface) foo_implementation + contains + module procedure foo + contains + module subroutine bar() + end subroutine + end procedure + !end subroutine ! gfortran accepted this invalid workaround + end submodule