re PR fortran/42677 (Bogus Error: Ambiguous interfaces '...' in intrinsic assignment operator)

gcc/fortran/
2010-01-17  Janus Weil  <janus@gcc.gnu.org>

	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  <janus@gcc.gnu.org>

	PR fortran/42677
	* gfortran.dg/interface_assignment_5.f90: New test.

From-SVN: r155979
This commit is contained in:
Janus Weil 2010-01-17 14:33:11 +01:00
parent 8232dc6427
commit ae7c61dead
7 changed files with 75 additions and 20 deletions

View File

@ -1,3 +1,15 @@
2010-01-17 Janus Weil <janus@gcc.gnu.org>
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 <jvdelisle@gcc.gnu.org>
PR fortran/42684

View File

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

View File

@ -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);
}
}

View File

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

View File

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

View File

@ -1,3 +1,8 @@
2010-01-17 Janus Weil <janus@gcc.gnu.org>
PR fortran/42677
* gfortran.dg/interface_assignment_5.f90: New test.
2010-01-17 Dodji Seketeli <dodji@redhat.com>
PR c++/42697

View File

@ -0,0 +1,49 @@
! { dg-do compile }
!
! PR 42677: [4.5 Regression] Bogus Error: Ambiguous interfaces '...' in intrinsic assignment operator
!
! Contributed by Harald Anlauf <anlauf@gmx.de>
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" } }