Commit 43dfd40c by Steven G. Kargl

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
parent 1382ae05
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> 2009-09-09 Richard Guenther <rguenther@suse.de>
PR fortran/41297 PR fortran/41297
......
...@@ -6485,7 +6485,10 @@ gfc_match_modproc (void) ...@@ -6485,7 +6485,10 @@ gfc_match_modproc (void)
module_ns = gfc_current_ns->parent; module_ns = gfc_current_ns->parent;
for (; module_ns; module_ns = module_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; break;
if (module_ns == NULL) if (module_ns == NULL)
...@@ -6497,6 +6500,7 @@ gfc_match_modproc (void) ...@@ -6497,6 +6500,7 @@ gfc_match_modproc (void)
for (;;) for (;;)
{ {
locus old_locus = gfc_current_locus;
bool last = false; bool last = false;
m = gfc_match_name (name); m = gfc_match_name (name);
...@@ -6517,6 +6521,13 @@ gfc_match_modproc (void) ...@@ -6517,6 +6521,13 @@ gfc_match_modproc (void)
if (gfc_get_symbol (name, module_ns, &sym)) if (gfc_get_symbol (name, module_ns, &sym))
return MATCH_ERROR; 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 if (sym->attr.proc != PROC_MODULE
&& gfc_add_procedure (&sym->attr, PROC_MODULE, && gfc_add_procedure (&sym->attr, PROC_MODULE,
sym->name, NULL) == FAILURE) sym->name, NULL) == FAILURE)
...@@ -6526,6 +6537,7 @@ gfc_match_modproc (void) ...@@ -6526,6 +6537,7 @@ gfc_match_modproc (void)
return MATCH_ERROR; return MATCH_ERROR;
sym->attr.mod_proc = 1; sym->attr.mod_proc = 1;
sym->declared_at = old_locus;
if (last) if (last)
break; break;
......
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> 2009-09-10 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
James A. Morrison <phython@gcc.gnu.org> James A. Morrison <phython@gcc.gnu.org>
......
...@@ -85,18 +85,18 @@ end module f ...@@ -85,18 +85,18 @@ end module f
module g module g
implicit none implicit none
external wrong_b ! { dg-error "has no explicit interface" } external wrong_b
interface gen_wrong_5 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 interface gen_wrong_5
end module g end module g
module h module h
implicit none implicit none
external wrong_c ! { dg-error "has no explicit interface" } external wrong_c
real wrong_c real wrong_c
interface gen_wrong_6 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 interface gen_wrong_6
end module h end module h
......
! { 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" } }
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment