mirror of git://gcc.gnu.org/git/gcc.git
Correction régression coarray_alloc_comp_7.f08
This commit is contained in:
parent
d3aa492ac9
commit
14a9ed3a8c
|
@ -1264,6 +1264,70 @@ contiguous_coarray (gfc_expr *expr)
|
||||||
gcc_unreachable ();
|
gcc_unreachable ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
contiguous_array (gfc_expr *expr)
|
||||||
|
{
|
||||||
|
gfc_ref *ref;
|
||||||
|
|
||||||
|
gcc_assert (expr && expr->expr_type == EXPR_VARIABLE);
|
||||||
|
|
||||||
|
bool contiguous = true;
|
||||||
|
if (expr->symtree->n.sym->ts.type == BT_CLASS
|
||||||
|
&& CLASS_DATA (expr->symtree->n.sym)->attr.dimension)
|
||||||
|
contiguous = false;
|
||||||
|
else if (expr->symtree->n.sym->attr.dimension)
|
||||||
|
{
|
||||||
|
gfc_symbol *sym = expr->symtree->n.sym;
|
||||||
|
if (sym->attr.pointer)
|
||||||
|
contiguous = false;
|
||||||
|
|
||||||
|
else if (sym->as
|
||||||
|
&& (sym->as->type == AS_ASSUMED_SHAPE
|
||||||
|
|| sym->as->type == AS_ASSUMED_RANK))
|
||||||
|
contiguous = false;
|
||||||
|
|
||||||
|
else if (!sym->assoc)
|
||||||
|
contiguous = true;
|
||||||
|
|
||||||
|
else if (sym->assoc->dangling)
|
||||||
|
contiguous = false;
|
||||||
|
|
||||||
|
else if (!sym->assoc->variable)
|
||||||
|
contiguous = true;
|
||||||
|
|
||||||
|
else
|
||||||
|
contiguous = contiguous_coarray (sym->assoc->target);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool seen_array = false;
|
||||||
|
for (ref = expr->ref; ref; ref = ref->next)
|
||||||
|
{
|
||||||
|
if (ref->type == REF_ARRAY
|
||||||
|
&& ref->u.ar.type != AR_ELEMENT)
|
||||||
|
seen_array = true;
|
||||||
|
|
||||||
|
if (seen_array
|
||||||
|
&& (ref->type == REF_COMPONENT
|
||||||
|
|| ref->type == REF_SUBSTRING))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (ref->type == REF_COMPONENT)
|
||||||
|
{
|
||||||
|
gfc_component *comp = ref->u.c.component;
|
||||||
|
if (comp->ts.type == BT_CLASS
|
||||||
|
&& CLASS_DATA (comp)->attr.dimension)
|
||||||
|
contiguous = false;
|
||||||
|
|
||||||
|
else if (comp->attr.codimension)
|
||||||
|
contiguous = !comp->attr.pointer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return contiguous;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Get data from a remote coarray. */
|
/* Get data from a remote coarray. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -1584,7 +1648,7 @@ conv_caf_send_to_remote (gfc_code *code)
|
||||||
{
|
{
|
||||||
rhs_se.force_tmp = rhs_expr->shape == NULL
|
rhs_se.force_tmp = rhs_expr->shape == NULL
|
||||||
|| !gfc_is_simply_contiguous (rhs_expr, false, false);
|
|| !gfc_is_simply_contiguous (rhs_expr, false, false);
|
||||||
rhs_se.bytes_strided = 1;
|
rhs_se.bytes_strided = !contiguous_array (rhs_expr);
|
||||||
gfc_conv_expr_descriptor (&rhs_se, rhs_expr);
|
gfc_conv_expr_descriptor (&rhs_se, rhs_expr);
|
||||||
gfc_add_block_to_block (&block, &rhs_se.pre);
|
gfc_add_block_to_block (&block, &rhs_se.pre);
|
||||||
opt_rhs_desc = rhs_se.expr;
|
opt_rhs_desc = rhs_se.expr;
|
||||||
|
|
Loading…
Reference in New Issue