Patchwork [Fortran,committed] PR 51605: Don't merge local labels with host-associated procedures

login
register
mail settings
Submitter Tobias Burnus
Date Dec. 19, 2011, 8:21 p.m.
Message ID <4EEF9CC5.6090002@net-b.de>
Download mbox | patch
Permalink /patch/132309/
State New
Headers show

Comments

Tobias Burnus - Dec. 19, 2011, 8:21 p.m.
I have committed the attached patch as obvious (Rev. 182497).

gfortran merged the symbol of a local label like:
   label_name: block
   end block label_name
with a later-declared procedure with the same name ("subroutine 
label_name()") which lead to an ICE and interesting code paths.

Built, regtested and committed on x86-64-linux.

Tobias

Patch

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog	(Revision 182496)
+++ gcc/fortran/ChangeLog	(Arbeitskopie)
@@ -1,6 +1,12 @@ 
 2011-12-19  Tobias Burnus  <burnus@net-b.de>
 
 	PR fortran/51605
+	* parse.c (gfc_fixup_sibling_symbols): Regard FL_LABEL as
+	local symbol.
+
+2011-12-19  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/51605
 	* match.c (gfc_match_select_type): Handle
 	scalar polymophic coarrays.
 	(select_type_set_tmp, ): Ditto; avoid segfault if !class_ok.
Index: gcc/fortran/parse.c
===================================================================
--- gcc/fortran/parse.c	(Revision 182496)
+++ gcc/fortran/parse.c	(Arbeitskopie)
@@ -3908,6 +3908,7 @@ 
 		  || old_sym->attr.intrinsic
 		  || old_sym->attr.generic
 		  || old_sym->attr.flavor == FL_NAMELIST
+		  || old_sym->attr.flavor == FL_LABEL
 		  || old_sym->attr.proc == PROC_ST_FUNCTION))
 	{
 	  /* Replace it with the symbol from the parent namespace.  */
Index: gcc/testsuite/gfortran.dg/block_10.f90
===================================================================
--- gcc/testsuite/gfortran.dg/block_10.f90	(Revision 0)
+++ gcc/testsuite/gfortran.dg/block_10.f90	(Arbeitskopie)
@@ -0,0 +1,34 @@ 
+! { dg-do compile }
+!
+! PR fortran/51605
+!
+
+contains
+  subroutine foo
+    BLOCK_NAME: block
+    end block BLOCK_NAME
+  end subroutine foo
+
+  subroutine BLOCK_NAME()
+  end subroutine BLOCK_NAME
+
+  subroutine bar()
+  end subroutine bar
+end
+
+subroutine test()
+contains
+  subroutine BLOCK_NAME()
+  end subroutine BLOCK_NAME
+
+  subroutine foobar()
+  end subroutine foobar
+
+  subroutine foo
+    BLOCK_NAME: block
+    end block BLOCK_NAME
+  end subroutine foo
+
+  subroutine bar()
+  end subroutine bar
+end
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(Revision 182496)
+++ gcc/testsuite/ChangeLog	(Arbeitskopie)
@@ -1,3 +1,8 @@ 
+2011-12-19  Tobias Burnus  <burnus@net-b.de>
+
+	PR fortran/51605
+	* gfortran.dg/block_10.f90: New.
+
 2011-12-19  Jason Merrill  <jason@redhat.com>
 
 	PR c++/51553