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