re PR fortran/54107 ([F03] Memory hog with abstract interface)

fortran/
	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.

testsuite/
	PR fortran/54107
	* gfortran.dg/recursive_interface_1.f90: New test.

From-SVN: r195729
This commit is contained in:
Mikael Morin 2013-02-04 18:34:30 +00:00
parent 7ac3af3836
commit 4af8d042f8
5 changed files with 44 additions and 9 deletions

View File

@ -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

View File

@ -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 */

View File

@ -11051,11 +11051,6 @@ resolve_fl_var_and_proc (gfc_symbol *sym, int mp_flag)
{
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)

View File

@ -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.

View File

@ -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