mirror of git://gcc.gnu.org/git/gcc.git
Correction régression unlimited_polymorphic_17.f90
This commit is contained in:
parent
38693c4f10
commit
20756fcd7b
|
@ -6590,6 +6590,54 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, gfc_symbol * fsym)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
contiguous_argument (gfc_actual_arglist *arg)
|
||||||
|
{
|
||||||
|
gfc_expr *expr = arg->expr;
|
||||||
|
gfc_dummy_arg *dummy = arg->associated_dummy;
|
||||||
|
|
||||||
|
/* False for intrinsic procedures, the library functions get array
|
||||||
|
descriptors as arguments. */
|
||||||
|
if (expr
|
||||||
|
&& expr->expr_type == EXPR_FUNCTION
|
||||||
|
&& expr->value.function.isym != nullptr)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (dummy->intrinsicness == GFC_INTRINSIC_DUMMY_ARG)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
gcc_assert (dummy->intrinsicness == GFC_NON_INTRINSIC_DUMMY_ARG);
|
||||||
|
|
||||||
|
gfc_symbol *fsym = dummy->u.non_intrinsic->sym;
|
||||||
|
if (!fsym)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* True if the dummy has the allocate or contiguous attribute. */
|
||||||
|
if ((fsym->ts.type == BT_CLASS
|
||||||
|
&& fsym->attr.class_ok
|
||||||
|
&& (CLASS_DATA (fsym)->attr.allocatable
|
||||||
|
|| CLASS_DATA (fsym)->attr.contiguous))
|
||||||
|
|| (fsym->ts.type != BT_CLASS
|
||||||
|
&& (fsym->attr.allocatable
|
||||||
|
|| fsym->attr.contiguous)))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* False if the dummy is assumed-shape or assumed-rank. */
|
||||||
|
if ((fsym->ts.type == BT_CLASS
|
||||||
|
&& CLASS_DATA (fsym)->as
|
||||||
|
&& (CLASS_DATA (fsym)->as->type == AS_ASSUMED_SHAPE
|
||||||
|
|| CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK))
|
||||||
|
|| (fsym->ts.type != BT_CLASS
|
||||||
|
&& fsym->as
|
||||||
|
&& (fsym->as->type == AS_ASSUMED_SHAPE
|
||||||
|
|| fsym->as->type == AS_ASSUMED_RANK)))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/* By default, repacking is done. */
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* Generate code for a procedure call. Note can return se->post != NULL.
|
/* Generate code for a procedure call. Note can return se->post != NULL.
|
||||||
If se->direct_byref is set then se->expr contains the return parameter.
|
If se->direct_byref is set then se->expr contains the return parameter.
|
||||||
Return nonzero, if the call has alternate specifiers.
|
Return nonzero, if the call has alternate specifiers.
|
||||||
|
@ -6860,6 +6908,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
|
||||||
/* The derived type needs to be converted to a temporary
|
/* The derived type needs to be converted to a temporary
|
||||||
CLASS object. */
|
CLASS object. */
|
||||||
gfc_init_se (&parmse, se);
|
gfc_init_se (&parmse, se);
|
||||||
|
if (!contiguous_argument (arg))
|
||||||
|
parmse.bytes_strided = 1;
|
||||||
gfc_conv_derived_to_class (&parmse, e, fsym, NULL_TREE,
|
gfc_conv_derived_to_class (&parmse, e, fsym, NULL_TREE,
|
||||||
fsym->attr.optional
|
fsym->attr.optional
|
||||||
&& e->expr_type == EXPR_VARIABLE
|
&& e->expr_type == EXPR_VARIABLE
|
||||||
|
@ -6877,6 +6927,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
|
||||||
CLASS object for the unlimited polymorphic formal. */
|
CLASS object for the unlimited polymorphic formal. */
|
||||||
gfc_find_vtab (&e->ts);
|
gfc_find_vtab (&e->ts);
|
||||||
gfc_init_se (&parmse, se);
|
gfc_init_se (&parmse, se);
|
||||||
|
if (!contiguous_argument (arg))
|
||||||
|
parmse.bytes_strided = 1;
|
||||||
gfc_conv_intrinsic_to_class (&parmse, e, fsym->ts);
|
gfc_conv_intrinsic_to_class (&parmse, e, fsym->ts);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -6980,18 +7032,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
|
||||||
gfc_ss *argss;
|
gfc_ss *argss;
|
||||||
|
|
||||||
gfc_init_se (&parmse, NULL);
|
gfc_init_se (&parmse, NULL);
|
||||||
if ((expr
|
if (!contiguous_argument (arg))
|
||||||
&& expr->expr_type == EXPR_FUNCTION
|
|
||||||
&& expr->value.function.isym != nullptr)
|
|
||||||
|| (sym
|
|
||||||
&& (sym->attr.proc == PROC_INTRINSIC
|
|
||||||
|| sym->attr.intrinsic))
|
|
||||||
|| (fsym
|
|
||||||
&& fsym->as
|
|
||||||
&& (fsym->as->type == AS_ASSUMED_SHAPE
|
|
||||||
|| fsym->as->type == AS_ASSUMED_RANK)
|
|
||||||
&& !(fsym->attr.allocatable
|
|
||||||
|| fsym->attr.contiguous)))
|
|
||||||
parmse.bytes_strided = 1;
|
parmse.bytes_strided = 1;
|
||||||
|
|
||||||
/* Check whether the expression is a scalar or not; we cannot use
|
/* Check whether the expression is a scalar or not; we cannot use
|
||||||
|
|
Loading…
Reference in New Issue