From 6479f45b31c13f30f1de2ac4ff8d7a0e0084b864 Mon Sep 17 00:00:00 2001 From: Andre Vehreschild Date: Tue, 13 Dec 2016 17:47:48 +0100 Subject: [PATCH] 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 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 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 | 8 ++++ gcc/fortran/resolve.c | 4 +- gcc/fortran/trans-array.c | 2 + gcc/testsuite/ChangeLog | 7 +++ gcc/testsuite/gfortran.dg/coarray_38.f90 | 2 +- gcc/testsuite/gfortran.dg/coarray_41.f90 | 29 ++++++++++++ gcc/testsuite/gfortran.dg/coarray_class_2.f90 | 45 +++++++++++++++++++ 7 files changed, 94 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/coarray_41.f90 create mode 100644 gcc/testsuite/gfortran.dg/coarray_class_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 2a4b69dabc7..d25fc9702ef 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2016-12-13 Andre Vehreschild + + 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 Paul Thomas diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index ece4d7523a2..ce1d9ea0f98 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 8753cbf4660..0cd83f41789 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 abc687c5b29..48ad430720b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2016-12-13 Andre Vehreschild + + 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 * 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 c8011d44707..04ef742faab 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 00000000000..b62d8e41de4 --- /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 00000000000..58dce1aa1fd --- /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 -- 2.30.2