aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c25
1 files changed, 20 insertions, 5 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index fce2322..1e57add 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -1657,18 +1657,33 @@ resolve_call (gfc_code * c)
gfc_internal_error ("resolve_subroutine(): bad function type");
}
+ /* Some checks of elemental subroutines. */
if (c->ext.actual != NULL
&& c->symtree->n.sym->attr.elemental)
{
gfc_actual_arglist * a;
- /* Being elemental, the last upper bound of an assumed size array
- argument must be present. */
+ gfc_expr * e;
+ e = NULL;
+
for (a = c->ext.actual; a; a = a->next)
{
- if (a->expr != NULL
- && a->expr->rank > 0
- && resolve_assumed_size_actual (a->expr))
+ if (a->expr == NULL || a->expr->rank == 0)
+ continue;
+
+ /* The last upper bound of an assumed size array argument must
+ be present. */
+ if (resolve_assumed_size_actual (a->expr))
return FAILURE;
+
+ /* Array actual arguments must conform. */
+ if (e != NULL)
+ {
+ if (gfc_check_conformance ("elemental subroutine", a->expr, e)
+ == FAILURE)
+ return FAILURE;
+ }
+ else
+ e = a->expr;
}
}