https://gcc.gnu.org/g:e108c4286c66cca613f2416fe63e2e04662ffccd
commit r16-7732-ge108c4286c66cca613f2416fe63e2e04662ffccd Author: Andre Vehreschild <[email protected]> Date: Wed Feb 4 13:40:41 2026 +0100 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. Diff: --- 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 d28d00a03a00..f20e0ea5bde1 100644 --- a/gcc/fortran/resolve.cc +++ b/gcc/fortran/resolve.cc @@ -14271,10 +14271,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; }
