+2007-08-30 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33228
+ * interface.c (check_interface0): Improve error for external procs.
+ (check_sym_interfaces): Fix checking of module procedures.
+
2007-08-29 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/32989
for (; p; p = p->next)
if (!p->sym->attr.function && !p->sym->attr.subroutine)
{
- gfc_error ("Procedure '%s' in %s at %L is neither function nor "
- "subroutine", p->sym->name, interface_name,
- &p->sym->declared_at);
+ if (p->sym->attr.external)
+ gfc_error ("Procedure '%s' in %s at %L has no explicit interface",
+ p->sym->name, interface_name, &p->sym->declared_at);
+ else
+ gfc_error ("Procedure '%s' in %s at %L is neither function nor "
+ "subroutine", p->sym->name, interface_name,
+ &p->sym->declared_at);
return 1;
}
p = psave;
for (p = sym->generic; p; p = p->next)
{
- if (!p->sym->attr.use_assoc && p->sym->attr.mod_proc
- && p->sym->attr.if_source != IFSRC_DECL)
+ if (p->sym->attr.mod_proc && p->sym->attr.if_source != IFSRC_DECL)
{
- gfc_error ("MODULE PROCEDURE '%s' at %L does not come "
- "from a module", p->sym->name, &p->where);
+ gfc_error ("'%s' at %L is not a module procedure",
+ p->sym->name, &p->where);
return;
}
}
+2007-08-30 Tobias Burnus <burnus@net-b.de>
+
+ PR fortran/33228
+ * interface.c (check_interface0): Improve error for external procs.
+ (check_sym_interfaces): Fix checking of module procedures.
+
2007-08-30 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/sync-2.c (AI_ALIGN): Define if not defined.
--- /dev/null
+! { dg-do compile }
+!
+! Check whether MODULE PROCEDUREs are properly treated
+! They need to be contained in a procedure, i.e. an
+! interface in another procedure is invalid; they may, however,
+! come from a use-associated procedure.
+! (The PROCEDURE statement allows also for non-module procedures
+! if there is an explicit interface.)
+!
+! PR fortran/33228
+!
+module inclmod
+ implicit none
+ interface
+ subroutine wrong1(a)
+ integer :: a
+ end subroutine wrong1
+ end interface
+ interface gen_incl
+ module procedure ok1
+ end interface gen_incl
+ external wrong2
+ external wrong3
+ real wrong3
+contains
+ subroutine ok1(f)
+ character :: f
+ end subroutine ok1
+end module inclmod
+
+module a
+ use inclmod
+ implicit none
+ interface gen
+ subroutine ok1_a(a,b)
+ integer :: a,b
+ end subroutine ok1_a
+ module procedure ok1, ok2_a
+ end interface gen
+contains
+ subroutine ok2_a(a,b,c)
+ integer :: a,b,c
+ end subroutine ok2_a
+end module a
+
+module b
+ use inclmod
+ interface gen_wrong_0
+ module procedure gen_incl ! { dg-error "Cannot change attributes" }
+ end interface gen_wrong_0
+end module b
+
+module c
+ use inclmod
+ interface gen_wrong_1
+ module procedure wrong1 ! { dg-error "is not a module procedure" }
+ end interface gen_wrong_1
+end module c
+
+module d
+ use inclmod
+ interface gen_wrong_2
+ module procedure wrong2 ! { dg-error "Cannot change attributes" }
+ end interface gen_wrong_2
+end module d
+
+module e
+ use inclmod
+ interface gen_wrong_3
+ module procedure wrong3 ! { dg-error "Cannot change attributes" }
+ end interface gen_wrong_3
+end module e
+
+module f
+ implicit none
+ interface
+ subroutine wrong_a(a)
+ integer :: a
+ end subroutine wrong_a
+ end interface
+ interface gen_wrong_4
+ module procedure wrong_a ! { dg-error "is not a module procedure" }
+ end interface gen_wrong_4
+end module f
+
+module g
+ implicit none
+ external wrong_b ! { dg-error "has no explicit interface" }
+ interface gen_wrong_5
+ module procedure wrong_b ! wrong, see above
+ end interface gen_wrong_5
+end module g
+
+module h
+ implicit none
+ external wrong_c ! { dg-error "has no explicit interface" }
+ real wrong_c
+ interface gen_wrong_6
+ module procedure wrong_c ! wrong, see above
+ end interface gen_wrong_6
+end module h
+
+end
+
+! { dg-final { cleanup-modules "a inclmod" } }
USE class_foo_type, ONLY: foo, bar_init_set_int
INTERFACE foo_init
- MODULE PROCEDURE foo_init_default ! { dg-error "does not come from a module" }
+ MODULE PROCEDURE foo_init_default ! { dg-error "is not a module procedure" }
END INTERFACE
INTERFACE bar_init