[PATCH 11/13] Coarray shared memory library
Jerry D <[email protected]>
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
Dear all, as requested, See attached patch 11 of 13 Best Regards, Jerry
pr88076_v4_11.diff
(text/x-patch, 1.6 KB)
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; }