|
|
0cadc6a |
2006-11-24 Paul Thomas <pault@gcc.gnu.org>
|
|
|
0cadc6a |
|
|
|
0cadc6a |
PR fortran/20880
|
|
|
0cadc6a |
* parse.c (parse_interface): Error if procedure name is that of
|
|
|
0cadc6a |
encompassing scope.
|
|
|
0cadc6a |
|
|
|
0cadc6a |
* gfortran.dg/interface_3a.f90: New test.
|
|
|
0cadc6a |
|
|
|
0cadc6a |
--- gcc/fortran/parse.c (revision 119172)
|
|
|
0cadc6a |
+++ gcc/fortran/parse.c (revision 119173)
|
|
|
0cadc6a |
@@ -1694,6 +1694,7 @@ parse_interface (void)
|
|
|
0cadc6a |
gfc_interface_info save;
|
|
|
0cadc6a |
gfc_state_data s1, s2;
|
|
|
0cadc6a |
gfc_statement st;
|
|
|
0cadc6a |
+ locus proc_locus;
|
|
|
0cadc6a |
|
|
|
0cadc6a |
accept_statement (ST_INTERFACE);
|
|
|
0cadc6a |
|
|
|
0cadc6a |
@@ -1781,6 +1782,7 @@ loop:
|
|
|
0cadc6a |
accept_statement (st);
|
|
|
0cadc6a |
prog_unit = gfc_new_block;
|
|
|
0cadc6a |
prog_unit->formal_ns = gfc_current_ns;
|
|
|
0cadc6a |
+ proc_locus = gfc_current_locus;
|
|
|
0cadc6a |
|
|
|
0cadc6a |
decl:
|
|
|
0cadc6a |
/* Read data declaration statements. */
|
|
|
0cadc6a |
@@ -1796,8 +1798,15 @@ decl:
|
|
|
0cadc6a |
|
|
|
0cadc6a |
current_interface = save;
|
|
|
0cadc6a |
gfc_add_interface (prog_unit);
|
|
|
0cadc6a |
-
|
|
|
0cadc6a |
pop_state ();
|
|
|
0cadc6a |
+
|
|
|
0cadc6a |
+ if (current_interface.ns
|
|
|
0cadc6a |
+ && current_interface.ns->proc_name
|
|
|
0cadc6a |
+ && strcmp (current_interface.ns->proc_name->name,
|
|
|
0cadc6a |
+ prog_unit->name) == 0)
|
|
|
0cadc6a |
+ gfc_error ("INTERFACE procedure '%s' at %L has the same name as the "
|
|
|
0cadc6a |
+ "enclosing procedure", prog_unit->name, &proc_locus);
|
|
|
0cadc6a |
+
|
|
|
0cadc6a |
goto loop;
|
|
|
0cadc6a |
|
|
|
0cadc6a |
done:
|
|
|
0cadc6a |
--- gcc/testsuite/gfortran.dg/interface_3a.f90
|
|
|
0cadc6a |
+++ gcc/testsuite/gfortran.dg/interface_3a.f90
|
|
|
0cadc6a |
@@ -0,0 +1,13 @@
|
|
|
0cadc6a |
+! { dg-do compile }
|
|
|
0cadc6a |
+! Contributed by Joost VandeVondele <jv244@cam.ac.uk>
|
|
|
0cadc6a |
+!
|
|
|
0cadc6a |
+! This was found whilst investigating => segfault
|
|
|
0cadc6a |
+subroutine thy_sub (a)
|
|
|
0cadc6a |
+ interface
|
|
|
0cadc6a |
+ subroutine thy_sub (a) ! { dg-error "enclosing procedure" }
|
|
|
0cadc6a |
+ real a
|
|
|
0cadc6a |
+ end subroutine
|
|
|
0cadc6a |
+ end interface
|
|
|
0cadc6a |
+ real a
|
|
|
0cadc6a |
+ print *, a
|
|
|
0cadc6a |
+end subroutine
|