Hello, The following patches fix both PR54107 and PR54195. - In PR54107(comment 26), the procedure result is a procedure pointer whose interface is the procedure itself, which leads to an infinite recursion during resolution. - In PR54195, a type's type bound procedures are resolved twice, leading to a symbol being added twice in an interface and rejected.
The fix, as discussed in PR54195, adds a flag to mark a symbol as resolved. This leads to two regressions. For class_20, a check to skip result symbols had to be removed (which was there to avoid duplicated resolution). For initialization_27 (among a few others) the code adding the default initialization code was guarded by a check against gfc_current_ns, which always ended triggering when there was more than one resolution but may not anymore. The fix removes it; I checked that gfc_current_ns wasn't used in the following code. The second fix makes the recursion through resolve_symbol, so that the flag just added triggers and PR54195 is fixed. Regression tested on x86_64-unknown-linux-gnu. OK for trunk? Mikael
2013-02-03 Mikael Morin <mik...@gcc.gnu.org> PR fortran/54107 PR fortran/54195 * gfortran.h (struct symbol_attribute): New field 'resolved'. * resolve.c (resolve_fl_var_and_proc): Don't skip result symbols. (resolve_symbol): Skip duplicate calls. Don' check the current namespace. 2013-02-03 Mikael Morin <mik...@gcc.gnu.org> PR fortran/54107 * gfortran.dg/recursive_interface_1.f90: New test.
diff --git a/gfortran.h b/gfortran.h index 16751b4..af2b45a 100644 --- a/gfortran.h +++ b/gfortran.h @@ -810,6 +810,9 @@ typedef struct /* Attributes set by compiler extensions (!GCC$ ATTRIBUTES). */ unsigned ext_attr:EXT_ATTR_NUM; + /* Used to avoid multiple resolutions of a single symbol. */ + unsigned resolved:1; + /* The namespace where the attribute has been set. */ struct gfc_namespace *volatile_ns, *asynchronous_ns; } diff --git a/resolve.c b/resolve.c index d6bae43..3b74c6f 100644 --- a/resolve.c +++ b/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->attr.resolved) + return; + sym->attr.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)
! { 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
2013-02-03 Mikael Morin <mik...@gcc.gnu.org> PR fortran/54195 * resolve.c (resolve_typebound_procedures): Recurse through resolve_symbol. 2013-02-03 Mikael Morin <mik...@gcc.gnu.org> PR fortran/54195 * gfortran.dg/defined_assignment_4.f90: New test. * gfortran.dg/defined_assignment_5.f90: New test.
diff --git a/resolve.c b/resolve.c index 3b74c6f..6bec662 100644 --- a/resolve.c +++ b/resolve.c @@ -12344,7 +12344,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;
! { dg-do compile } ! ! PR fortran/54195 ! The compiler used to diagnose a duplicate entity in the assignment interface ! because NC was resolved twice. ! ! Contributed by Damian Rouson <dam...@rouson.net> module import_clashes_with_generic type ,abstract :: foo contains procedure :: unary generic :: operator(-) => unary end type abstract interface integer function bar() import :: foo end function end interface contains integer function unary(rhs) class(foo) ,intent(in) :: rhs end function end module
! { dg-do compile } ! ! PR fortran/54195 ! The compiler used to diagnose a duplicate entity in the assignment interface ! because NC was resolved twice. ! ! Contributed by Andrew Benson <aben...@obs.carnegiescience.edu> module gn implicit none type :: nc contains procedure :: assign => nca generic :: assignment(=) => assign end type type, extends(nc) :: ncb contains procedure , nopass :: tis => bf end type contains subroutine nca(to,from) class(nc), intent(out) :: to type(nc), intent(in) :: from end subroutine logical function bf() bf=.false. end function end module