From: Andre Vehreschild Date: Wed, 4 Feb 2026 12:40:41 +0000 (+0100) Subject: Fortran: Fix coarray assignment when rhs is complicated. X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=e108c4286c66cca613f2416fe63e2e04662ffccd;p=thirdparty%2Fgcc.git 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 --git a/gcc/fortran/resolve.cc b/gcc/fortran/resolve.cc index d28d00a03a0..f20e0ea5bde 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; }