re PR fortran/85798 (ICE in get_array_index, at fortran/data.c:69)
authorSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 22 Dec 2018 19:37:06 +0000 (19:37 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Sat, 22 Dec 2018 19:37:06 +0000 (19:37 +0000)
2018-12-22  Steven G . Kargl  <kargl@gcc.gnu.org>

PR fortran/85798
* decl.c (gfc_match_data): If a component of a derived type entity
appears in data statement, check that does not have the allocatable
attribute.

2018-12-22  Steven G . Kargl  <kargl@gcc.gnu.org>

PR fortran/85798
* gfortran.dg/pr85798.f90: New test.

From-SVN: r267356

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

index 6f37f0954cace8583d3a5f4d50cff216c4095173..276aad9c14b7a2c5df78decf4d0e4931b8c074db 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-22  Steven G . Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/85798
+       * decl.c (gfc_match_data): If a component of a derived type entity
+       appears in data statement, check that does not have the allocatable
+       attribute.
 2018-12-22  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88169
index 83d9ac6caf275ff242c1cfc5e7682fdd20331fa8..51c19c17d1d47b4ed6dece1b7663f5d20bd16e62 100644 (file)
@@ -596,6 +596,7 @@ match
 gfc_match_data (void)
 {
   gfc_data *new_data;
+  gfc_expr *e;
   match m;
 
   /* Before parsing the rest of a DATA statement, check F2008:c1206.  */
@@ -632,6 +633,30 @@ gfc_match_data (void)
          goto cleanup;
        }
 
+      /* Check for an entity with an allocatable component, which is not
+        allowed.  */
+      e = new_data->var->expr;
+      if (e)
+       {
+         bool invalid;
+
+         invalid = false;
+         for (gfc_ref *ref = e->ref; ref; ref = ref->next)
+           if ((ref->type == REF_COMPONENT
+                && ref->u.c.component->attr.allocatable)
+               || (ref->type == REF_ARRAY
+                   && e->symtree->n.sym->attr.pointer != 1
+                   && ref->u.ar.as && ref->u.ar.as->type == AS_DEFERRED))
+             invalid = true;
+
+         if (invalid)
+           {
+             gfc_error ("Allocatable component or deferred-shaped array "
+                        "near %C in DATA statement");
+             goto cleanup;
+           }
+       }
+
       m = top_val_list (new_data);
       if (m != MATCH_YES)
        goto cleanup;
index d358d2d3a31a29ba7709e640dee5f46d86f4fd07..85495144d83198a62c6d9ebb8e5d169e30bd190a 100644 (file)
@@ -1,3 +1,8 @@
+2018-12-26  Steven G . Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/85798
+       * gfortran.dg/pr85798.f90: New test.
+
 2018-12-21  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88169
diff --git a/gcc/testsuite/gfortran.dg/pr85798.f90 b/gcc/testsuite/gfortran.dg/pr85798.f90
new file mode 100644 (file)
index 0000000..1cc224d
--- /dev/null
@@ -0,0 +1,14 @@
+! { dg-do compile }
+program p
+   type t
+      integer, allocatable :: a(:)
+   end type
+   type u
+      real x
+      type(t) y
+   end type
+   type(t) :: z
+   type(u) :: q
+   data z%a(1) / 789 /     ! { dg-error "Allocatable component" }
+   data q%y%a(1) / 789 /   ! { dg-error "Allocatable component" }
+end