Fix common-related error recovery ICE.
authorMikael Morin <mikael@gcc.gnu.org>
Sun, 18 Oct 2015 17:17:21 +0000 (17:17 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Sun, 18 Oct 2015 17:17:21 +0000 (17:17 +0000)
commita70ba41f41bca6d1965e617686ab02fc6eb42c5f
tree825f09b858c7489a7824b502280e56fef764f000
parent45c3fea9baf7690791680ad24eacc01376b6dbd3
Fix common-related error recovery ICE.

Fix an inconsistent state, between the in_common attribute
and the common_block pointer.

 - adding a symbol to a common block list in gfc_match_common is delayed
   after the call to gfc_add_in_common.
 - gfc_restore_latest_undo_checkpoint is changed to check the common_block
   pointer directly instead of the in_common attribute.
 - gfc_restore_old_symbol is changed to also restore
   the common-related pointers.  This is done using a new function created
   to factor the related memory management.
 - In gfc_restore_last_undo_checkpoint, when a symbol has been removed
   from the common block linked list, its common_next pointer is cleared.

PR fortran/67758
gcc/fortran/
* gfortran.h (gfc_symbol): Expand comment.
* match.c (gfc_match_common): Delay adding the symbol to
the common_block after the gfc_add_in_common call.
* symbol.c (gfc_free_symbol): Move common block memory handling...
(gfc_set_symbol_common_block): ... here as a new function.
(restore_old_symbol): Restore common block fields.
(gfc_restore_last_undo_checkpoint):
Check the common_block pointer instead of the in_common attribute.
When a symbol has been removed from the common block linked list,
clear its common_next pointer.
gcc/testsuite/
* gfortran.dg/common_25.f90: New file.

From-SVN: r228947
gcc/fortran/ChangeLog
gcc/fortran/gfortran.h
gcc/fortran/match.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/common_25.f90 [new file with mode: 0644]