+2008-11-16 Mikael Morin <mikael.morin@tele2.fr>
+
+ PR fortran/37992
+ * gfortran.h (gfc_namespace): Added member old_cl_list,
+ backup of cl_list.
+ (gfc_free_charlen): Added prototype.
+ * symbol.c (gfc_free_charlen): New function.
+ (gfc_free_namespace): Use gfc_free_charlen.
+ * parse.c (next_statement): Backup gfc_current_ns->cl_list.
+ (reject_statement): Restore gfc_current_ns->cl_list.
+ Free cl_list's elements before dropping them.
+
2008-11-16 Tobias Burnus <burnus@net-b.de>
PR fortran/38095
this namespace. */
struct gfc_data *data;
- gfc_charlen *cl_list;
+ gfc_charlen *cl_list, *old_cl_list;
int save_all, seen_save, seen_implicit_none;
void gfc_undo_symbols (void);
void gfc_commit_symbols (void);
void gfc_commit_symbol (gfc_symbol *);
+void gfc_free_charlen (gfc_charlen *, gfc_charlen *);
void gfc_free_namespace (gfc_namespace *);
void gfc_symbol_init_2 (void);
locus old_locus;
gfc_new_block = NULL;
+ gfc_current_ns->old_cl_list = gfc_current_ns->cl_list;
for (;;)
{
gfc_statement_label = NULL;
static void
reject_statement (void)
{
+ /* Revert to the previous charlen chain. */
+ gfc_free_charlen (gfc_current_ns->cl_list, gfc_current_ns->old_cl_list);
+ gfc_current_ns->cl_list = gfc_current_ns->old_cl_list;
+
gfc_new_block = NULL;
gfc_undo_symbols ();
gfc_clear_warning ();
}
+/* Free the charlen list from cl to end (end is not freed).
+ Free the whole list if end is NULL. */
+
+void gfc_free_charlen (gfc_charlen *cl, gfc_charlen *end)
+{
+ gfc_charlen *cl2;
+
+ for (; cl != end; cl = cl2)
+ {
+ gcc_assert (cl);
+
+ cl2 = cl->next;
+ gfc_free_expr (cl->length);
+ gfc_free (cl);
+ }
+}
+
+
/* Free a namespace structure and everything below it. Interface
lists associated with intrinsic operators are not freed. These are
taken care of when a specific name is freed. */
void
gfc_free_namespace (gfc_namespace *ns)
{
- gfc_charlen *cl, *cl2;
gfc_namespace *p, *q;
gfc_intrinsic_op i;
free_uop_tree (ns->uop_root);
free_common_tree (ns->common_root);
gfc_free_finalizer_list (ns->finalizers);
-
- for (cl = ns->cl_list; cl; cl = cl2)
- {
- cl2 = cl->next;
- gfc_free_expr (cl->length);
- gfc_free (cl);
- }
-
+ gfc_free_charlen (ns->cl_list, NULL);
free_st_labels (ns->st_labels);
gfc_free_equiv (ns->equiv);
+2008-11-16 Mikael Morin <mikael.morin@tele2.fr>
+
+ PR fortran/37992
+ * gfotran.dg/charlen_free_1.f90: New test.
+
2008-11-16 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libfortran/38097