diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/submodule_24.f08 | 23 |
4 files changed, 44 insertions, 6 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3dfbbc5..fb71234 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,12 @@ -017-02-19 Paul Thomas <pault@gcc.gnu.org> +2017-02-19 Paul Thomas <pault@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-19 Paul Thomas <pault@gcc.gnu.org> PR fortran/79402 * resolve.c (fixup_unique_dummy): New function. diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index a92e06a..d3e7e84 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 eb74a45..1f6f967 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-19 Paul Thomas <pault@gcc.gnu.org> + + PR fortran/79447 + * gfortran.dg/submodule_24.f08 : New test. + 2017-02-19 Andre Vehreschild <vehre@gcc.gnu.org> 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 0000000..88b40fd --- /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 <damian@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 |