re PR fortran/31292 (ICE with module procedure interface in a procedure body)

2009-09-10  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/31292
	* fortran/decl.c(gfc_match_modproc): Check that module procedures
	from a module can USEd in module procedure statements in other
	program units.  Update locus for better error message display.
	Detect intrinsic procedures in module procedure statements.

2009-09-10  Steven G. Kargl  <kargl@gcc.gnu.org>

	PR fortran/31292
	* gfortran.dg/module_procedure_1.f90: New test.
	* gfortran.dg/module_procedure_2.f90: Ditto.
	* gfortran.dg/generic_14.f90: Move dg-error to new location.

From-SVN: r151616
This commit is contained in:
Steven G. Kargl 2009-09-10 21:22:08 +00:00
parent 1382ae05e3
commit 43dfd40c1d
6 changed files with 93 additions and 5 deletions

View file

@ -1,3 +1,11 @@
2009-09-10 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/31292
* fortran/decl.c(gfc_match_modproc): Check that module procedures
from a module can USEd in module procedure statements in other
program units. Update locus for better error message display.
Detect intrinsic procedures in module procedure statements.
2009-09-09 Richard Guenther <rguenther@suse.de>
PR fortran/41297

View file

@ -6485,7 +6485,10 @@ gfc_match_modproc (void)
module_ns = gfc_current_ns->parent;
for (; module_ns; module_ns = module_ns->parent)
if (module_ns->proc_name->attr.flavor == FL_MODULE)
if (module_ns->proc_name->attr.flavor == FL_MODULE
|| module_ns->proc_name->attr.flavor == FL_PROGRAM
|| (module_ns->proc_name->attr.flavor == FL_PROCEDURE
&& !module_ns->proc_name->attr.contained))
break;
if (module_ns == NULL)
@ -6497,6 +6500,7 @@ gfc_match_modproc (void)
for (;;)
{
locus old_locus = gfc_current_locus;
bool last = false;
m = gfc_match_name (name);
@ -6517,6 +6521,13 @@ gfc_match_modproc (void)
if (gfc_get_symbol (name, module_ns, &sym))
return MATCH_ERROR;
if (sym->attr.intrinsic)
{
gfc_error ("Intrinsic procedure at %L cannot be a MODULE "
"PROCEDURE", &old_locus);
return MATCH_ERROR;
}
if (sym->attr.proc != PROC_MODULE
&& gfc_add_procedure (&sym->attr, PROC_MODULE,
sym->name, NULL) == FAILURE)
@ -6526,6 +6537,7 @@ gfc_match_modproc (void)
return MATCH_ERROR;
sym->attr.mod_proc = 1;
sym->declared_at = old_locus;
if (last)
break;

View file

@ -1,3 +1,10 @@
2009-09-10 Steven G. Kargl <kargl@gcc.gnu.org>
PR fortran/31292
* gfortran.dg/module_procedure_1.f90: New test.
* gfortran.dg/module_procedure_2.f90: Ditto.
* gfortran.dg/generic_14.f90: Move dg-error to new location.
2009-09-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
James A. Morrison <phython@gcc.gnu.org>

View file

@ -85,18 +85,18 @@ end module f
module g
implicit none
external wrong_b ! { dg-error "has no explicit interface" }
external wrong_b
interface gen_wrong_5
module procedure wrong_b ! wrong, see above
module procedure wrong_b ! { dg-error "has no explicit interface" }
end interface gen_wrong_5
end module g
module h
implicit none
external wrong_c ! { dg-error "has no explicit interface" }
external wrong_c
real wrong_c
interface gen_wrong_6
module procedure wrong_c ! wrong, see above
module procedure wrong_c ! { dg-error "has no explicit interface" }
end interface gen_wrong_6
end module h

View file

@ -0,0 +1,53 @@
! { dg-do run }
! Modified program from http://groups.google.com/group/\
! comp.lang.fortran/browse_frm/thread/423e4392dc965ab7#
!
module myoperator
contains
function dadd(arg1,arg2)
integer ::dadd(2)
integer, intent(in) :: arg1(2), arg2(2)
dadd(1)=arg1(1)+arg2(1)
dadd(2)=arg1(2)+arg2(2)
end function dadd
end module myoperator
program test_interface
use myoperator
implicit none
interface operator (.myadd.)
module procedure dadd
end interface
integer input1(2), input2(2), mysum(2)
input1 = (/0,1/)
input2 = (/3,3/)
mysum = input1 .myadd. input2
if (mysum(1) /= 3 .and. mysum(2) /= 4) call abort
call test_sub(input1, input2)
end program test_interface
subroutine test_sub(input1, input2)
use myoperator
implicit none
interface operator (.myadd.)
module procedure dadd
end interface
integer, intent(in) :: input1(2), input2(2)
integer mysum(2)
mysum = input1 .myadd. input2
if (mysum(1) /= 3 .and. mysum(2) /= 4) call abort
end subroutine test_sub
! { dg-final { cleanup-modules "myoperator" } }

View file

@ -0,0 +1,8 @@
! { dg-do compile }
program test
implicit none
intrinsic sin
interface gen2
module procedure sin ! { dg-error "cannot be a MODULE PROCEDURE" }
end interface gen2
end program test