summaryrefslogtreecommitdiff
path: root/gcc/fortran/check.c
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@aei.mpg.de>2004-08-19 15:31:37 +0000
committerTobias Schlüter <tobi@gcc.gnu.org>2004-08-19 17:31:37 +0200
commit7551270e1b6232a38f772eb9298ddbe0aa970918 (patch)
tree871485f596b59597d459e94b7923a9f6e469f77b /gcc/fortran/check.c
parente281c0f884086d2247f9411f676c1f3f9e3058b0 (diff)
downloadgcc-7551270e1b6232a38f772eb9298ddbe0aa970918.tar.gz
re PR fortran/16946 (sum (array, mask) is not accepted)
fortran/ PR fortran/16946 * check.c (gfc_check_reduction): New function. (gfc_check_minval_maxval): Removed. (gfc_check_product): Removed. (gfc_check_sum): Removed. * intrinsic.h: Add/remove declarations for these. * gfortran.h: Add field f3red to union gfc_check_f. * intrinsic.c (add_sym_3red): New function. (add_functions): Register maxval, minval, product, and sum intrinsics through add_sym_3red. (check_specific): Handle f3red union field. * iresolve.c: Whitespace change. testsuite/ PR fortran/16946 * gfortran.dg/reduction.f90: New testcase. From-SVN: r86255
Diffstat (limited to 'gcc/fortran/check.c')
-rw-r--r--gcc/fortran/check.c82
1 files changed, 36 insertions, 46 deletions
diff --git a/gcc/fortran/check.c b/gcc/fortran/check.c
index 9a82d889371..aff024a5874 100644
--- a/gcc/fortran/check.c
+++ b/gcc/fortran/check.c
@@ -1135,20 +1135,50 @@ gfc_check_minloc_maxloc (gfc_actual_arglist * ap)
}
+/* Similar to minloc/maxloc, the argument list might need to be
+ reordered for the MINVAL, MAXVAL, PRODUCT, and SUM intrinsics. The
+ difference is that MINLOC/MAXLOC take an additional KIND argument.
+ The possibilities are:
+
+ Arg #2 Arg #3
+ NULL NULL
+ DIM NULL
+ MASK NULL
+ NULL MASK minval(array, mask=m)
+ DIM MASK
+
+ I.e. in the case of minval(array,mask), mask will be in the second
+ position of the argument list and we'll have to fix that up. */
+
try
-gfc_check_minval_maxval (gfc_expr * array, gfc_expr * dim, gfc_expr * mask)
+gfc_check_reduction (gfc_actual_arglist * ap)
{
+ gfc_expr *a, *m, *d;
- if (array_check (array, 0) == FAILURE)
+ a = ap->expr;
+ if (int_or_real_check (a, 0) == FAILURE
+ || array_check (a, 0) == FAILURE)
return FAILURE;
- if (int_or_real_check (array, 0) == FAILURE)
- return FAILURE;
+ d = ap->next->expr;
+ m = ap->next->next->expr;
- if (dim_check (dim, 1, 1) == FAILURE)
+ if (m == NULL && d != NULL && d->ts.type == BT_LOGICAL
+ && ap->next->name[0] == '\0')
+ {
+ m = d;
+ d = NULL;
+
+ ap->next->expr = NULL;
+ ap->next->next->expr = m;
+ }
+
+ if (d != NULL
+ && (scalar_check (d, 1) == FAILURE
+ || type_check (d, 1, BT_INTEGER) == FAILURE))
return FAILURE;
- if (mask != NULL && logical_array_check (mask, 2) == FAILURE)
+ if (m != NULL && type_check (m, 2, BT_LOGICAL) == FAILURE)
return FAILURE;
return SUCCESS;
@@ -1277,26 +1307,6 @@ gfc_check_present (gfc_expr * a)
try
-gfc_check_product (gfc_expr * array, gfc_expr * dim, gfc_expr * mask)
-{
-
- if (array_check (array, 0) == FAILURE)
- return FAILURE;
-
- if (numeric_check (array, 0) == FAILURE)
- return FAILURE;
-
- if (dim_check (dim, 1, 1) == FAILURE)
- return FAILURE;
-
- if (mask != NULL && logical_array_check (mask, 2) == FAILURE)
- return FAILURE;
-
- return SUCCESS;
-}
-
-
-try
gfc_check_radix (gfc_expr * x)
{
@@ -1553,26 +1563,6 @@ gfc_check_spread (gfc_expr * source, gfc_expr * dim, gfc_expr * ncopies)
try
-gfc_check_sum (gfc_expr * array, gfc_expr * dim, gfc_expr * mask)
-{
-
- if (array_check (array, 0) == FAILURE)
- return FAILURE;
-
- if (numeric_check (array, 0) == FAILURE)
- return FAILURE;
-
- if (dim_check (dim, 1, 1) == FAILURE)
- return FAILURE;
-
- if (mask != NULL && logical_array_check (mask, 2) == FAILURE)
- return FAILURE;
-
- return SUCCESS;
-}
-
-
-try
gfc_check_transfer (gfc_expr * source ATTRIBUTE_UNUSED,
gfc_expr * mold ATTRIBUTE_UNUSED,
gfc_expr * size)