re PR fortran/88009 (ICE in find_intrinsic_vtab, at fortran/class.c:2761)
authorJanus Weil <janus@gcc.gnu.org>
Sat, 5 Jan 2019 14:32:12 +0000 (15:32 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sat, 5 Jan 2019 14:32:12 +0000 (15:32 +0100)
2019-01-05  Janus Weil  <janus@gcc.gnu.org>

PR fortran/88009
* class.c (gfc_find_derived_vtab): Mark the _final component as
artificial.
(find_intrinsic_vtab): Ditto. Also add an extra check to avoid
dereferencing a null pointer and adjust indentation.
* resolve.c (resolve_fl_variable): Add extra check to avoid
dereferencing a null pointer. Move variable declarations to local scope.
(resolve_fl_procedure): Add extra check to avoid dereferencing a null
pointer.
* symbol.c (check_conflict): Suppress errors for artificial symbols.

2019-01-05  Janus Weil  <janus@gcc.gnu.org>

PR fortran/88009
* gfortran.dg/blockdata_10.f90: New test case.

From-SVN: r267598

gcc/fortran/ChangeLog
gcc/fortran/class.c
gcc/fortran/resolve.c
gcc/fortran/symbol.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/blockdata_10.f90 [new file with mode: 0644]

index 303892d893e630832e95bbc27b78e75ec0c93af1..2b8da1dd919b9ddfcf14100512ca0b8f6db59326 100644 (file)
@@ -1,3 +1,16 @@
+2019-01-05  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/88009
+       * class.c (gfc_find_derived_vtab): Mark the _final component as
+       artificial.
+       (find_intrinsic_vtab): Ditto. Also add an extra check to avoid
+       dereferencing a null pointer and adjust indentation.
+       * resolve.c (resolve_fl_variable): Add extra check to avoid
+       dereferencing a null pointer. Move variable declarations to local scope.
+       (resolve_fl_procedure): Add extra check to avoid dereferencing a null
+       pointer.
+       * symbol.c (check_conflict): Suppress errors for artificial symbols.
+
 2019-01-01  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        * parse.c (decode_statement):  Suppress "Unclassifiable statement"
index e55ab25882f09dbe5656412a017991813ed2e6cf..77f0fca9385c7595dbcea870d429902e03720b2d 100644 (file)
@@ -2466,6 +2466,7 @@ gfc_find_derived_vtab (gfc_symbol *derived)
                goto cleanup;
              c->attr.proc_pointer = 1;
              c->attr.access = ACCESS_PRIVATE;
+             c->attr.artificial = 1;
              c->tb = XCNEW (gfc_typebound_proc);
              c->tb->ppc = 1;
              generate_finalization_wrapper (derived, ns, tname, c);
@@ -2762,9 +2763,9 @@ find_intrinsic_vtab (gfc_typespec *ts)
              /* This is elemental so that arrays are automatically
                 treated correctly by the scalarizer.  */
              copy->attr.elemental = 1;
-             if (ns->proc_name->attr.flavor == FL_MODULE)
+             if (ns->proc_name && ns->proc_name->attr.flavor == FL_MODULE)
                copy->module = ns->proc_name->name;
-                 gfc_set_sym_referenced (copy);
+             gfc_set_sym_referenced (copy);
              /* Set up formal arguments.  */
              gfc_get_symbol ("src", sub_ns, &src);
              src->ts.type = ts->type;
@@ -2798,6 +2799,7 @@ find_intrinsic_vtab (gfc_typespec *ts)
                goto cleanup;
              c->attr.proc_pointer = 1;
              c->attr.access = ACCESS_PRIVATE;
+             c->attr.artificial = 1;
              c->tb = XCNEW (gfc_typebound_proc);
              c->tb->ppc = 1;
              c->initializer = gfc_get_null_expr (NULL);
index a498d19e4118609e7e5265c30b55e4b05eb5ba9a..beafe8da8bc0f9071a43ac3bb4aa4515ac0bb056 100644 (file)
@@ -12274,13 +12274,8 @@ deferred_requirements (gfc_symbol *sym)
 static bool
 resolve_fl_variable (gfc_symbol *sym, int mp_flag)
 {
-  int no_init_flag, automatic_flag;
-  gfc_expr *e;
-  const char *auto_save_msg;
-  bool saved_specification_expr;
-
-  auto_save_msg = "Automatic object %qs at %L cannot have the "
-                 "SAVE attribute";
+  const char *auto_save_msg = "Automatic object %qs at %L cannot have the "
+                             "SAVE attribute";
 
   if (!resolve_fl_var_and_proc (sym, mp_flag))
     return false;
@@ -12288,7 +12283,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
   /* Set this flag to check that variables are parameters of all entries.
      This check is effected by the call to gfc_resolve_expr through
      is_non_constant_shape_array.  */
-  saved_specification_expr = specification_expr;
+  bool saved_specification_expr = specification_expr;
   specification_expr = true;
 
   if (sym->ns->proc_name
@@ -12315,6 +12310,8 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
     {
       /* Make sure that character string variables with assumed length are
         dummy arguments.  */
+      gfc_expr *e = NULL;
+
       if (sym->ts.u.cl)
        e = sym->ts.u.cl->length;
       else
@@ -12364,7 +12361,7 @@ resolve_fl_variable (gfc_symbol *sym, int mp_flag)
     apply_default_init_local (sym); /* Try to apply a default initialization.  */
 
   /* Determine if the symbol may not have an initializer.  */
-  no_init_flag = automatic_flag = 0;
+  int no_init_flag = 0, automatic_flag = 0;
   if (sym->attr.allocatable || sym->attr.external || sym->attr.dummy
       || sym->attr.intrinsic || sym->attr.result)
     no_init_flag = 1;
@@ -12494,7 +12491,7 @@ resolve_fl_procedure (gfc_symbol *sym, int mp_flag)
      module procedures are excluded by 2.2.3.3 - i.e., they are not
      externally accessible and can access all the objects accessible in
      the host.  */
-  if (!(sym->ns->parent
+  if (!(sym->ns->parent && sym->ns->parent->proc_name
        && sym->ns->parent->proc_name->attr.flavor == FL_MODULE)
       && gfc_check_symbol_access (sym))
     {
index a88e7c01df78a8afa614c3eaa54103c2cd781c51..cd52c73031b300569bb846f2ed0af9d1ad3f9c81 100644 (file)
@@ -440,6 +440,9 @@ check_conflict (symbol_attribute *attr, const char *name, locus *where)
   const char *a1, *a2;
   int standard;
 
+  if (attr->artificial)
+    return true;
+
   if (where == NULL)
     where = &gfc_current_locus;
 
index 0a783ce1b770588511ebaf2d90d299f4bb0fb2ca..70d51e4d1f4548fe9d5ccad67cd74d48bf7ebd9e 100644 (file)
@@ -1,3 +1,8 @@
+2019-01-05  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/88009
+       * gfortran.dg/blockdata_10.f90: New test case.
+
 2019-01-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/82564
diff --git a/gcc/testsuite/gfortran.dg/blockdata_10.f90 b/gcc/testsuite/gfortran.dg/blockdata_10.f90
new file mode 100644 (file)
index 0000000..ce7ba25
--- /dev/null
@@ -0,0 +1,13 @@
+! { dg-do compile }
+!
+! PR 88009: [9 Regression] ICE in find_intrinsic_vtab, at fortran/class.c:2761
+!
+! Contributed by G. Steinmetz <gscfq@t-online.de>
+
+module m
+   class(*), allocatable :: z
+end
+block data
+   use m
+   z = 'z'  ! { dg-error "assignment statement is not allowed|Unexpected assignment statement" }
+end