http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54195



--- Comment #13 from Mikael Morin <mikael at gcc dot gnu.org> 2013-02-02 
11:07:30 UTC ---

(In reply to comment #12)

> (In reply to comment #11)

> > The `gfc_namespace' struct has a `resolved' attribute.  Maybe we can use it?

> 

> Not sure. I was thinking that we may need such an attribute for each type

> symbol ("gfc_symbol.resolved"?). See e.g. PR 44978 for a related problem.



It is actually not as trivial as it looks.  In PR44978, the recursion on the

parent type is in resolve_fl_derived0.  So the flag should be used there.

However, in this bug the recursion on the parent type is in

resolve_typebound_procedures, so the same flag can't be used for both. The

latter recursion can be made through resolve_fl_derived, or even through

resolve_symbol (see patch below), but it would keep the recursion in

resolve_fl_derived0 untouched, hence PR44978 unfixed.  To fix both, there

should be almost one flag per function, and one should cache the return values

as well. :-(



So the easiest IMO is the following:

This fixes PR54107 comment 26:



diff --git a/gfortran.h b/gfortran.h

index 16751b4..f93e4d3 100644

--- a/gfortran.h

+++ b/gfortran.h

@@ -696,6 +696,9 @@ extern const ext_attr_t ext_attr_list[];

 /* Symbol attribute structure.  */

 typedef struct

 {

+  gfc_try resolve_cached_result;

+  unsigned resolved:1;

+

   /* Variable attributes.  */

   unsigned allocatable:1, dimension:1, codimension:1, external:1, intrinsic:1,

     optional:1, pointer:1, target:1, value:1, volatile_:1, temporary:1,

diff --git a/resolve.c b/resolve.c

index d6bae43..ef06f4e 100644

--- a/resolve.c

+++ b/resolve.c

@@ -13170,6 +13170,10 @@ resolve_symbol (gfc_symbol *sym)

   gfc_array_spec *as;

   bool saved_specification_expr;



+  if (sym->attr.resolved)

+    return;

+  sym->attr.resolved = 1;

+

   if (sym->attr.artificial)

     return;





and then, with this:



diff --git a/resolve.c b/resolve.c

index d6bae43..ef06f4e 100644

--- a/resolve.c

+++ b/resolve.c

@@ -12349,7 +12349,7 @@ resolve_typebound_procedures (gfc_symbol* derived)



   super_type = gfc_get_derived_super_type (derived);

   if (super_type)

-    resolve_typebound_procedures (super_type);

+    resolve_symbol (super_type);



   resolve_bindings_derived = derived;

   resolve_bindings_result = SUCCESS;



comment #8 of this bug is fixed as well.  I'm inclined to test and submit both,

and leave PR44978 unfixed.

Reply via email to