Le 07/10/2022 à 20:46, Harald Anlauf a écrit :
OK, that is because reduce_binary dispatches the reduce_binary_*. We could move the check from reduce_binary_aa to the beginning of reduce_binary, as with the following change on top of the patch: diff --git a/gcc/fortran/arith.cc b/gcc/fortran/arith.cc index 2c57c796270..91e70655ad3 100644 --- a/gcc/fortran/arith.cc +++ b/gcc/fortran/arith.cc @@ -1426,10 +1426,6 @@ reduce_binary_aa (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), if (!gfc_check_conformance (op1, op2, _("elemental binary operation"))) return ARITH_INCOMMENSURATE; - if ((op1->expr_type == EXPR_OP && op1->ts.type == BT_UNKNOWN) - || (op2->expr_type == EXPR_OP && op2->ts.type == BT_UNKNOWN)) - return ARITH_INVALID_TYPE; - head = gfc_constructor_copy (op1->value.constructor); for (c = gfc_constructor_first (head), d = gfc_constructor_first (op2->value.constructor); @@ -1467,6 +1463,10 @@ static arith reduce_binary (arith (*eval) (gfc_expr *, gfc_expr *, gfc_expr **), gfc_expr *op1, gfc_expr *op2, gfc_expr **result) { + if ((op1->expr_type == EXPR_OP && op1->ts.type == BT_UNKNOWN) + || (op2->expr_type == EXPR_OP && op2->ts.type == BT_UNKNOWN)) + return ARITH_INVALID_TYPE; + if (op1->expr_type == EXPR_CONSTANT && op2->expr_type == EXPR_CONSTANT) return eval (op1, op2, result); However, we cannot remove the checks from reduce_binary_ac or reduce_binary_ca, as the lengthy testcase proves... Do you like the above better?
Yes, definitely, but some less important weirdness remains; the scalar vs array function catches scalar vs invalid scalar cases. Let me have a look.