re PR fortran/29464 ([4.1 only] problem with duplicate USE, ONLY of procedure in INTERFACE)
2006-11-25 Paul Thomas <pault@gcc.gnu.org> PR fortran/29464 * module.c (load_generic_interfaces): Add symbols for all the local names of an interface. Share the interface amongst the symbols. * gfortran.h : Add generic_copy to symbol_attribute. * symbol.c (free_symbol): Only free interface if generic_copy is not set. 2006-11-25 Paul Thomas <pault@gcc.gnu.org> PR fortran/29464 * gfortran.dg/module_interface_2.f90: New test. From-SVN: r119696
This commit is contained in:
parent
4d4074e415
commit
1027275d2e
6 changed files with 81 additions and 18 deletions
|
@ -1,3 +1,13 @@
|
|||
2006-12-09 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29464
|
||||
* module.c (load_generic_interfaces): Add symbols for all the
|
||||
local names of an interface. Share the interface amongst the
|
||||
symbols.
|
||||
* gfortran.h : Add generic_copy to symbol_attribute.
|
||||
* symbol.c (free_symbol): Only free interface if generic_copy
|
||||
is not set.
|
||||
|
||||
2006-12-09 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29941
|
||||
|
|
|
@ -486,7 +486,7 @@ typedef struct
|
|||
use_assoc:1; /* Symbol has been use-associated. */
|
||||
|
||||
unsigned in_namelist:1, in_common:1, in_equivalence:1;
|
||||
unsigned function:1, subroutine:1, generic:1;
|
||||
unsigned function:1, subroutine:1, generic:1, generic_copy:1;
|
||||
unsigned implicit_type:1; /* Type defined via implicit rules. */
|
||||
unsigned untyped:1; /* No implicit type could be found. */
|
||||
|
||||
|
|
|
@ -3024,6 +3024,8 @@ load_generic_interfaces (void)
|
|||
const char *p;
|
||||
char name[GFC_MAX_SYMBOL_LEN + 1], module[GFC_MAX_SYMBOL_LEN + 1];
|
||||
gfc_symbol *sym;
|
||||
gfc_interface *generic = NULL;
|
||||
int n, i;
|
||||
|
||||
mio_lparen ();
|
||||
|
||||
|
@ -3034,25 +3036,39 @@ load_generic_interfaces (void)
|
|||
mio_internal_string (name);
|
||||
mio_internal_string (module);
|
||||
|
||||
/* Decide if we need to load this one or not. */
|
||||
p = find_use_name (name);
|
||||
n = number_use_names (name);
|
||||
n = n ? n : 1;
|
||||
|
||||
if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
|
||||
for (i = 1; i <= n; i++)
|
||||
{
|
||||
while (parse_atom () != ATOM_RPAREN);
|
||||
continue;
|
||||
/* Decide if we need to load this one or not. */
|
||||
p = find_use_name_n (name, &i);
|
||||
|
||||
if (p == NULL || gfc_find_symbol (p, NULL, 0, &sym))
|
||||
{
|
||||
while (parse_atom () != ATOM_RPAREN);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (sym == NULL)
|
||||
{
|
||||
gfc_get_symbol (p, NULL, &sym);
|
||||
|
||||
sym->attr.flavor = FL_PROCEDURE;
|
||||
sym->attr.generic = 1;
|
||||
sym->attr.use_assoc = 1;
|
||||
}
|
||||
if (i == 1)
|
||||
{
|
||||
mio_interface_rest (&sym->generic);
|
||||
generic = sym->generic;
|
||||
}
|
||||
else
|
||||
{
|
||||
sym->generic = generic;
|
||||
sym->attr.generic_copy = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (sym == NULL)
|
||||
{
|
||||
gfc_get_symbol (p, NULL, &sym);
|
||||
|
||||
sym->attr.flavor = FL_PROCEDURE;
|
||||
sym->attr.generic = 1;
|
||||
sym->attr.use_assoc = 1;
|
||||
}
|
||||
|
||||
mio_interface_rest (&sym->generic);
|
||||
}
|
||||
|
||||
mio_rparen ();
|
||||
|
|
|
@ -1971,7 +1971,8 @@ gfc_free_symbol (gfc_symbol * sym)
|
|||
|
||||
gfc_free_namespace (sym->formal_ns);
|
||||
|
||||
gfc_free_interface (sym->generic);
|
||||
if (!sym->attr.generic_copy)
|
||||
gfc_free_interface (sym->generic);
|
||||
|
||||
gfc_free_formal_arglist (sym->formal);
|
||||
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2006-12-09 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29464
|
||||
* gfortran.dg/module_interface_2.f90: New test.
|
||||
|
||||
2006-12-09 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
PR fortran/29941
|
||||
|
|
31
gcc/testsuite/gfortran.dg/module_interface_2.f90
Normal file
31
gcc/testsuite/gfortran.dg/module_interface_2.f90
Normal file
|
@ -0,0 +1,31 @@
|
|||
! { dg-do compile }
|
||||
! Tests the fix for PR29464, in which the second USE of the generic
|
||||
! interface caused an error.
|
||||
!
|
||||
! Contributed by Vivek Rao <vivekrao4@yahoo.com>
|
||||
!
|
||||
module foo_mod
|
||||
implicit none
|
||||
interface twice
|
||||
module procedure twice_real
|
||||
end interface twice
|
||||
contains
|
||||
real function twice_real(x)
|
||||
real :: x
|
||||
twice_real = 2*x
|
||||
end function twice_real
|
||||
end module foo_mod
|
||||
|
||||
subroutine foobar ()
|
||||
use foo_mod, only: twice, twice
|
||||
print *, twice (99.0)
|
||||
end subroutine foobar
|
||||
|
||||
program xfoo
|
||||
use foo_mod, only: two => twice, dbl => twice
|
||||
implicit none
|
||||
call foobar ()
|
||||
print *, two (2.3)
|
||||
print *, dbl (2.3)
|
||||
end program xfoo
|
||||
! { dg-final { cleanup-modules "foo_mod" } }
|
Loading…
Add table
Reference in a new issue