aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJerry DeLisle <jvdelisle@gcc.gnu.org>2006-10-27 20:47:28 +0000
committerJerry DeLisle <jvdelisle@gcc.gnu.org>2006-10-27 20:47:28 +0000
commita9f6f1f27fd181ed18eab6a61a055ba8a55817b0 (patch)
tree9d7bdaf4ce466133c4469aa04221cb3c9ad73d70
parent95c0fb7a066b8f41723150b08e4aa3c08622bc2b (diff)
downloadgcc-a9f6f1f27fd181ed18eab6a61a055ba8a55817b0.zip
gcc-a9f6f1f27fd181ed18eab6a61a055ba8a55817b0.tar.gz
gcc-a9f6f1f27fd181ed18eab6a61a055ba8a55817b0.tar.bz2
re PR fortran/27954 (ICE on garbage in DATA statement)
2006-10-27 Jerry DeLisle <jvdelisle@gcc.gnu.org> PR fortran/27954 * decl.c (gfc_free_data_all): New function to free all data structures after errors in DATA statements and declarations. (top_var_list): Use new function.(top_val_list): Use new function. (gfc_match_data_decl): Use new function. * misc.c (gfc_typename): Fixed incorrect function name in error text. From-SVN: r118084
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/decl.c19
-rw-r--r--gcc/fortran/misc.c2
3 files changed, 29 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0d29f46..8ff4a5f 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2006-10-27 Jerry DeLisle <jvdelisle@gcc.gnu.org>
+
+ PR fortran/27954
+ * decl.c (gfc_free_data_all): New function to free all data structures
+ after errors in DATA statements and declarations.
+ (top_var_list): Use new function.(top_val_list): Use new function.
+ (gfc_match_data_decl): Use new function.
+ * misc.c (gfc_typename): Fixed incorrect function name in error text.
+
2006-10-24 Erik Edelmann <eedelman@gcc.gnu.org>
PR fortran/29393
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 02dc38c..fbd2bbb 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -128,6 +128,21 @@ gfc_free_data (gfc_data * p)
}
+/* Free all data in a namespace. */
+static void
+gfc_free_data_all (gfc_namespace * ns)
+{
+ gfc_data *d;
+
+ for (;ns->data;)
+ {
+ d = ns->data->next;
+ gfc_free (ns->data);
+ ns->data = d;
+ }
+}
+
+
static match var_element (gfc_data_variable *);
/* Match a list of variables terminated by an iterator and a right
@@ -262,6 +277,7 @@ top_var_list (gfc_data * d)
syntax:
gfc_syntax_error (ST_DATA);
+ gfc_free_data_all (gfc_current_ns);
return MATCH_ERROR;
}
@@ -374,6 +390,7 @@ top_val_list (gfc_data * data)
syntax:
gfc_syntax_error (ST_DATA);
+ gfc_free_data_all (gfc_current_ns);
return MATCH_ERROR;
}
@@ -2368,6 +2385,8 @@ ok:
gfc_error ("Syntax error in data declaration at %C");
m = MATCH_ERROR;
+ gfc_free_data_all (gfc_current_ns);
+
cleanup:
gfc_free_array_spec (current_as);
current_as = NULL;
diff --git a/gcc/fortran/misc.c b/gcc/fortran/misc.c
index 4d94d7f..bafb698 100644
--- a/gcc/fortran/misc.c
+++ b/gcc/fortran/misc.c
@@ -193,7 +193,7 @@ gfc_typename (gfc_typespec * ts)
strcpy (buffer, "UNKNOWN");
break;
default:
- gfc_internal_error ("gfc_typespec(): Undefined type");
+ gfc_internal_error ("gfc_typename(): Undefined type");
}
return buffer;