aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorAndre Vehreschild <vehre@gcc.gnu.org>2016-09-30 12:20:59 +0200
committerAndre Vehreschild <vehre@gcc.gnu.org>2016-09-30 12:20:59 +0200
commit26f391e8067e96e4fba7b531eda9fb80023f2fd2 (patch)
tree2a9fff47c877e59328ae314ee6f4aa5be68ce12a /gcc/fortran
parentfa16a27195c8862806f1483026fa1fbba8315afb (diff)
downloadgcc-26f391e8067e96e4fba7b531eda9fb80023f2fd2.zip
gcc-26f391e8067e96e4fba7b531eda9fb80023f2fd2.tar.gz
gcc-26f391e8067e96e4fba7b531eda9fb80023f2fd2.tar.bz2
trans-array.c (gfc_array_allocate): Use the token from coarray's .token member.
gcc/fortran/ChangeLog: 2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org> * trans-array.c (gfc_array_allocate): Use the token from coarray's .token member. * trans-intrinsic.c (conv_expr_ref_to_caf_ref): Only generate caf-reference chains from the first coarray references on. * trans-types.c (gfc_get_derived_type): Switch on mandatory .token member generation for allocatable arrays in coarrays in derived types. gcc/testsuite/ChangeLog: 2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org> * gfortran.dg/coarray_allocate_10.f08: New test. * gfortran.dg/coindexed_1.f90: Above fixes allow execution. From-SVN: r240650
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog9
-rw-r--r--gcc/fortran/trans-array.c7
-rw-r--r--gcc/fortran/trans-intrinsic.c27
-rw-r--r--gcc/fortran/trans-types.c3
4 files changed, 36 insertions, 10 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 53fab3d..ea28ae5 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,12 @@
+2016-09-30 Andre Vehreschild <vehre@gcc.gnu.org>
+
+ * trans-array.c (gfc_array_allocate): Use the token from coarray's
+ .token member.
+ * trans-intrinsic.c (conv_expr_ref_to_caf_ref): Only generate
+ caf-reference chains from the first coarray references on.
+ * trans-types.c (gfc_get_derived_type): Switch on mandatory .token
+ member generation for allocatable arrays in coarrays in derived types.
+
2016-09-29 James Greenhalgh <james.greenhalgh@arm.com>
* options.c (gfc_post_options): Remove special case for
diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c
index 0b97760..50312fe 100644
--- a/gcc/fortran/trans-array.c
+++ b/gcc/fortran/trans-array.c
@@ -5406,7 +5406,6 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
gfc_expr **lower;
gfc_expr **upper;
gfc_ref *ref, *prev_ref = NULL, *coref;
- gfc_se caf_se;
bool allocatable, coarray, dimension, alloc_w_e3_arr_spec = false;
ref = expr->ref;
@@ -5531,7 +5530,6 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
}
}
- gfc_init_se (&caf_se, NULL);
gfc_start_block (&elseblock);
/* Allocate memory to store the data. */
@@ -5543,9 +5541,7 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
if (coarray && flag_coarray == GFC_FCOARRAY_LIB)
{
- tmp = gfc_get_tree_for_caf_expr (expr);
- gfc_get_caf_token_offset (&caf_se, &token, NULL, tmp, NULL_TREE, expr);
- gfc_add_block_to_block (&elseblock, &caf_se.pre);
+ token = gfc_conv_descriptor_token (se->expr);
token = gfc_build_addr_expr (NULL_TREE, token);
}
@@ -5557,7 +5553,6 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg,
else
gfc_allocate_using_malloc (&elseblock, pointer, size, status);
- gfc_add_block_to_block (&elseblock, &caf_se.post);
if (dimension)
{
cond = gfc_unlikely (fold_build2_loc (input_location, NE_EXPR,
diff --git a/gcc/fortran/trans-intrinsic.c b/gcc/fortran/trans-intrinsic.c
index 954f7b3..a499c32 100644
--- a/gcc/fortran/trans-intrinsic.c
+++ b/gcc/fortran/trans-intrinsic.c
@@ -1110,7 +1110,7 @@ compute_component_offset (tree field, tree type)
static tree
conv_expr_ref_to_caf_ref (stmtblock_t *block, gfc_expr *expr)
{
- gfc_ref *ref = expr->ref;
+ gfc_ref *ref = expr->ref, *last_comp_ref;
tree caf_ref = NULL_TREE, prev_caf_ref = NULL_TREE, reference_type, tmp, tmp2,
field, last_type, inner_struct, mode, mode_rhs, dim_array, dim, dim_type,
start, end, stride, vector, nvec;
@@ -1127,8 +1127,29 @@ conv_expr_ref_to_caf_ref (stmtblock_t *block, gfc_expr *expr)
/* Prevent uninit-warning. */
reference_type = NULL_TREE;
- last_type = gfc_typenode_for_spec (&expr->symtree->n.sym->ts);
- last_type_n = expr->symtree->n.sym->ts.type;
+
+ /* Skip refs upto the first coarray-ref. */
+ last_comp_ref = NULL;
+ while (ref && (ref->type != REF_ARRAY || ref->u.ar.codimen == 0))
+ {
+ /* Remember the type of components skipped. */
+ if (ref->type == REF_COMPONENT)
+ last_comp_ref = ref;
+ ref = ref->next;
+ }
+ /* When a component was skipped, get the type information of the last
+ component ref, else get the type from the symbol. */
+ if (last_comp_ref)
+ {
+ last_type = gfc_typenode_for_spec (&last_comp_ref->u.c.component->ts);
+ last_type_n = last_comp_ref->u.c.component->ts.type;
+ }
+ else
+ {
+ last_type = gfc_typenode_for_spec (&expr->symtree->n.sym->ts);
+ last_type_n = expr->symtree->n.sym->ts.type;
+ }
+
while (ref)
{
if (ref->type == REF_ARRAY && ref->u.ar.codimen > 0
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 27a6bab..05122d9 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -2565,7 +2565,8 @@ gfc_get_derived_type (gfc_symbol * derived, bool in_coarray)
if ((!c->attr.pointer && !c->attr.proc_pointer)
|| c->ts.u.derived->backend_decl == NULL)
c->ts.u.derived->backend_decl = gfc_get_derived_type (c->ts.u.derived,
- in_coarray);
+ in_coarray
+ || c->attr.codimension);
if (c->ts.u.derived->attr.is_iso_c)
{