From 7f36b65d25e6882ac20d6baf80dd8f2c773aa7d7 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Wed, 30 Apr 2014 20:39:15 +0200 Subject: [PATCH] trans-expr.c (get_tree_for_caf_expr): Fix handling of 2014-04-30 Tobias Burnus * trans-expr.c (get_tree_for_caf_expr): Fix handling of * polymorphic and derived-type coarrays. 2014-04-30 Tobias Burnus * gfortran.dg/coarray_poly_4.f90: New. * gfortran.dg/coarray_poly_5.f90: New. From-SVN: r209948 --- gcc/fortran/ChangeLog | 7 ++- gcc/fortran/trans-expr.c | 47 +++++++++++++------- gcc/testsuite/ChangeLog | 5 +++ gcc/testsuite/gfortran.dg/coarray_poly_4.f90 | 23 ++++++++++ gcc/testsuite/gfortran.dg/coarray_poly_5.f90 | 14 ++++++ 5 files changed, 80 insertions(+), 16 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/coarray_poly_4.f90 create mode 100644 gcc/testsuite/gfortran.dg/coarray_poly_5.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5cf25134e30..356bb485d15 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,4 +1,9 @@ -2014-03-27 Thomas Koenig +2014-04-30 Tobias Burnus + + * trans-expr.c (get_tree_for_caf_expr): Fix handling of polymorphic + and derived-type coarrays. + +2014-04-27 Thomas Koenig PR fortran/59604 PR fortran/58003 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d6f820c4915..f0e5b7ddc2f 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1387,25 +1387,42 @@ gfc_get_expr_charlen (gfc_expr *e) static tree get_tree_for_caf_expr (gfc_expr *expr) { - tree caf_decl = NULL_TREE; - gfc_ref *ref; + tree caf_decl; + bool found; + gfc_ref *ref; - gcc_assert (expr && expr->expr_type == EXPR_VARIABLE); - if (expr->symtree->n.sym->attr.codimension) - caf_decl = expr->symtree->n.sym->backend_decl; + gcc_assert (expr && expr->expr_type == EXPR_VARIABLE); - for (ref = expr->ref; ref; ref = ref->next) - if (ref->type == REF_COMPONENT) - { + caf_decl = expr->symtree->n.sym->backend_decl; + gcc_assert (caf_decl); + if (expr->symtree->n.sym->ts.type == BT_CLASS) + caf_decl = gfc_class_data_get (caf_decl); + if (expr->symtree->n.sym->attr.codimension) + return caf_decl; + + /* The following code assumes that the coarray is a component reachable via + only scalar components/variables; the Fortran standard guarantees this. */ + + for (ref = expr->ref; ref; ref = ref->next) + if (ref->type == REF_COMPONENT) + { gfc_component *comp = ref->u.c.component; - if (comp->attr.pointer || comp->attr.allocatable) - caf_decl = NULL_TREE; - if (comp->attr.codimension) - caf_decl = comp->backend_decl; - } - gcc_assert (caf_decl != NULL_TREE); - return caf_decl; + if (POINTER_TYPE_P (TREE_TYPE (caf_decl))) + caf_decl = build_fold_indirect_ref_loc (input_location, caf_decl); + caf_decl = fold_build3_loc (input_location, COMPONENT_REF, + TREE_TYPE (comp->backend_decl), caf_decl, + comp->backend_decl, NULL_TREE); + if (comp->ts.type == BT_CLASS) + caf_decl = gfc_class_data_get (caf_decl); + if (comp->attr.codimension) + { + found = true; + break; + } + } + gcc_assert (found && caf_decl); + return caf_decl; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1485c584c74..d1955b4eb05 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-30 Tobias Burnus + + * gfortran.dg/coarray_poly_4.f90: New. + * gfortran.dg/coarray_poly_5.f90: New. + 2014-04-30 Alan Lawrence * gcc.target/arm/simd/vuzpqf32_1.c: New file. diff --git a/gcc/testsuite/gfortran.dg/coarray_poly_4.f90 b/gcc/testsuite/gfortran.dg/coarray_poly_4.f90 new file mode 100644 index 00000000000..ceb1c858301 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_poly_4.f90 @@ -0,0 +1,23 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib -fdump-tree-original" } + +subroutine test(i) +type t + real, allocatable :: x[:] +end type t + +interface + subroutine sub(y) + import + real :: y[*] + end subroutine sub +end interface + +integer :: i +type(t), save :: var +allocate(var%x[*]) +call sub(var%x) +end subroutine test + +! { dg-final { scan-tree-dump-times "sub \\(\\(real\\(kind=4\\) \\*\\) var.x.data, var.x.token, 0\\);" 1 "original" } } +! { dg-final { cleanup-tree-dump "original" } } diff --git a/gcc/testsuite/gfortran.dg/coarray_poly_5.f90 b/gcc/testsuite/gfortran.dg/coarray_poly_5.f90 new file mode 100644 index 00000000000..29c9c8c3140 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/coarray_poly_5.f90 @@ -0,0 +1,14 @@ +! { dg-do compile } +! { dg-options "-fcoarray=lib -fdump-tree-original" } + +subroutine test(x) +type t + real, allocatable :: x[:] +end type t + +class(t) :: x +allocate(x%x[*]) +end subroutine test + +! { dg-final { scan-tree-dump-times "x->_data->x.data = _gfortran_caf_register \\(4, 1, &x->_data->x.token, 0B, 0B, 0\\);" 1 "original" } } +! { dg-final { cleanup-tree-dump "original" } }