On Wed, Oct 22, 2025 at 12:27 AM Andre Vehreschild <[email protected]> wrote:
>
> Hi Yuao,
>
> sorry for not telling you earlier, but there is
>
> tree *gfc_trans_force_lval (block *, tree *val);
>
> which just ensures that the tree pointed to by val is an expression a lvalue
> can be taken off. I.e. if it is already a variable or the like, nothing
> happens, but when not, then a temporary is created. Please have a look. Maybe
> for future use, it may shorten some code.
It is indeed simpler. I have used this api to update the patch.
diff --git a/gcc/fortran/trans-const.cc b/gcc/fortran/trans-const.cc
index f70f36284a3..966a837c25c 100644
--- a/gcc/fortran/trans-const.cc
+++ b/gcc/fortran/trans-const.cc
@@ -444,6 +444,10 @@ gfc_conv_constant (gfc_se * se, gfc_expr * expr)
if (expr->ts.type == BT_CHARACTER)
gfc_conv_string_parameter (se);
else
- se->expr = gfc_build_addr_expr (NULL_TREE, se->expr);
+ {
+ se->expr
+ = gfc_build_addr_expr (NULL_TREE,
+ gfc_trans_force_lval (&se->pre, se->expr));
+ }
}
}
diff --git a/gcc/testsuite/gfortran.dg/coarray_atomic_5.f90
b/gcc/testsuite/gfortran.dg/coarray_atomic_5.f90
index 70c3d2ff4eb..b37c11def23 100644
--- a/gcc/testsuite/gfortran.dg/coarray_atomic_5.f90
+++ b/gcc/testsuite/gfortran.dg/coarray_atomic_5.f90
@@ -19,7 +19,7 @@ program atomic
write(*,*) me
end program
-! { dg-final { scan-tree-dump-times "value.. = 0;" 1 "original" } }
-! { dg-final { scan-tree-dump-times "_gfortran_caf_atomic_define
\\(caf_token.., 0, 1, &value.., 0B, 1, 4\\);" 1 "original" } }
+! { dg-final { scan-tree-dump-times "D.\[0-9\]+ = 0;" 1 "original" } }
+! { dg-final { scan-tree-dump-times "_gfortran_caf_atomic_define
\\(caf_token.., 0, 1, &D.\[0-9\]+, 0B, 1, 4\\);" 1 "original" } }
! { dg-final { scan-tree-dump-times "_gfortran_caf_atomic_op \\(1,
caf_token.., 0, 1, &me, 0B, 0B, 1, 4\\);" 1 "original" } }
! { dg-final { scan-tree-dump-times "_gfortran_caf_atomic_ref
\\(caf_token.., 0, 1, &me, 0B, 1, 4\\);" 1 "original" } }
Thanks,
Yuao