Index: check.c =================================================================== --- check.c (Revision 161784) +++ check.c (Arbeitskopie) @@ -473,12 +473,34 @@ dim_rank_check (gfc_expr *dim, gfc_expr *array, in if (dim == NULL) return SUCCESS; - if (dim->expr_type != EXPR_CONSTANT - || (array->expr_type != EXPR_VARIABLE - && array->expr_type != EXPR_ARRAY)) + if (dim->expr_type != EXPR_CONSTANT) return SUCCESS; - rank = array->rank; + if (array->expr_type == EXPR_FUNCTION && array->value.function.isym) + { + + /* Functions which reduce the rank of their arguments. */ + switch(array->value.function.isym->id) + { + case GFC_ISYM_SUM: + case GFC_ISYM_PRODUCT: + case GFC_ISYM_ANY: + case GFC_ISYM_ALL: + case GFC_ISYM_COUNT: + case GFC_ISYM_MINVAL: + case GFC_ISYM_MAXVAL: + rank = array->rank + 1; + break; + + default: + rank = array->rank; + } + } + else + { + rank = array->rank; + } + if (array->expr_type == EXPR_VARIABLE) { ar = gfc_find_array_ref (array);