A patch with ChangeLog diffs is attached.

I ran "make && make install && make check-fortran" at the top level on 
x86_64-pc-linux-gnu.  (I always do that before I post a patch and again before 
I actually check anything in.  I sometimes forget to include files when I 
finally commit, but I'm always confident that the ones I remember are good :)

Louis

---- On Mon, 26 Oct 2015 01:51:04 -0700 FX<fxcoud...@gmail.com> wrote ---- 
 > > The problem:  Statement labels within a type declaration are put in the 
 > > statement label tree belonging to the type declaration's namespace's 
 > > (instead of the current namespace).  When the line is otherwise empty and 
 > > an error is issued, gfc_free_st_label tries to delete the label from the 
 > > label tree belonging to the current namespace and then frees the label 
 > > structure, leaving an invalid statement label pointer in the type 
 > > declaration's namespace's label tree.  When that namespace is cleaned up, 
 > > bad things can happen. 
 >  
 > Seems OK. 
 > Please post patches with full ChangeLog entry, stating how they were tested 
 > (“bootstraped and regtested on x86_64-linux”, for example). And of course, 
 > do an actual full regression-test :) 
 >  
 > If that was done, then OK to commit. 
 >  
 > Thanks, 
 > FX

Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog       (revision 229307)
+++ gcc/fortran/ChangeLog       (working copy)
@@ -1,3 +1,14 @@
+2015-10-26  Louis Krupp  <louis.kr...@zoho.com>
+
+       PR fortran/66056
+       * fortran.h: Include namespace pointer in statement label
+       structure.
+       * symbol.c (gfc_get_st_label): Store pointer to namespace
+       that owns the statement label tree in each label.
+       (gfc_free_st_label): Use namespace owning statement label
+       tree when deleting statement label.
+       * io.c: Initialize format_asterisk with NULL namespace pointer.
+
 2015-01-25  Paul Thomas  <pa...@gcc.gnu.org>
 
        PR fortran/67171
Index: gcc/fortran/gfortran.h
===================================================================
--- gcc/fortran/gfortran.h      (revision 229307)
+++ gcc/fortran/gfortran.h      (working copy)
@@ -1291,6 +1291,8 @@ typedef struct gfc_st_label
   tree backend_decl;
 
   locus where;
+
+  gfc_namespace *ns;
 }
 gfc_st_label;
 
Index: gcc/fortran/io.c
===================================================================
--- gcc/fortran/io.c    (revision 229307)
+++ gcc/fortran/io.c    (working copy)
@@ -28,7 +28,7 @@ along with GCC; see the file COPYING3.  If not see
 
 gfc_st_label
 format_asterisk = {0, NULL, NULL, -1, ST_LABEL_FORMAT, ST_LABEL_FORMAT, NULL,
-                  0, {NULL, NULL}};
+                  0, {NULL, NULL}, NULL};
 
 typedef struct
 {
Index: gcc/fortran/symbol.c
===================================================================
--- gcc/fortran/symbol.c        (revision 229307)
+++ gcc/fortran/symbol.c        (working copy)
@@ -2195,7 +2195,7 @@ gfc_free_st_label (gfc_st_label *label)
   if (label == NULL)
     return;
 
-  gfc_delete_bbt (&gfc_current_ns->st_labels, label, compare_st_labels);
+  gfc_delete_bbt (&label->ns->st_labels, label, compare_st_labels);
 
   if (label->format != NULL)
     gfc_free_expr (label->format);
@@ -2260,6 +2260,7 @@ gfc_get_st_label (int labelno)
   lp->value = labelno;
   lp->defined = ST_LABEL_UNKNOWN;
   lp->referenced = ST_LABEL_UNKNOWN;
+  lp->ns = ns;
 
   gfc_insert_bbt (&ns->st_labels, lp, compare_st_labels);
 
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog     (revision 229307)
+++ gcc/testsuite/ChangeLog     (working copy)
@@ -1,3 +1,8 @@
+2015-10-26  Louis Krupp  <louis.kr...@zoho.com>
+
+       PR fortran/66056
+       * gfortran.dg/empty_label_typedecl.f90: New test
+
 2015-01-25  Paul Thomas  <pa...@gcc.gnu.org>
 
        PR fortran/67171
Index: gcc/testsuite/gfortran.dg/empty_label_typedecl.f90
===================================================================
--- gcc/testsuite/gfortran.dg/empty_label_typedecl.f90  (revision 0)
+++ gcc/testsuite/gfortran.dg/empty_label_typedecl.f90  (working copy)
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! { dg-options "-Werror" }
+subroutine s
+  type t
+  1 ! { dg-error "empty statement" }
+  end type
+end subroutine
+! { dg-excess-errors "warnings being treated as errors" }

Reply via email to