diff options
author | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-06-05 20:23:44 +0000 |
---|---|---|
committer | Jerry DeLisle <jvdelisle@gcc.gnu.org> | 2007-06-05 20:23:44 +0000 |
commit | de8936774aa298f3a2e907702d27b7675a7fe7a2 (patch) | |
tree | 7d511f2e0a50fe6f0bcfdce1c5e0544809902df0 /gcc/fortran | |
parent | 52ff33d0eb56df70238a99b7aa66140609f3abc3 (diff) | |
download | gcc-de8936774aa298f3a2e907702d27b7675a7fe7a2.zip gcc-de8936774aa298f3a2e907702d27b7675a7fe7a2.tar.gz gcc-de8936774aa298f3a2e907702d27b7675a7fe7a2.tar.bz2 |
re PR fortran/18923 (segfault after subroutine name confusion)
2007-06-05 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR fortran/18923
* parse.c (decode_statement): Don't call gfc_undo_symbols on MATCH_ERROR
for ST_FUNCTION since it is called in reject_statement.
(parse_contained): If error, loop back after reject_statement and try
again. Free the namespace if an error occured.
From-SVN: r125342
Diffstat (limited to 'gcc/fortran')
-rw-r--r-- | gcc/fortran/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/fortran/parse.c | 16 |
2 files changed, 20 insertions, 4 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 4383aba..cdf96cd 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2007-06-05 Jerry DeLisle <jvdelisle@gcc.gnu.org> + + PR fortran/18923 + * parse.c (decode_statement): Don't call gfc_undo_symbols on MATCH_ERROR + for ST_FUNCTION since it is called in reject_statement. + (parse_contained): If error, loop back after reject_statement and try + again. Free the namespace if an error occured. + 2007-06-04 Lee Millward <lee.millward@codesourcery.com> * trans-intrinsic.c (gfc_conv_intrinsic_function_args): Adjust diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 46604cf..761e631 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -117,8 +117,8 @@ decode_statement (void) return ST_FUNCTION; else if (m == MATCH_ERROR) reject_statement (); - - gfc_undo_symbols (); + else + gfc_undo_symbols (); gfc_current_locus = old_locus; } @@ -2775,12 +2775,13 @@ gfc_fixup_sibling_symbols (gfc_symbol *sym, gfc_namespace *siblings) static void parse_contained (int module) { - gfc_namespace *ns, *parent_ns; + gfc_namespace *ns, *parent_ns, *tmp; gfc_state_data s1, s2; gfc_statement st; gfc_symbol *sym; gfc_entry_list *el; int contains_statements = 0; + int seen_error = 0; push_state (&s1, COMP_CONTAINS, NULL); parent_ns = gfc_current_ns; @@ -2792,6 +2793,9 @@ parse_contained (int module) gfc_current_ns->sibling = parent_ns->contained; parent_ns->contained = gfc_current_ns; + next: + /* Process the next available statement. We come here if we got an error + and rejected the last statement. */ st = next_statement (); switch (st) @@ -2867,6 +2871,8 @@ parse_contained (int module) gfc_error ("Unexpected %s statement in CONTAINS section at %C", gfc_ascii_statement (st)); reject_statement (); + seen_error = 1; + goto next; break; } } @@ -2875,8 +2881,10 @@ parse_contained (int module) /* The first namespace in the list is guaranteed to not have anything (worthwhile) in it. */ - + tmp = gfc_current_ns; gfc_current_ns = parent_ns; + if (seen_error && tmp->refs > 1) + gfc_free_namespace (tmp); ns = gfc_current_ns->contained; gfc_current_ns->contained = ns->sibling; |