From 4af8d042f849d47a694edad36c8b1884b938e5d8 Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Mon, 4 Feb 2013 18:34:30 +0000 Subject: [PATCH] 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 --- gcc/fortran/ChangeLog | 13 ++++++++++-- gcc/fortran/gfortran.h | 3 +++ gcc/fortran/resolve.c | 10 ++++------ gcc/testsuite/ChangeLog | 7 ++++++- .../gfortran.dg/recursive_interface_1.f90 | 20 +++++++++++++++++++ 5 files changed, 44 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/recursive_interface_1.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 47be01fd0a9..bde2d1c6f3b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2013-02-04 Mikael Morin + + 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 PR fortran/50627 @@ -7,7 +16,7 @@ * parse.c (parse_module): Do not put namespace into gsymbol on error. -2012-01-30 Tobias Burnus +2013-01-30 Tobias Burnus 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 +2013-01-07 Tobias Burnus PR fortran/55763 * resolve.c (resolve_select_type): Reject intrinsic types for diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 16751b43d29..3b4b4738f20 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -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 */ diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index d6bae43cf84..5083a5d04dd 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -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) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f4eb094c644..8f407555dcb 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-02-04 Mikael Morin + + PR fortran/54107 + * gfortran.dg/recursive_interface_1.f90: New test. + 2013-02-04 Richard Guenther 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 +2013-01-30 Tobias Burnus PR fortran/56138 * gfortran.dg/allocatable_function_6.f90: New. diff --git a/gcc/testsuite/gfortran.dg/recursive_interface_1.f90 b/gcc/testsuite/gfortran.dg/recursive_interface_1.f90 new file mode 100644 index 00000000000..61db0c11024 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/recursive_interface_1.f90 @@ -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 +