Patchwork [fortran] PR54107: ICE on recursive interfaces and PR54195: symbol bogusly inserted twice in the interface.

login
register
mail settings
Submitter Mikael Morin
Date Feb. 4, 2013, 6:39 p.m.
Message ID <51100068.2040808@sfr.fr>
Download mbox | patch
Permalink /patch/218033/
State New
Headers show

Comments

Mikael Morin - Feb. 4, 2013, 6:39 p.m.
Le 04/02/2013 14:02, Mikael Morin a écrit :
>>> The fix, as discussed in PR54195, adds a flag to mark a symbol as
>>> resolved.
>>
>> Why not add this flag directly to gfc_symbol instead of
>> symbol_attribute? It seems we do not need the attribute for components
>> (or do we?).
> Hum, indeed.  symbol_attribute, despite its name, also applies to
> components :-/.
> OK, I'll move the flag to gfc_symbol.
> 
Committed as follows. revision 195729.
The other patch will follow.

Patch

Index: testsuite/gfortran.dg/recursive_interface_1.f90
===================================================================
--- testsuite/gfortran.dg/recursive_interface_1.f90	(révision 0)
+++ testsuite/gfortran.dg/recursive_interface_1.f90	(révision 195729)
@@ -0,0 +1,20 @@ 
+! { dg-do compile }
+!
+! PR fortran/54107
+! The compiler used to ICE on recursive interfaces.
+
+module m
+ contains
+  function foo() result(r1)
+    procedure(foo), pointer :: r1 
+  end function foo
+
+  function bar() result(r2)
+    procedure(baz), pointer :: r2
+  end function bar
+
+  function baz() result(r3)
+    procedure(bar), pointer :: r3
+  end function baz
+end module m
+
Index: testsuite/ChangeLog
===================================================================
--- testsuite/ChangeLog	(révision 195728)
+++ testsuite/ChangeLog	(révision 195729)
@@ -1,3 +1,8 @@ 
+2013-02-04  Mikael Morin  <mikael@gcc.gnu.org>
+
+	PR fortran/54107
+	* gfortran.dg/recursive_interface_1.f90: New test.
+
 2013-02-04  Richard Guenther  <rguenther@suse.de>
 
 	PR lto/56168
@@ -97,7 +102,7 @@ 
 	* lib/target-supports-dg.exp (dg-process-target): Use expr to
 	evaluate the end index in string range.
 
-2012-01-30  Tobias Burnus  <burnus@net-b.de>
+2013-01-30  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/56138
 	* gfortran.dg/allocatable_function_6.f90: New.
Index: fortran/gfortran.h
===================================================================
--- fortran/gfortran.h	(révision 195728)
+++ fortran/gfortran.h	(révision 195729)
@@ -1248,6 +1248,9 @@  typedef struct gfc_symbol
   unsigned equiv_built:1;
   /* Set if this variable is used as an index name in a FORALL.  */
   unsigned forall_index:1;
+  /* Used to avoid multiple resolutions of a single symbol.  */
+  unsigned resolved:1;
+
   int refs;
   struct gfc_namespace *ns;	/* namespace containing this symbol */
 
Index: fortran/ChangeLog
===================================================================
--- fortran/ChangeLog	(révision 195728)
+++ fortran/ChangeLog	(révision 195729)
@@ -1,3 +1,12 @@ 
+2013-02-04  Mikael Morin  <mikael@gcc.gnu.org>
+
+	PR fortran/54107
+	PR fortran/54195
+	* gfortran.h (struct gfc_symbol): New field 'resolved'.
+	* resolve.c (resolve_fl_var_and_proc): Don't skip result symbols.
+	(resolve_symbol): Skip duplicate calls.  Don't check the current
+	namespace.
+
 2013-02-02  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
 	PR fortran/50627
@@ -7,7 +16,7 @@ 
 	* parse.c (parse_module):  Do not put namespace into
 	gsymbol on error.
 
-2012-01-30  Tobias Burnus  <burnus@net-b.de>
+2013-01-30  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/56138
 	* trans-decl.c (gfc_trans_deferred_vars): Fix deferred-length
@@ -214,7 +223,7 @@ 
 	finalizer_insert_packed_call, generate_finalization_wrapper):
 	Clean up by using gfc_build_intrinsic_call.
 
-2012-01-07  Tobias Burnus  <burnus@net-b.de>
+2013-01-07  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/55763
 	* resolve.c (resolve_select_type): Reject intrinsic types for
Index: fortran/resolve.c
===================================================================
--- fortran/resolve.c	(révision 195728)
+++ fortran/resolve.c	(révision 195729)
@@ -11051,11 +11051,6 @@  resolve_fl_var_and_proc (gfc_symbol *sym, int mp_f
 {
   gfc_array_spec *as;
 
-  /* Avoid double diagnostics for function result symbols.  */
-  if ((sym->result || sym->attr.result) && !sym->attr.dummy
-      && (sym->ns != gfc_current_ns))
-    return SUCCESS;
-
   if (sym->ts.type == BT_CLASS && sym->attr.class_ok)
     as = CLASS_DATA (sym)->as;
   else
@@ -13170,6 +13165,10 @@  resolve_symbol (gfc_symbol *sym)
   gfc_array_spec *as;
   bool saved_specification_expr;
 
+  if (sym->resolved)
+    return;
+  sym->resolved = 1;
+
   if (sym->attr.artificial)
     return;
 
@@ -13779,7 +13778,6 @@  resolve_symbol (gfc_symbol *sym)
      described in 14.7.5, to those variables that have not already
      been assigned one.  */
   if (sym->ts.type == BT_DERIVED
-      && sym->ns == gfc_current_ns
       && !sym->value
       && !sym->attr.allocatable
       && !sym->attr.alloc_comp)