===================================================================
@@ -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
+
===================================================================
@@ -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.
===================================================================
@@ -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 */
===================================================================
@@ -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
===================================================================
@@ -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)