aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/decl.c
diff options
context:
space:
mode:
authorSteven G. Kargl <kargl@gcc.gnu.org>2009-09-10 21:22:08 +0000
committerSteven G. Kargl <kargl@gcc.gnu.org>2009-09-10 21:22:08 +0000
commit43dfd40c1d5934d5850dcfd2c9a1b9e856bf32a7 (patch)
tree4b5e73eaa50717049042d4e38225bf9f848a766b /gcc/fortran/decl.c
parent1382ae05e3d1f105433b8244e937aa7c395c6904 (diff)
downloadgcc-43dfd40c1d5934d5850dcfd2c9a1b9e856bf32a7.zip
gcc-43dfd40c1d5934d5850dcfd2c9a1b9e856bf32a7.tar.gz
gcc-43dfd40c1d5934d5850dcfd2c9a1b9e856bf32a7.tar.bz2
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
Diffstat (limited to 'gcc/fortran/decl.c')
-rw-r--r--gcc/fortran/decl.c14
1 files changed, 13 insertions, 1 deletions
diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c
index 52796a6..3ce7fd4 100644
--- a/gcc/fortran/decl.c
+++ b/gcc/fortran/decl.c
@@ -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;