From: Louis Krupp Date: Mon, 26 Oct 2015 19:18:08 +0000 (+0000) Subject: re PR fortran/66056 (ICEs and endless compilation for lonely labels/numbers in type) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=388902dab9e4b152931ed7c1b6923a43039b546d;p=gcc.git re PR fortran/66056 (ICEs and endless compilation for lonely labels/numbers in type) 2015-10-26 Louis Krupp 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-10-26 Louis Krupp PR fortran/66056 * gfortran.dg/empty_label_typedecl.f90: New test From-SVN: r229390 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 181545117f6..51eeb0b61f5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,14 @@ +2015-10-26 Louis Krupp + + 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-10-26 Steven G. Kargl PR fortran/36192 diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index b2894cc22c4..90f63cf4807 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -1291,6 +1291,8 @@ typedef struct gfc_st_label tree backend_decl; locus where; + + gfc_namespace *ns; } gfc_st_label; diff --git a/gcc/fortran/io.c b/gcc/fortran/io.c index e5d68fb60ba..dbd02b35e54 100644 --- a/gcc/fortran/io.c +++ b/gcc/fortran/io.c @@ -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 { diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index a9a0dc07e5b..bd7758b9a45 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c0f8b0dbf64..7f4f8a09941 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2015-10-26 Louis Krupp + + PR fortran/66056 + * gfortran.dg/empty_label_typedecl.f90: New test. + 2015-10-26 Steven G. Kargl PR fortran/36192 diff --git a/gcc/testsuite/gfortran.dg/empty_label_typedecl.f90 b/gcc/testsuite/gfortran.dg/empty_label_typedecl.f90 new file mode 100644 index 00000000000..c85e5be8d08 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/empty_label_typedecl.f90 @@ -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" }