This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, Fortran] Derived type finalization: Already somewhat useable...


Ralf Wildenhues wrote:
Hello Daniel,

A quick typo-only review:

Thanks Ralf,


fixed and hopefully I'll spell those right next time ;)

Daniel

* 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



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]