From d6000c6e0d443eb57de0b30e48e265d16e93060a Mon Sep 17 00:00:00 2001 From: Mikael Morin Date: Tue, 14 Apr 2015 09:18:15 +0000 Subject: [PATCH] re PR fortran/56674 (ICE in check_sym_interfaces) PR fortran/56674 PR fortran/58813 PR fortran/59016 PR fortran/59024 fortran/ * symbol.c (save_symbol_data, gfc_save_symbol_data): Rename the former to the latter and make it non-static. Update callers. * gfortran.h (gfc_save_symbol_data): New prototype. * decl.c (gfc_match_decl_type_spec): Call 'gfc_save_symbol_data' before modifying symbols 'sym' and 'dt_sym'. testsuite/ * gfortran.dg/used_types_27.f90: New. From-SVN: r222078 --- gcc/fortran/ChangeLog | 12 ++++++++++++ gcc/fortran/decl.c | 3 +++ gcc/fortran/gfortran.h | 1 + gcc/fortran/symbol.c | 8 ++++---- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gfortran.dg/used_types_27.f90 | 18 ++++++++++++++++++ 6 files changed, 46 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/used_types_27.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ecd62bcbeaa8..589f2206d523 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,15 @@ +2015-04-14 Mikael Morin + + PR fortran/56674 + PR fortran/58813 + PR fortran/59016 + PR fortran/59024 + * symbol.c (save_symbol_data, gfc_save_symbol_data): Rename the + former to the latter and make it non-static. Update callers. + * gfortran.h (gfc_save_symbol_data): New prototype. + * decl.c (gfc_match_decl_type_spec): Call 'gfc_save_symbol_data' + before modifying symbols 'sym' and 'dt_sym'. + 2015-03-23 Andre Vehreschild Janus Weil diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index eebecd59f1bb..ea1b20e84f48 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -2851,6 +2851,7 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) return MATCH_ERROR; } + gfc_save_symbol_data (sym); gfc_set_sym_referenced (sym); if (!sym->attr.generic && !gfc_add_generic (&sym->attr, sym->name, NULL)) @@ -2875,6 +2876,8 @@ gfc_match_decl_type_spec (gfc_typespec *ts, int implicit_flag) sym->generic = intr; sym->attr.if_source = IFSRC_DECL; } + else + gfc_save_symbol_data (dt_sym); gfc_set_sym_referenced (dt_sym); diff --git a/gcc/fortran/gfortran.h b/gcc/fortran/gfortran.h index 8cc20603928a..11d3996c90ec 100644 --- a/gcc/fortran/gfortran.h +++ b/gcc/fortran/gfortran.h @@ -2815,6 +2815,7 @@ bool verify_bind_c_derived_type (gfc_symbol *); bool verify_com_block_vars_c_interop (gfc_common_head *); gfc_symtree *generate_isocbinding_symbol (const char *, iso_c_binding_symbol, const char *, gfc_symtree *, bool); +void gfc_save_symbol_data (gfc_symbol *); int gfc_get_sym_tree (const char *, gfc_namespace *, gfc_symtree **, bool); int gfc_get_ha_symbol (const char *, gfc_symbol **); int gfc_get_ha_sym_tree (const char *, gfc_symtree **); diff --git a/gcc/fortran/symbol.c b/gcc/fortran/symbol.c index 8edd6931f97c..dca3220fd3b8 100644 --- a/gcc/fortran/symbol.c +++ b/gcc/fortran/symbol.c @@ -2747,8 +2747,8 @@ single_undo_checkpoint_p (void) /* Save symbol with the information necessary to back it out. */ -static void -save_symbol_data (gfc_symbol *sym) +void +gfc_save_symbol_data (gfc_symbol *sym) { gfc_symbol *s; unsigned i; @@ -2849,7 +2849,7 @@ gfc_get_sym_tree (const char *name, gfc_namespace *ns, gfc_symtree **result, p->mark = 1; /* Copy in case this symbol is changed. */ - save_symbol_data (p); + gfc_save_symbol_data (p); } *result = st; @@ -2888,7 +2888,7 @@ gfc_get_ha_sym_tree (const char *name, gfc_symtree **result) if (st != NULL) { - save_symbol_data (st->n.sym); + gfc_save_symbol_data (st->n.sym); *result = st; return i; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a9c543298b04..8b9d88bc3906 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-04-14 Mikael Morin + + PR fortran/56674 + PR fortran/58813 + PR fortran/59016 + PR fortran/59024 + * gfortran.dg/used_types_27.f90: New. + 2015-04-07 Bin Cheng Backport from trunk r221889 diff --git a/gcc/testsuite/gfortran.dg/used_types_27.f90 b/gcc/testsuite/gfortran.dg/used_types_27.f90 new file mode 100644 index 000000000000..4797f855cac1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/used_types_27.f90 @@ -0,0 +1,18 @@ +! { dg-do compile } +! +! PR fortran/56674 +! PR fortran/58813 +! PR fortran/59016 +! PR fortran/59024 +! The generic name 'atomic_kind_types' was keeping pointers to freed +! symbols, leading to random error-recovery ICEs. +! +! Original test case from Joost VandeVondele . + +MODULE atomic_kind_types + PUBLIC :: atomic_kind_type +CONTAINS + INTEGER FUNCTION is_hydrogen(atomic_kind) + TYPE(atomic_kind_type), pointer :: atomic_kind ! { dg-error "used before it is defined" } + END FUNCTION +END MODULE -- 2.47.2