aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2007-06-05 20:23:44 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2007-06-05 20:23:44 +0000
commitde8936774aa298f3a2e907702d27b7675a7fe7a2 (patch)
tree7d511f2e0a50fe6f0bcfdce1c5e0544809902df0 /gcc/fortran
parent52ff33d0eb56df70238a99b7aa66140609f3abc3 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--gcc/fortran/parse.c16
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;