aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2016-12-13 17:47:48 +0100
committerAndre Vehreschild <vehre@gcc.gnu.org>2016-12-13 17:47:48 +0100
commit6479f45b31c13f30f1de2ac4ff8d7a0e0084b864 (patch)
treec790303060ae2a715c0ef52807f3705bb2b57d25 /gcc
parentb37a5b979a275375322787973b7d6fb620a71ccf (diff)
downloadgcc-6479f45b31c13f30f1de2ac4ff8d7a0e0084b864.zip
gcc-6479f45b31c13f30f1de2ac4ff8d7a0e0084b864.tar.gz
gcc-6479f45b31c13f30f1de2ac4ff8d7a0e0084b864.tar.bz2
re PR fortran/77785 ([Coarray] ICE in gfc_get_caf_token_offset, at fortran/trans-expr.c:1990)
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/resolve.c4
-rw-r--r--gcc/fortran/trans-array.c2
-rw-r--r--gcc/testsuite/ChangeLog7
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_38.f902
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_41.f9029
-rw-r--r--gcc/testsuite/gfortran.dg/coarray_class_2.f9045
7 files changed, 94 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 2a4b69d..d25fc97 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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>
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index ece4d75..ce1d9ea 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -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);
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 8753cbf..0cd83f4 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index abc687c..48ad430 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/coarray_38.f90 b/gcc/testsuite/gfortran.dg/coarray_38.f90
index c8011d4..04ef742 100644
--- a/gcc/testsuite/gfortran.dg/coarray_38.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_38.f90
@@ -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
index 0000000..b62d8e4
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_41.f90
@@ -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
index 0000000..58dce1a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/coarray_class_2.f90
@@ -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