]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix coarray assignment when rhs is complicated.
authorAndre Vehreschild <vehre@gcc.gnu.org>
Wed, 4 Feb 2026 12:40:41 +0000 (13:40 +0100)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 26 Feb 2026 17:18:24 +0000 (09:18 -0800)
PR fortran/121360

gcc/fortran/ChangeLog:

* resolve.cc: Introduce temporary holding rhs when lhs is a
coarray expresssion.

gcc/fortran/resolve.cc

index d28d00a03a00d7531b9d634c34da17b015a57a8e..f20e0ea5bde10649b4d7d14e3eccbd77481bcaa6 100644 (file)
@@ -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;
            }