* Daniel Kraft wrote on Fri, Jul 04, 2008 at 05:47:57PM CEST:
2008-06-22 Daniel Kraft <d@domob.eu>
* resolve.c (generated_finalizers): New global static needed for
derived type finalization.
(finalize_intent_out_args), (put_finalizers_before): New helper
function for finalization.
(resolve_function): Call finalize_inten_out_args.
finalize_intent_out_args
(gfc_resolve_call): Ditto and made public, renamed from reslve_call.
resolve_call
(resolve_deallocate_expr): Finalize expr before it is deallocated.
(resolve_allocate_deallocate): Call reslve_deallocate_expr with new
resolve_deallocate_expr
locus argument.
(finalize_symbols_tail): New private variabes used for finalization.
variables
(find_finalizable_symbols), (call_finalizing_procedures_at),
(call_finalizing_procedures): New methods used for finalization of
symbols when going out of scope.
(resolve_codes): Initiate finalization of symbols at the end of scope.
--- gcc/fortran/gfortran.h (revision 137369)
+++ gcc/fortran/gfortran.h (working copy)
@@ -1952,16 +1952,24 @@ typedef struct iterator_stack
iterator_stack;
extern iterator_stack *iter_stack;
-
/* Node in the linked list used for storing finalizer procedures. */
typedef struct gfc_finalizer
{
struct gfc_finalizer* next;
- gfc_symbol* procedure;
locus where; /* Where the FINAL declaration occured. */
Has been there before, but would still be good to fix: occurred.
--- gcc/fortran/expr.c (revision 137369)
+++ gcc/fortran/expr.c (working copy)
+/* Helper function to generate a gfc_expr from another one and adding one more
+ reference to the ref-chain. This reference itself is not filled, only a
+ pointer to it returned and the caller must ensure it is intialized
initialized
+ properly. */
+/* XXX: Make this a global, general purpose function? */
+
+static gfc_expr*
+generate_reference_expr (gfc_expr* expr, gfc_ref** reftail, ref_type type)
--- gcc/fortran/resolve.c (revision 137369)
+++ gcc/fortran/resolve.c (working copy)
@@ -6258,6 +6359,12 @@ resolve_code (gfc_code *code, gfc_namesp
if (resolve_ordinary_assign (code, ns))
goto call;
+ else
+ /* Finalize LHS of assignment before executing it. Do only if
+ not an error occured during the above resolution. */
occurred
+ if (code->expr)
+ gfc_finalize_expr (code->expr, false, &generated_finalizers,
+ code->loc);
@@ -9285,6 +9408,119 @@ resolve_types (gfc_namespace *ns)
+ /* If we are inside the main PROGRAM, *only* ALLOCATABLE entities are
+ finalized because the standard explicitelly requests variables there not
explicitly
+ to be finalized but ALLOCATABLE entities are auto-deallocated there. */
+ if (finalize_only_allocatable && !sym->attr.allocatable)
+ return;
Cheers,
Ralf