Dear all, as requested,
See attached patch 11 of 13
Best Regards,
Jerry
commit d16a5d94d6f35dd0d6e9499c09d6381b89446673
Author: Andre Vehreschild <[email protected]>
Date: Wed Feb 4 13:40:41 2026 +0100
Fortran: Fix coarray assignment when rhs is complicated.
gcc/fortran/ChangeLog:
* resolve.cc: Introduce temporary holding rhs when lhs is a
coarray expresssion.
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index e5b36234d7e..a7b31e14c56 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -14247,10 +14247,33 @@ start:
code->ext.actual = gfc_get_actual_arglist ();
code->ext.actual->expr = code->expr1;
code->ext.actual->next = gfc_get_actual_arglist ();
- code->ext.actual->next->expr = code->expr2;
+ if (code->expr2->expr_type != EXPR_VARIABLE
+ && code->expr2->expr_type != EXPR_CONSTANT)
+ {
+ /* Convert assignments of expr1[...] = expr2 into
+ tvar = expr2
+ expr1[...] = tvar
+ when expr2 is not trivial. */
+ gfc_expr *tvar = get_temp_from_expr (code->expr2, ns);
+ gfc_code next_code = *code;
+ gfc_code *rhs_code
+ = build_assignment (EXEC_ASSIGN, tvar, code->expr2, NULL,
+ NULL, code->expr2->where);
+ *code = *rhs_code;
+ code->next = rhs_code;
+ *rhs_code = next_code;
+
+ rhs_code->ext.actual->next->expr = tvar;
+ rhs_code->expr1 = NULL;
+ rhs_code->expr2 = NULL;
+ }
+ else
+ {
+ code->ext.actual->next->expr = code->expr2;
- code->expr1 = NULL;
- code->expr2 = NULL;
+ code->expr1 = NULL;
+ code->expr2 = NULL;
+ }
break;
}