]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR fortran/56674 (ICE in check_sym_interfaces)
authorMikael Morin <mikael@gcc.gnu.org>
Tue, 14 Apr 2015 12:23:30 +0000 (12:23 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Tue, 14 Apr 2015 12:23:30 +0000 (12:23 +0000)
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: r222086

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/fortran/gfortran.h
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/used_types_27.f90 [new file with mode: 0644]

index b055f3a0d34f9e36d16a942fc0d1c6518dd261c6..930f14b730cd3f23c104339280d1fd7733c37093 100644 (file)
@@ -1,3 +1,15 @@
+2015-04-14  Mikael Morin  <mikael@gcc.gnu.org>
+
+       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-21  Mikael Morin  <mikael@gcc.gnu.org>
 
        Backport from trunk:
index 9292418adcaa4c120a8dc8451347f9256d9b84d4..e73e32d20cfaa99ff076834540c926bde3b68ee5 100644 (file)
@@ -2852,6 +2852,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) == FAILURE)
@@ -2876,6 +2877,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);
 
index bd1aeb9ffab80439447cd83a427c38dab8398028..2428b519b207a7c94a6ca8607da8132811e8f9a5 100644 (file)
@@ -2638,6 +2638,7 @@ gfc_try verify_bind_c_derived_type (gfc_symbol *);
 gfc_try verify_com_block_vars_c_interop (gfc_common_head *);
 void generate_isocbinding_symbol (const char *, iso_c_binding_symbol, const char *);
 gfc_symbol *get_iso_c_sym (gfc_symbol *, char *, const char *, int);
+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 **);
index 1b3702f821f52ae840445f8f17ced1d52d439956..785f58200c23b828df36c4640d81cd98e283c902 100644 (file)
@@ -2717,8 +2717,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;
@@ -2813,7 +2813,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;
@@ -2852,7 +2852,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;
     }
index cf8b0bd47d089f071c19792d580c594c7313db78..1d60a1edec0f4275de8106400e2716ea45cccca0 100644 (file)
@@ -1,3 +1,11 @@
+2015-04-14  Mikael Morin  <mikael@gcc.gnu.org>
+
+       PR fortran/56674
+       PR fortran/58813
+       PR fortran/59016
+       PR fortran/59024
+       * gfortran.dg/used_types_27.f90: New.
+
 2015-03-31  Dominik Vogt  <vogt@linux.vnet.ibm.com>
 
        * gcc.target/s390/hotpatch-25.c: New test.
diff --git a/gcc/testsuite/gfortran.dg/used_types_27.f90 b/gcc/testsuite/gfortran.dg/used_types_27.f90
new file mode 100644 (file)
index 0000000..4797f85
--- /dev/null
@@ -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 <Joost.VandeVondele@mat.ethz.ch>.
+
+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