mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-21 00:30:36 +08:00
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:
parent
8232dc6427
commit
ae7c61dead
@ -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
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
49
gcc/testsuite/gfortran.dg/interface_assignment_5.f90
Normal file
49
gcc/testsuite/gfortran.dg/interface_assignment_5.f90
Normal 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" } }
|
Loading…
x
Reference in New Issue
Block a user