This is the mail archive of the
fortran@gcc.gnu.org
mailing list for the GNU Fortran project.
Re: [Patch, fortran, GCC-5/6, PR62536, v1] ICE (segfault) for invalid END BLOCK statement
- From: Andre Vehreschild <vehre at gmx dot de>
- To: Jerry DeLisle <jvdelisle at charter dot net>
- Cc: GCC-Patches-ML <gcc-patches at gcc dot gnu dot org>, GCC-Fortran-ML <fortran at gcc dot gnu dot org>
- Date: Thu, 28 Jan 2016 12:34:59 +0100
- Subject: Re: [Patch, fortran, GCC-5/6, PR62536, v1] ICE (segfault) for invalid END BLOCK statement
- Authentication-results: sourceware.org; auth=none
- References: <20160127172537 dot 6a184e15 at vepi2> <56A95084 dot 1070007 at charter dot net>
Hi Jerry, hi all,
thanks for the fast review. Committed as
r232918 for gcc-5-branch, and
r232919 for trunk.
Thanks again Jerry and regards,
Andre
On Wed, 27 Jan 2016 15:19:32 -0800
Jerry DeLisle <jvdelisle@charter.net> wrote:
> On 01/27/2016 08:25 AM, Andre Vehreschild wrote:
> > Hi all,
> >
> > attached are two patches one for trunk and one for the gcc-5-branch,
> > which fix an ICE when BLOCK statements are not closed correctly (too
> > many END BLOCKs). Unfortunately did the patch I tailored for gcc-5 not
> > work on trunk.
> >
> > GCC 5: The ICE is prevented by making sure that gfc_current_ns is not
> > set to NULL, when too many closing END BLOCK statements are found. This
> > may lead to gfortran be in the wrong namespace, but gfortran is already
> > in error. Therefore this does not matter any more. We just need to exit
> > cleanly.
> >
> > GCC 6/trunk: Here the ICE is prevented by making sure, that unnesting
> > of BLOCK namespaces is only done, when the END encountered is not the
> > one of a BLOCK. This prevents gfortran from removing a correctly
> > initialized and for further analysis required namespace.
> >
> > Bootstrapped and regtested ok on x86_64-linux-gnu/F23.
> >
> > Ok for trunk and gcc-5-branch, respectively?
> >
>
> OK and thanks for fixes. Much appreciated?
>
> Jerry
--
Andre Vehreschild * Email: vehre ad gmx dot de
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog (Revision 232916)
+++ gcc/fortran/ChangeLog (Arbeitskopie)
@@ -1,3 +1,11 @@
+2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/62536
+ * decl.c: Prevent setting gfc_current_ns to NULL when block statement's
+ nesting is incomplete. There is already an error conditon, so having
+ gfc_current_ns pointing to an eventually wrong namespace does not matter
+ that much.
+
2016-01-27 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/p69268
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c (Revision 232916)
+++ gcc/fortran/decl.c (Arbeitskopie)
@@ -6454,9 +6454,16 @@
prev_ns = ns;
ns = ns->sibling;
}
-
- gfc_free_namespace (gfc_current_ns);
- gfc_current_ns = parent_ns;
+
+ if (parent_ns)
+ {
+ /* Free the current namespace only when the parent one exists. This
+ prevents an ICE when more END BLOCK then BLOCK statements are
+ present. It does not mean any further harm, because we already
+ have errored. */
+ gfc_free_namespace (gfc_current_ns);
+ gfc_current_ns = parent_ns;
+ }
}
return MATCH_ERROR;
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (Revision 232916)
+++ gcc/testsuite/ChangeLog (Arbeitskopie)
@@ -1,3 +1,8 @@
+2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/62536
+ * gfortran.dg/block_14.f08: New test.
+
2016-01-27 Marek Polacek <polacek@redhat.com>
Backport from mainline
Index: gcc/fortran/ChangeLog
===================================================================
--- gcc/fortran/ChangeLog (Revision 232917)
+++ gcc/fortran/ChangeLog (Arbeitskopie)
@@ -1,3 +1,9 @@
+2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/62536
+ * decl.c (gfc_match_end): Only unnest and remove BLOCK namespaces
+ when the END encountered does not match a BLOCK's end.
+
2016-01-27 Janus Weil <janus@gcc.gnu.org>
PR fortran/69484
Index: gcc/fortran/decl.c
===================================================================
--- gcc/fortran/decl.c (Revision 232917)
+++ gcc/fortran/decl.c (Arbeitskopie)
@@ -6327,6 +6327,7 @@
gfc_namespace *parent_ns, *ns, *prev_ns;
gfc_namespace **nsp;
bool abreviated_modproc_decl;
+ bool got_matching_end = false;
old_loc = gfc_current_locus;
if (gfc_match ("end") != MATCH_YES)
@@ -6510,6 +6511,8 @@
? "END PROCEDURE" : gfc_ascii_statement(*st), &old_loc);
goto cleanup;
}
+ else
+ got_matching_end = true;
old_loc = gfc_current_locus;
/* If we're at the end, make sure a block name wasn't required. */
@@ -6581,7 +6584,7 @@
/* If we are missing an END BLOCK, we created a half-ready namespace.
Remove it from the parent namespace's sibling list. */
- while (state == COMP_BLOCK)
+ while (state == COMP_BLOCK && !got_matching_end)
{
parent_ns = gfc_current_ns->parent;
@@ -6601,7 +6604,7 @@
prev_ns = ns;
ns = ns->sibling;
}
-
+
gfc_free_namespace (gfc_current_ns);
gfc_current_ns = parent_ns;
gfc_state_stack = gfc_state_stack->previous;
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog (Revision 232917)
+++ gcc/testsuite/ChangeLog (Arbeitskopie)
@@ -1,3 +1,10 @@
+2016-01-28 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ PR fortran/62536
+ * gfortran.dg/block_15.f08: New test.
+ * gfortran.dg/block_end_error_1.f90: Need to catch additional error
+ on incorrectly closed BLOCK.
+
2016-01-28 Ilya Enkovich <enkovich.gnu@gmail.com>
* gcc.dg/declare-simd.c: New test.
Index: gcc/testsuite/gfortran.dg/block_end_error_1.f90
===================================================================
--- gcc/testsuite/gfortran.dg/block_end_error_1.f90 (Revision 232917)
+++ gcc/testsuite/gfortran.dg/block_end_error_1.f90 (Arbeitskopie)
@@ -6,5 +6,5 @@
block
end block named ! { dg-error "Syntax error in END BLOCK statement" }
return
-endsubroutine
+endsubroutine ! { dg-error "Expecting END BLOCK statement" }
! { dg-prune-output "Unexpected end of file" }