From 63af1586ca44b400ccde5928dc5a3308637083bf Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Sun, 19 Feb 2017 19:59:20 +0000 Subject: [PATCH] re PR fortran/79447 ([F08] gfortran rejects valid & accepts invalid internal subprogram in a submodule) 2017-02-19 Paul Thomas 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-19 Paul Thomas PR fortran/79447 * gfortran.dg/submodule_24.f08 : New test. From-SVN: r245582 --- gcc/fortran/ChangeLog | 10 +++++++++- gcc/fortran/decl.c | 12 ++++++----- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/submodule_24.f08 | 23 ++++++++++++++++++++++ 4 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/submodule_24.f08 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3dfbbc5ed5b..fb7123472d7 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,12 @@ -017-02-19 Paul Thomas +2017-02-19 Paul Thomas + + 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-19 Paul Thomas PR fortran/79402 * resolve.c (fixup_unique_dummy): New function. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index a92e06aa6fc..d3e7e84236e 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -1499,7 +1499,7 @@ gfc_set_constant_character_len (int len, gfc_expr *expr, int check_len) 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); @@ -6756,7 +6756,7 @@ gfc_match_end (gfc_statement *st) match m; gfc_namespace *parent_ns, *ns, *prev_ns; gfc_namespace **nsp; - bool abreviated_modproc_decl; + bool abreviated_modproc_decl = false; bool got_matching_end = false; old_loc = gfc_current_locus; @@ -6780,15 +6780,17 @@ gfc_match_end (gfc_statement *st) 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; } - abreviated_modproc_decl - = gfc_current_block () - && gfc_current_block ()->abr_modproc_decl; + if (!abreviated_modproc_decl) + abreviated_modproc_decl = gfc_current_block () + && gfc_current_block ()->abr_modproc_decl; switch (state) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index eb74a459abf..1f6f9671022 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-19 Paul Thomas + + PR fortran/79447 + * gfortran.dg/submodule_24.f08 : New test. + 2017-02-19 Andre Vehreschild PR fortran/79229 diff --git a/gcc/testsuite/gfortran.dg/submodule_24.f08 b/gcc/testsuite/gfortran.dg/submodule_24.f08 new file mode 100644 index 00000000000..88b40fd58d5 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/submodule_24.f08 @@ -0,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 +! +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 -- 2.30.2