Ref: https://gcc.gnu.org/pipermail/fortran/2026-February/063551.html
See attached.
Awaiting approval.
From 6efe898d9fd0176457cd71d41acfe9aeec9d9a12 Mon Sep 17 00:00:00 2001
From: Andre Vehreschild <[email protected]>
Date: Wed, 4 Feb 2026 13:40:41 +0100
Subject: [PATCH] Fortran: Fix coarray assignment when rhs is complicated.
PR fortran/121360
gcc/fortran/ChangeLog:
* resolve.cc: Introduce temporary holding rhs when lhs is a
coarray expresssion.
---
gcc/fortran/resolve.cc | 29 ++++++++++++++++++++++++++---
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc
index 655db8a1c9c..2e7d3962194 100644
--- a/gcc/fortran/resolve.cc
+++ b/gcc/fortran/resolve.cc
@@ -14264,10 +14264,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;
}
--
2.53.0