diff options
author | Louis Krupp <louis.krupp@zoho.com> | 2015-08-24 16:29:59 +0000 |
---|---|---|
committer | François-Xavier Coudert <fxcoudert@gcc.gnu.org> | 2015-08-24 16:29:59 +0000 |
commit | 9f7ba2088e4ebfa747f51a107d25f05c29df51b7 (patch) | |
tree | 6e41ed5457b2c0579a7c84fd81d880193a273f76 /gcc/fortran/parse.c | |
parent | 2021ff273d58600199d0b2fb394c1ebee9bbeec0 (diff) | |
download | gcc-9f7ba2088e4ebfa747f51a107d25f05c29df51b7.zip gcc-9f7ba2088e4ebfa747f51a107d25f05c29df51b7.tar.gz gcc-9f7ba2088e4ebfa747f51a107d25f05c29df51b7.tar.bz2 |
re PR fortran/62536 (ICE (segfault) for invalid END BLOCK statement)
PR fortran/62536
PR fortran/66175
* decl.c (gfc_match_end): Clean up nested BLOCKs.
* parse.c (parse_block_construct): Deal gracefully with cleaned-up
BLOCKs.
* gfortran.dg/block_end_error_1.f90: New test.
* gfortran.dg/blocks_nested_incomplete_1.f90: New test.
From-SVN: r227135
Diffstat (limited to 'gcc/fortran/parse.c')
-rw-r--r-- | gcc/fortran/parse.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/gcc/fortran/parse.c b/gcc/fortran/parse.c index 04b4c80..62bcb61 100644 --- a/gcc/fortran/parse.c +++ b/gcc/fortran/parse.c @@ -3935,6 +3935,7 @@ static void parse_block_construct (void) { gfc_namespace* my_ns; + gfc_namespace* my_parent; gfc_state_data s; gfc_notify_std (GFC_STD_F2008, "BLOCK construct at %C"); @@ -3948,10 +3949,14 @@ parse_block_construct (void) push_state (&s, COMP_BLOCK, my_ns->proc_name); gfc_current_ns = my_ns; + my_parent = my_ns->parent; parse_progunit (ST_NONE); - gfc_current_ns = gfc_current_ns->parent; + /* Don't depend on the value of gfc_current_ns; it might have been + reset if the block had errors and was cleaned up. */ + gfc_current_ns = my_parent; + pop_state (); } |