diff options
author | Daniel Kraft <d@domob.eu> | 2008-08-08 20:19:46 +0200 |
---|---|---|
committer | Daniel Kraft <domob@gcc.gnu.org> | 2008-08-08 20:19:46 +0200 |
commit | f6fad28ea1317a6aa30869b40c427ad56c6950c5 (patch) | |
tree | 678252b637e4e677cc46910a5305aa008a9af981 /gcc/fortran/module.c | |
parent | 174ef36d7223171145b3d3eed56b6ebb9a5d63d9 (diff) | |
download | gcc-f6fad28ea1317a6aa30869b40c427ad56c6950c5.zip gcc-f6fad28ea1317a6aa30869b40c427ad56c6950c5.tar.gz gcc-f6fad28ea1317a6aa30869b40c427ad56c6950c5.tar.bz2 |
gfortran.h (gfc_finalizer): Replaced member `procedure' by two new members `proc_sym' and `proc_tree' to...
2008-08-08 Daniel Kraft <d@domob.eu>
* gfortran.h (gfc_finalizer): Replaced member `procedure' by two
new members `proc_sym' and `proc_tree' to store the symtree after
resolution.
(gfc_find_sym_in_symtree): Made public.
* decl.c (gfc_match_final_decl): Adapted for new member name.
* interface.c (gfc_find_sym_in_symtree): Made public.
(gfc_extend_expr), (gfc_extend_assign): Changed call accordingly.
* module.c (mio_finalizer), (mio_f2k_derived), (mio_full_f2k_derived):
New methods for module-file IO of f2k_derived.
(mio_symbol): Do IO of f2k_derived namespace.
* resolve.c (gfc_resolve_finalizers): Adapted for new member name and
finding the symtree for the symbol here.
* symbol.c (gfc_free_finalizer): Adapted for new members.
2008-08-08 Daniel Kraft <d@domob.eu>
* gfortran.dg/finalize_9.f03: New test.
* gfortran.dg/module_md5_1.f90: Adapted MD5-sum for changed module
file format.
From-SVN: r138884
Diffstat (limited to 'gcc/fortran/module.c')
-rw-r--r-- | gcc/fortran/module.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index ed575f9..7da5be1 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -3168,6 +3168,78 @@ mio_namespace_ref (gfc_namespace **nsp) } +/* Save/restore the f2k_derived namespace of a derived-type symbol. */ + +static void +mio_finalizer (gfc_finalizer **f) +{ + if (iomode == IO_OUTPUT) + { + gcc_assert (*f); + gcc_assert ((*f)->proc_tree); /* Should already be resolved. */ + mio_symtree_ref (&(*f)->proc_tree); + } + else + { + *f = gfc_get_finalizer (); + (*f)->where = gfc_current_locus; /* Value should not matter. */ + (*f)->next = NULL; + + mio_symtree_ref (&(*f)->proc_tree); + (*f)->proc_sym = NULL; + } +} + +static void +mio_f2k_derived (gfc_namespace *f2k) +{ + /* Handle the list of finalizer procedures. */ + mio_lparen (); + if (iomode == IO_OUTPUT) + { + gfc_finalizer *f; + for (f = f2k->finalizers; f; f = f->next) + mio_finalizer (&f); + } + else + { + f2k->finalizers = NULL; + while (peek_atom () != ATOM_RPAREN) + { + gfc_finalizer *cur; + mio_finalizer (&cur); + cur->next = f2k->finalizers; + f2k->finalizers = cur; + } + } + mio_rparen (); +} + +static void +mio_full_f2k_derived (gfc_symbol *sym) +{ + mio_lparen (); + + if (iomode == IO_OUTPUT) + { + if (sym->f2k_derived) + mio_f2k_derived (sym->f2k_derived); + } + else + { + if (peek_atom () != ATOM_RPAREN) + { + sym->f2k_derived = gfc_get_namespace (NULL, 0); + mio_f2k_derived (sym->f2k_derived); + } + else + gcc_assert (!sym->f2k_derived); + } + + mio_rparen (); +} + + /* Unlike most other routines, the address of the symbol node is already fixed on input and the name/module has already been filled in. */ @@ -3230,6 +3302,9 @@ mio_symbol (gfc_symbol *sym) sym->component_access = MIO_NAME (gfc_access) (sym->component_access, access_types); + /* Load/save the f2k_derived namespace of a derived-type symbol. */ + mio_full_f2k_derived (sym); + mio_namelist (sym); /* Add the fields that say whether this is from an intrinsic module, |