Re: [PATCH] fortran: Fix up initializers of param(0) PARAMETERs [PR103691]
On 25.03.22 12:34, Jakub Jelinek via Fortran wrote: What is the behavior with a RANGE_EXPR when one has { [0..10] = ++i; }, is that applying the side-effects 11 times or once ? For side effects during the evaluation of expression, Fortran has a clear "if you depend on it, it's your fault" rule. In F 2018, it says 10.1.7 Evaluation of operands 1 It is not necessary for a processor to evaluate all of the operands of an expression, or to evaluate entirely each operand, if the value of the expression can be determined otherwise. Also, the semantics of a(a:b) = expr say that the expression on the LHS is evaluated only once before assignment. So, anything that looks like that should be translated to tmp = ++i; [0..10] = tmp;
Re: [PATCH] fortran: Fix up initializers of param(0) PARAMETERs [PR103691]
> Am 26.03.2022 um 12:28 schrieb Thomas Koenig : > > On 25.03.22 12:34, Jakub Jelinek via Fortran wrote: >> What is the behavior with a RANGE_EXPR when one has { [0..10] = ++i; >> }, is that applying the side-effects 11 times or once ? > > For side effects during the evaluation of expression, Fortran has a > clear "if you depend on it, it's your fault" rule. In F 2018, it says > > 10.1.7 Evaluation of operands > > 1 It is not necessary for a processor to evaluate all of the operands of > an expression, or to evaluate entirely each operand, if the value of the > expression can be determined otherwise. > > Also, the semantics of > > a(a:b) = expr > > say that the expression on the LHS is evaluated only once before > assignment. So, anything that looks like that should be translated > to > > tmp = ++i; > [0..10] = tmp; Note I was not trying to question middle-end semantic here but gfortran se_expr (?) one. Is there a Fortan input where Jakob’s patch would cause a side-effect to be dropped and is that valid? Richard. > >