From: Janus Weil Date: Sun, 17 Jan 2010 13:33:11 +0000 (+0100) Subject: re PR fortran/42677 (Bogus Error: Ambiguous interfaces '...' in intrinsic assignment... X-Git-Tag: releases/gcc-4.5.0~1178 X-Git-Url: https://gcc.gnu.org/git/?a=commitdiff_plain;h=ae7c61dead40c0674b58c676a225ca05cea3ffe8;p=gcc.git re PR fortran/42677 (Bogus Error: Ambiguous interfaces '...' in intrinsic assignment operator) gcc/fortran/ 2010-01-17 Janus Weil PR fortran/42677 * gfortran.h (symbol_attribute): Remove 'ambiguous_interfaces'. * interface.c (check_interface1): Move a warning message here from resolve_fl_procedure. (check_sym_interfaces): Removed 'attr.ambiguous_interfaces'. * module.c (read_module): Remove call to gfc_check_interfaces, since this comes too early here. * resolve.c (resolve_fl_procedure): Move warning message to check_interface1. gcc/testsuite/ 2010-01-17 Janus Weil PR fortran/42677 * gfortran.dg/interface_assignment_5.f90: New test. From-SVN: r155979 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index af85555a2e7e..b2741b155925 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,15 @@ +2010-01-17 Janus Weil + + PR fortran/42677 + * gfortran.h (symbol_attribute): Remove 'ambiguous_interfaces'. + * interface.c (check_interface1): Move a warning message here from + resolve_fl_procedure. + (check_sym_interfaces): Removed 'attr.ambiguous_interfaces'. + * module.c (read_module): Remove call to gfc_check_interfaces, since + this comes too early here. + * resolve.c (resolve_fl_procedure): Move warning message to + check_interface1. + 2010-01-14 Jerry DeLisle PR fortran/42684 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 345a7015dce3..320de835ce27 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -714,9 +714,6 @@ typedef struct modification of type or type parameters is permitted. */ unsigned referenced:1; - /* Set if the symbol has ambiguous interfaces. */ - unsigned ambiguous_interfaces:1; - /* Set if this is the symbol for the main program. */ unsigned is_main_program:1; diff --git a/gcc/fortran/interface.c b/gcc/fortran/interface.c index 2a5ece1c465e..f27d75c333fe 100644 --- a/gcc/fortran/interface.c +++ b/gcc/fortran/interface.c @@ -1132,16 +1132,16 @@ check_interface1 (gfc_interface *p, gfc_interface *q0, NULL, 0)) { if (referenced) - { - gfc_error ("Ambiguous interfaces '%s' and '%s' in %s at %L", - p->sym->name, q->sym->name, interface_name, - &p->where); - } - - if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc) + gfc_error ("Ambiguous interfaces '%s' and '%s' in %s at %L", + p->sym->name, q->sym->name, interface_name, + &p->where); + else if (!p->sym->attr.use_assoc && q->sym->attr.use_assoc) gfc_warning ("Ambiguous interfaces '%s' and '%s' in %s at %L", p->sym->name, q->sym->name, interface_name, &p->where); + else + gfc_warning ("Although not referenced, '%s' has ambiguous " + "interfaces at %L", interface_name, &p->where); return 1; } } @@ -1157,7 +1157,6 @@ static void check_sym_interfaces (gfc_symbol *sym) { char interface_name[100]; - bool k; gfc_interface *p; if (sym->ns != gfc_current_ns) @@ -1184,9 +1183,8 @@ check_sym_interfaces (gfc_symbol *sym) /* Originally, this test was applied to host interfaces too; this is incorrect since host associated symbols, from any source, cannot be ambiguous with local symbols. */ - k = sym->attr.referenced || !sym->attr.use_assoc; - if (check_interface1 (sym->generic, sym->generic, 1, interface_name, k)) - sym->attr.ambiguous_interfaces = 1; + check_interface1 (sym->generic, sym->generic, 1, interface_name, + sym->attr.referenced || !sym->attr.use_assoc); } } diff --git a/gcc/fortran/module.c b/gcc/fortran/module.c index 667bab83c497..13c9b8293221 100644 --- a/gcc/fortran/module.c +++ b/gcc/fortran/module.c @@ -4482,8 +4482,6 @@ read_module (void) module_name); } - gfc_check_interfaces (gfc_current_ns); - /* Now we should be in a position to fill f2k_derived with derived type extensions, since everything has been loaded. */ set_module_locus (&extensions); diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 9212521b2f39..6bc5fde020bf 100644 --- a/gcc/fortran/resolve.c +++ b/gcc/fortran/resolve.c @@ -9077,10 +9077,6 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag) { gfc_formal_arglist *arg; - if (sym->attr.ambiguous_interfaces && !sym->attr.referenced) - gfc_warning ("Although not referenced, '%s' at %L has ambiguous " - "interfaces", sym->name, &sym->declared_at); - if (sym->attr.function && resolve_fl_var_and_proc (sym, mp_flag) == FAILURE) return FAILURE; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5272d3d9da9d..f92f6c55d075 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2010-01-17 Janus Weil + + PR fortran/42677 + * gfortran.dg/interface_assignment_5.f90: New test. + 2010-01-17 Dodji Seketeli PR c++/42697 diff --git a/gcc/testsuite/gfortran.dg/interface_assignment_5.f90 b/gcc/testsuite/gfortran.dg/interface_assignment_5.f90 new file mode 100644 index 000000000000..8444dd0847eb --- /dev/null +++ b/gcc/testsuite/gfortran.dg/interface_assignment_5.f90 @@ -0,0 +1,49 @@ +! { dg-do compile } +! +! PR 42677: [4.5 Regression] Bogus Error: Ambiguous interfaces '...' in intrinsic assignment operator +! +! Contributed by Harald Anlauf + +module mod1 + implicit none + type t_m + integer :: i = 0 + end type t_m +!------------------------------------------------------------------------------ + interface assignment (=) + module procedure assign_m + end interface +!------------------------------------------------------------------------------ +contains + subroutine assign_m (y, x) + type(t_m) ,intent(inout) :: y + type(t_m) ,intent(in) :: x + end subroutine assign_m +end module mod1 +!============================================================================== +module mod2 + use mod1, only: t_m, assignment(=) + implicit none + type t_atm + integer :: k + end type t_atm +!------------------------------------------------------------------------------ + interface assignment(=) + module procedure assign_to_atm + end interface +!------------------------------------------------------------------------------ + interface + pure subroutine delete_m (x) + use mod1 + type(t_m) ,intent(in) :: x + end subroutine delete_m + end interface +!------------------------------------------------------------------------------ +contains + subroutine assign_to_atm (atm, r) + type(t_atm) ,intent(inout) :: atm + integer ,intent(in) :: r + end subroutine assign_to_atm +end module mod2 + +! { dg-final { cleanup-modules "mod1 mod2" } }