This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug fortran/67758] [6 Regression] ICE on invalid use of COMMON


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67758

--- Comment #8 from Mikael Morin <mikael at gcc dot gnu.org> ---
Author: mikael
Date: Sun Oct 18 17:17:21 2015
New Revision: 228947

URL: https://gcc.gnu.org/viewcvs?rev=228947&root=gcc&view=rev
Log:
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.


Added:
    trunk/gcc/testsuite/gfortran.dg/common_25.f90
Modified:
    trunk/gcc/fortran/ChangeLog
    trunk/gcc/fortran/gfortran.h
    trunk/gcc/fortran/match.c
    trunk/gcc/fortran/symbol.c
    trunk/gcc/testsuite/ChangeLog


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]