re PR fortran/87991 (ICE in gfc_constructor_append_expr, at fortran/constructor.c...
authorSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 14 Aug 2019 04:22:31 +0000 (04:22 +0000)
committerSteven G. Kargl <kargl@gcc.gnu.org>
Wed, 14 Aug 2019 04:22:31 +0000 (04:22 +0000)
2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/87991
* resolve.c (check_data_variable): data-stmt-object with pointer
attribute requires a data-stmt-value with the target attribute.

2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>

PR fortran/87991
* gfortran.dg/pr87991.f90: New test.

From-SVN: r274412

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

index 787c704cafc4b05928489093b6902325a7811432..42cf2f579478f48a1b02edbfe606f1fececd19ae 100644 (file)
@@ -1,3 +1,9 @@
+2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/87991
+       * resolve.c (check_data_variable): data-stmt-object with pointer
+       attribute requires a data-stmt-value with the target attribute.
+
 2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/88072
index bd379b696a0c2e6ce77b03111c276f698621cdd0..ac9192ae02ceda1253e3e04a5ac36ea8b2165345 100644 (file)
@@ -15726,8 +15726,6 @@ check_data_variable (gfc_data_variable *var, locus *where)
       return false;
     }
 
-  has_pointer = sym->attr.pointer;
-
   if (gfc_is_coindexed (e))
     {
       gfc_error ("DATA element %qs at %L cannot have a coindex", sym->name,
@@ -15735,19 +15733,30 @@ check_data_variable (gfc_data_variable *var, locus *where)
       return false;
     }
 
+  has_pointer = sym->attr.pointer;
+
   for (ref = e->ref; ref; ref = ref->next)
     {
       if (ref->type == REF_COMPONENT && ref->u.c.component->attr.pointer)
        has_pointer = 1;
 
-      if (has_pointer
-           && ref->type == REF_ARRAY
-           && ref->u.ar.type != AR_FULL)
-         {
-           gfc_error ("DATA element %qs at %L is a pointer and so must "
-                       "be a full array", sym->name, where);
-           return false;
-         }
+      if (has_pointer)
+       {
+         if (ref->type == REF_ARRAY && ref->u.ar.type != AR_FULL)
+           {
+             gfc_error ("DATA element %qs at %L is a pointer and so must "
+                        "be a full array", sym->name, where);
+             return false;
+           }
+
+         if (values.vnode->expr->expr_type == EXPR_CONSTANT)
+           {
+             gfc_error ("DATA object near %L has the pointer attribute "
+                        "and the corresponding DATA value is not a valid "
+                        "initial-data-target", where);
+             return false;
+           }
+       }
     }
 
   if (e->rank == 0 || has_pointer)
index 1147dc86a0ecce9dcf96afd32b1d57089e2de85b..9f7f4e71c31c59d5b384123c52f05186dbcbd913 100644 (file)
@@ -1,3 +1,8 @@
+2019-08-13  Steven G. Kargl  <kargl@gcc.gnu.org>
+
+       PR fortran/87991
+       * gfortran.dg/pr87991.f90: New test.
 2019-08-13  Richard Sandiford  <richard.sandiford@arm.com>
 
        * gcc.target/aarch64/sve/spill_2.c: Increase iteration counts
diff --git a/gcc/testsuite/gfortran.dg/pr87991.f90 b/gcc/testsuite/gfortran.dg/pr87991.f90
new file mode 100644 (file)
index 0000000..435871e
--- /dev/null
@@ -0,0 +1,11 @@
+! { dg-do compile }
+! { dg-options "-w" }
+! PR fortran/87991
+program p
+   type t
+      character(:), pointer :: c
+   end type
+   type(t) :: x
+   allocate (character(3) :: x%c)
+   data x%c /'abc'/   ! { dg-error "has the pointer attribute" }
+end