diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2017-02-19 19:59:20 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2017-02-19 19:59:20 +0000 |
commit | 63af1586ca44b400ccde5928dc5a3308637083bf (patch) | |
tree | ddab479b52277ed3394bab1e6107ae8bcd9b4104 /gcc/fortran | |
parent | 4ca4d1e95e39d256095f8274d8dd0d04aed603da (diff) | |
download | gcc-63af1586ca44b400ccde5928dc5a3308637083bf.zip gcc-63af1586ca44b400ccde5928dc5a3308637083bf.tar.gz gcc-63af1586ca44b400ccde5928dc5a3308637083bf.tar.bz2 |
re PR fortran/79447 ([F08] gfortran rejects valid & accepts invalid internal subprogram in a submodule)
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/79447
* gfortran.dg/submodule_24.f08 : New test.
From-SVN: r245582
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 10 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 12 |
2 files changed, 16 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) { |