+2006-12-27 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/20896
+ * interface.c (check_sym_interfaces): Try to resolve interface
+ reference as a global symbol, if it is not a nodule procedure.
+ (compare_actual_formal): Remove call to gfc_find_symbol; if
+ the expression is already a variable it is locally declared
+ and this has precedence.
+ gfortran.h : Add prototype for resolve_global_procedure.
+ resolve.c (resolve_global_procedure): Remove static attribute
+ from function declaration.
+ (resolve_fl_procedure): Remove symtree declaration and the
+ redundant check for an ambiguous procedure.
+
+ PR fortran/25135
+ * module.c (load_generic_interfaces): If the symbol is present
+ and is not generic it is ambiguous.
+
2006-12-22 Paul Thomas <pault@gcc.gnu.org>
PR fortran/25818
void gfc_free_statements (gfc_code *);
/* resolve.c */
+void resolve_global_procedure (gfc_symbol *, locus *, int);
try gfc_resolve_expr (gfc_expr *);
void gfc_resolve (gfc_namespace *);
void gfc_resolve_blocks (gfc_code *, gfc_namespace *);
if (sym->ns != gfc_current_ns)
return;
+ if (sym->attr.if_source == IFSRC_IFBODY
+ && sym->attr.flavor == FL_PROCEDURE
+ && !sym->attr.mod_proc)
+ resolve_global_procedure (sym, &sym->declared_at, sym->attr.subroutine);
+
if (sym->generic != NULL)
{
sprintf (interface_name, "generic interface '%s'", sym->name);
&& a->expr->expr_type == EXPR_VARIABLE
&& f->sym->attr.flavor == FL_PROCEDURE)
{
- gsym = gfc_find_gsymbol (gfc_gsym_root,
- a->expr->symtree->n.sym->name);
- if (gsym == NULL || (gsym->type != GSYM_FUNCTION
- && gsym->type != GSYM_SUBROUTINE))
- {
- if (where)
- gfc_error ("Expected a procedure for argument '%s' at %L",
- f->sym->name, &a->expr->where);
- return 0;
- }
+ if (where)
+ gfc_error ("Expected a procedure for argument '%s' at %L",
+ f->sym->name, &a->expr->where);
+ return 0;
}
if (f->sym->attr.flavor == FL_PROCEDURE
sym->attr.generic = 1;
sym->attr.use_assoc = 1;
}
+ else
+ {
+ /* Unless sym is a generic interface, this reference
+ is ambiguous. */
+ gfc_symtree *st;
+ p = p ? p : name;
+ st = gfc_find_symtree (gfc_current_ns->sym_root, p);
+ st->ambiguous = sym->attr.generic ? 0 : 1;
+ }
+
if (i == 1)
{
mio_interface_rest (&sym->generic);
reference. The corresponding code that is called in creating
global entities is parse.c. */
-static void
+void
resolve_global_procedure (gfc_symbol *sym, locus *where, int sub)
{
gfc_gsymbol * gsym;
resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
{
gfc_formal_arglist *arg;
- gfc_symtree *st;
if (sym->attr.ambiguous_interfaces && !sym->attr.referenced)
gfc_warning ("Although not referenced, '%s' at %L has ambiguous "
&& resolve_fl_var_and_proc (sym, mp_flag) == FAILURE)
return FAILURE;
- st = gfc_find_symtree (gfc_current_ns->sym_root, sym->name);
- if (st && st->ambiguous
- && sym->attr.referenced
- && !sym->attr.generic)
- {
- gfc_error ("Procedure %s at %L is ambiguous",
- sym->name, &sym->declared_at);
- return FAILURE;
- }
-
if (sym->ts.type == BT_CHARACTER)
{
gfc_charlen *cl = sym->ts.cl;
+2006-12-27 Paul Thomas <pault@gcc.gnu.org>
+
+ PR fortran/20896
+ * gfortran.dg/interface_10.f90: New test.
+ * gfortran.dg/dummy_procedure_1.f90: Add error for call s1(z),
+ since z is already, locally a variable.
+
+ PR fortran/25135
+ * gfortran.dg/generic_11.f90: New test.
+ * gfortran.dg/interface_7.f90: Remove name clash between module
+ name and procedure 'x' referenced in the interface.
+
2006-12-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
PR middle-end/7651
call s1(w) ! { dg-error "not allowed as an actual argument" }
call s1(x) ! explicit interface
call s1(y) ! declared external
- call s1(z) ! already compiled
+ call s1(z) ! { dg-error "Expected a procedure for argument" }
contains
integer function w()
w = 1
--- /dev/null
+! { dg-do compile }
+! Test the fix for PR25135 in which the ambiguity between subroutine
+! foo in m_foo and interface foo in m_bar was not recognised.
+!
+!Contributed by Yusuke IGUCHI <iguchi@coral.t.u-tokyo.ac.jp>
+!
+module m_foo
+contains
+ subroutine foo
+ print *, "foo"
+ end subroutine
+end module
+
+module m_bar
+ interface foo
+ module procedure bar
+ end interface
+contains
+ subroutine bar
+ print *, "bar"
+ end subroutine
+end module
+
+use m_foo
+use m_bar
+
+call foo ! { dg-error "is an ambiguous reference" }
+end
+! { dg-final { cleanup-modules "m_foo m_bar" } }
+
+
--- /dev/null
+! { dg-do compile }
+! Test the fix for PR20896 in which the ambiguous use
+! of p was not detected.
+!
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
+!
+ INTERFACE g
+ SUBROUTINE s1(p) ! { dg-error "is already being used" }
+ INTERFACE
+ SUBROUTINE p
+ END
+ END INTERFACE
+ END
+ SUBROUTINE s2(p) ! { dg-error "Global name" }
+ INTERFACE
+ REAL FUNCTION p()
+ END
+ END INTERFACE
+ END
+ END INTERFACE
+
+ INTERFACE
+ REAL FUNCTION x()
+ END
+ END INTERFACE
+ INTERFACE
+ SUBROUTINE y
+ END
+ END INTERFACE
+ call g (x)
+ call g (y)
+ END
+
! standard explicitly does not require recursion into the formal
! arguments of procedures that themselves are interface arguments.
!
-module x
+module xx
INTERFACE BAD9
SUBROUTINE S9A(X)
REAL :: X
END INTERFACE
END SUBROUTINE S9C ! { dg-error "Ambiguous interfaces" }
END INTERFACE BAD9
-end module x
+end module xx
-! { dg-final { cleanup-modules "x" } }
+! { dg-final { cleanup-modules "xx" } }