Commit 3d333a28 by Tobias Burnus Committed by Tobias Burnus

trans-expr.c (gfc_conv_procedure_call): Fix handling of polymorphic arguments.

2012-07-19  Tobias Burnus  <burnus@net-b.de>

        * trans-expr.c (gfc_conv_procedure_call): Fix handling
        of polymorphic arguments.
        * resolve.c (resolve_formal_arglist): Ditto, mark polymorphic
        assumed-shape arrays as such.

From-SVN: r189678
parent a73b8b59
2012-07-19 Tobias Burnus <burnus@net-b.de> 2012-07-19 Tobias Burnus <burnus@net-b.de>
* trans-expr.c (gfc_conv_procedure_call): Fix handling
of polymorphic arguments.
* resolve.c (resolve_formal_arglist): Ditto, mark polymorphic
assumed-shape arrays as such.
2012-07-19 Tobias Burnus <burnus@net-b.de>
* interface.c (compare_parameter, compare_actual_formal): Fix * interface.c (compare_parameter, compare_actual_formal): Fix
handling of polymorphic arguments. handling of polymorphic arguments.
......
...@@ -251,6 +251,7 @@ resolve_formal_arglist (gfc_symbol *proc) ...@@ -251,6 +251,7 @@ resolve_formal_arglist (gfc_symbol *proc)
for (f = proc->formal; f; f = f->next) for (f = proc->formal; f; f = f->next)
{ {
sym = f->sym; sym = f->sym;
gfc_array_spec *as;
if (sym == NULL) if (sym == NULL)
{ {
...@@ -284,23 +285,33 @@ resolve_formal_arglist (gfc_symbol *proc) ...@@ -284,23 +285,33 @@ resolve_formal_arglist (gfc_symbol *proc)
gfc_set_default_type (sym, 1, sym->ns); gfc_set_default_type (sym, 1, sym->ns);
} }
gfc_resolve_array_spec (sym->as, 0); as = sym->ts.type == BT_CLASS && sym->attr.class_ok
? CLASS_DATA (sym)->as : sym->as;
gfc_resolve_array_spec (as, 0);
/* We can't tell if an array with dimension (:) is assumed or deferred /* We can't tell if an array with dimension (:) is assumed or deferred
shape until we know if it has the pointer or allocatable attributes. shape until we know if it has the pointer or allocatable attributes.
*/ */
if (sym->as && sym->as->rank > 0 && sym->as->type == AS_DEFERRED if (as && as->rank > 0 && as->type == AS_DEFERRED
&& !(sym->attr.pointer || sym->attr.allocatable) && ((sym->ts.type != BT_CLASS
&& !(sym->attr.pointer || sym->attr.allocatable))
|| (sym->ts.type == BT_CLASS
&& !(CLASS_DATA (sym)->attr.class_pointer
|| CLASS_DATA (sym)->attr.allocatable)))
&& sym->attr.flavor != FL_PROCEDURE) && sym->attr.flavor != FL_PROCEDURE)
{ {
sym->as->type = AS_ASSUMED_SHAPE; as->type = AS_ASSUMED_SHAPE;
for (i = 0; i < sym->as->rank; i++) for (i = 0; i < as->rank; i++)
sym->as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, as->lower[i] = gfc_get_int_expr (gfc_default_integer_kind, NULL, 1);
NULL, 1);
} }
if ((sym->as && sym->as->rank > 0 && sym->as->type == AS_ASSUMED_SHAPE) if ((as && as->rank > 0 && as->type == AS_ASSUMED_SHAPE)
|| sym->attr.pointer || sym->attr.allocatable || sym->attr.target || sym->attr.pointer || sym->attr.allocatable || sym->attr.target
|| (sym->ts.type == BT_CLASS && sym->attr.class_ok
&& (CLASS_DATA (sym)->attr.class_pointer
|| CLASS_DATA (sym)->attr.allocatable
|| CLASS_DATA (sym)->attr.target))
|| sym->attr.optional) || sym->attr.optional)
{ {
proc->attr.always_explicit = 1; proc->attr.always_explicit = 1;
......
...@@ -3620,10 +3620,15 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, ...@@ -3620,10 +3620,15 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
parmse.string_length = build_int_cst (gfc_charlen_type_node, 0); parmse.string_length = build_int_cst (gfc_charlen_type_node, 0);
} }
} }
else if (arg->expr->expr_type == EXPR_NULL && fsym && !fsym->attr.pointer) else if (arg->expr->expr_type == EXPR_NULL
&& fsym && !fsym->attr.pointer
&& (fsym->ts.type != BT_CLASS
|| !CLASS_DATA (fsym)->attr.class_pointer))
{ {
/* Pass a NULL pointer to denote an absent arg. */ /* Pass a NULL pointer to denote an absent arg. */
gcc_assert (fsym->attr.optional && !fsym->attr.allocatable); gcc_assert (fsym->attr.optional && !fsym->attr.allocatable
&& (fsym->ts.type != BT_CLASS
|| !CLASS_DATA (fsym)->attr.allocatable));
gfc_init_se (&parmse, NULL); gfc_init_se (&parmse, NULL);
parmse.expr = null_pointer_node; parmse.expr = null_pointer_node;
if (arg->missing_arg_type == BT_CHARACTER) if (arg->missing_arg_type == BT_CHARACTER)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment