re PR fortran/77785 ([Coarray] ICE in gfc_get_caf_token_offset, at fortran/trans...
authorAndre Vehreschild <vehre@gcc.gnu.org>
Tue, 13 Dec 2016 16:47:48 +0000 (17:47 +0100)
committerAndre Vehreschild <vehre@gcc.gnu.org>
Tue, 13 Dec 2016 16:47:48 +0000 (17:47 +0100)
gcc/fortran/ChangeLog:

2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/77785
* resolve.c (resolve_symbol): Correct attr lookup to the _data
component.
* trans-array.c (gfc_alloc_allocatable_for_assignment): Indirect ref
pointers and references before retrieving the caf-token.

gcc/testsuite/ChangeLog:

2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>

PR fortran/77785
* gfortran.dg/coarray_38.f90: Added expecting error message.
* gfortran.dg/coarray_41.f90: New test.
* gfortran.dg/coarray_class_2.f90: New test.

From-SVN: r243614

gcc/fortran/ChangeLog
gcc/fortran/resolve.c
gcc/fortran/trans-array.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/coarray_38.f90
gcc/testsuite/gfortran.dg/coarray_41.f90 [new file with mode: 0644]
gcc/testsuite/gfortran.dg/coarray_class_2.f90 [new file with mode: 0644]

index 2a4b69dabc7872466bb0d338e420221876c013c0..d25fc9702ef1a9931ea7199ff333e14abbad39e7 100644 (file)
@@ -1,3 +1,11 @@
+2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/77785
+       * resolve.c (resolve_symbol): Correct attr lookup to the _data
+       component.
+       * trans-array.c (gfc_alloc_allocatable_for_assignment): Indirect ref
+       pointers and references before retrieving the caf-token.
+
 2016-12-13  Janus Weil  <janus@gcc.gnu.org>
            Paul Thomas  <pault@gcc.gnu.org>
 
index ece4d7523a2cf8245c1b0f74b9ae34063726d343..ce1d9ea0f9872d41f5735c44d86048512f7b98f9 100644 (file)
@@ -14044,8 +14044,8 @@ resolve_symbol (gfc_symbol *sym)
   if (flag_coarray == GFC_FCOARRAY_LIB && sym->ts.type == BT_CLASS
       && sym->ts.u.derived && CLASS_DATA (sym)
       && CLASS_DATA (sym)->attr.codimension
-      && (sym->ts.u.derived->attr.alloc_comp
-         || sym->ts.u.derived->attr.pointer_comp))
+      && (CLASS_DATA (sym)->ts.u.derived->attr.alloc_comp
+         || CLASS_DATA (sym)->ts.u.derived->attr.pointer_comp))
     {
       gfc_error ("Sorry, allocatable/pointer components in polymorphic (CLASS) "
                 "type coarrays at %L are unsupported", &sym->declared_at);
index 8753cbf4660404a7a6fb06728899414a688d2b97..0cd83f41789766699fe463f74e597fe3e1e42f83 100644 (file)
@@ -9337,6 +9337,8 @@ gfc_alloc_allocatable_for_assignment (gfc_loopinfo *loop,
       if (token == NULL_TREE)
        {
          tmp = gfc_get_tree_for_caf_expr (expr1);
+         if (POINTER_TYPE_P (TREE_TYPE (tmp)))
+           tmp = build_fold_indirect_ref (tmp);
          gfc_get_caf_token_offset (&caf_se, &token, NULL, tmp, NULL_TREE,
                                    expr1);
          token = gfc_build_addr_expr (NULL_TREE, token);
index abc687c5b2910eed596796b06e78ddf5b7f79fd6..48ad430720bd6c2c68bba67d55f6a7db8c5f77a7 100644 (file)
@@ -1,3 +1,10 @@
+2016-12-13  Andre Vehreschild  <vehre@gcc.gnu.org>
+
+       PR fortran/77785
+       * gfortran.dg/coarray_38.f90: Added expecting error message.
+       * gfortran.dg/coarray_41.f90: New test.
+       * gfortran.dg/coarray_class_2.f90: New test.
+
 2016-12-13 Carl Love  <cel@us.ibm.com>
 
        * gcc.target/powerpc/builtins-3.c: Add new test of the test suite
index c8011d447078bc47a87b1d920de7ac5a1d28c3f3..04ef742faabb280edff308f356395f01c5061fc3 100644 (file)
@@ -92,7 +92,7 @@ end type t
 type t2
   class(t), allocatable :: caf2[:]
 end type t2
-class(t), save, allocatable :: caf[:]
+class(t), save, allocatable :: caf[:] ! { dg-error "Sorry, allocatable/pointer components in polymorphic" }
 type(t) :: x
 type(t2) :: y
 
diff --git a/gcc/testsuite/gfortran.dg/coarray_41.f90 b/gcc/testsuite/gfortran.dg/coarray_41.f90
new file mode 100644 (file)
index 0000000..b62d8e4
--- /dev/null
@@ -0,0 +1,29 @@
+! { dg-do run }
+! { dg-options "-fcoarray=lib -lcaf_single" }
+
+program coarray_41
+
+  integer, allocatable :: vec(:)[:,:]
+
+  allocate(vec(10)[2,*], source= 37)
+
+  if (.not. allocated(vec)) error stop
+
+  call foo(vec)
+
+  if (any(vec /= 42)) error stop
+
+  deallocate(vec)
+contains
+
+  subroutine foo(gv)
+
+    integer, allocatable, intent(inout) :: gv(:)[:,:]
+    integer, allocatable :: gvin(:)
+
+    allocate(gvin, mold=gv)
+    gvin = 5
+    gv = gv + gvin
+  end subroutine foo
+
+end program coarray_41
diff --git a/gcc/testsuite/gfortran.dg/coarray_class_2.f90 b/gcc/testsuite/gfortran.dg/coarray_class_2.f90
new file mode 100644 (file)
index 0000000..58dce1a
--- /dev/null
@@ -0,0 +1,45 @@
+! { dg-do compile }
+! { dg-options "-fcoarray=lib" }
+! Check that error message is presented as long as polymorphic coarrays are
+! not implemented.
+
+module maccscal
+   type t
+      real, allocatable :: a
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a)
+   end
+end
+module mptrscal
+   type t
+      real, pointer :: a
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a)
+   end
+end
+module mallarr
+   type t
+      real, allocatable :: a(:)
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a(2))
+   end
+end
+module mptrarr
+   type t
+      real, pointer :: a(:)
+   end type
+contains
+   subroutine s(x) ! { dg-error "Sorry, allocatable/pointer components in polymorphic \\(CLASS\\)" }
+      class(t) :: x[*]
+      allocate (x%a(2))
+   end
+end