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:
Paul Thomas 2006-12-09 20:52:27 +00:00
parent 4d4074e415
commit 1027275d2e
6 changed files with 81 additions and 18 deletions

View File

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

View File

@ -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. */

View File

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

View File

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

View File

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

View 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" } }