Hi Mikail, Yes to this third patch as well. I haven't had time to track them down but there are other places where code has had to be inserted to prevent non-polymorphic references in a polymorphic way. I wonder if they cannot be unified at some time?
All three can be pushed to mainline. Many thanks for the, as usual, impeccable crafting and excellent explanations. Paul On Sat, 26 Jul 2025 at 20:27, Mikael Morin <morin-mik...@orange.fr> wrote: > From: Mikael Morin <mik...@gcc.gnu.org> > > Regression-tested on x86_64-pc-linux-gnu. > OK for master? > > -- >8 -- > > This is a follow-up to: > r16-2248-gac8e536526393580bc9a4339bab2f8603eff8a47 > fortran: Delay evaluation of array bounds after reallocation > > That revision delayed the evaluation of array bounds, with changes in > two places: in the scalarizer where we save expressions without > evaluating their values to variables, and in the reallocation code where > we evaluate to variables the expressions previously saved. The effect > should not have been visible in scalarized code, as the saving to a > variable was only delayed after reallocation. > > Unfortunately, it's actually not the case, and there are cases where > expressions that were saved to variables before the change, are no > longer after it. The reason for that is differing conditions guarding > the omission of the evaluation to variables in the scalarizer on one > hand, and the emission of reallocation code with the saving to variables > on the other hand. There is an additional check that avoids the > emission of reallocation code if we can prove at compile time that both > sides of the assignment are conformable. > > This change moves up the reallocation code condition definition, so that > it can be used as well to flag the left hand side array as > reallocatable, and omit the evaluation of expressions in the exact same > conditions where the reallocation code would catch those unevaluated > expressions. > > An explicit call to gfc_fix_class_refs is added before the evaluation of > the reallocation code condition. It was implicit before, by the call to > gfc_walk_expr. > > This is not a correctness issue, but PR #121185, that made the problem > apparent, exhibited wrong code examples where the lack of an > intermediary variable was making visible a class container at the > beginning of an array reference, causing the non-polymorphic array > reference to be evaluated in a polymorphic way. > > The preceding commits have already fixed the PR #121185 test, so I > haven't found any addition to the testsuite that would reliably test > this change. > > PR fortran/121185 > > gcc/fortran/ChangeLog: > > * trans-expr.cc (gfc_trans_assignment_1): Use the same condition > to set the is_alloc_lhs flag and to decide to generate > reallocation code. Add explicit call to gfc_fix_class_refs > before evaluating the condition. > --- > gcc/fortran/trans-expr.cc | 14 ++++++++------ > 1 file changed, 8 insertions(+), 6 deletions(-) > > diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc > index 6cb2b677937..0db7ba3fd52 100644 > --- a/gcc/fortran/trans-expr.cc > +++ b/gcc/fortran/trans-expr.cc > @@ -12892,9 +12892,16 @@ gfc_trans_assignment_1 (gfc_expr * expr1, > gfc_expr * expr2, bool init_flag, > gfc_init_se (&lse, NULL); > gfc_init_se (&rse, NULL); > > + gfc_fix_class_refs (expr1); > + > + realloc_flag = flag_realloc_lhs > + && gfc_is_reallocatable_lhs (expr1) > + && expr2->rank > + && !is_runtime_conformable (expr1, expr2); > + > /* Walk the lhs. */ > lss = gfc_walk_expr (expr1); > - if (gfc_is_reallocatable_lhs (expr1)) > + if (realloc_flag) > { > lss->no_bounds_check = 1; > lss->is_alloc_lhs = 1; > @@ -12945,11 +12952,6 @@ gfc_trans_assignment_1 (gfc_expr * expr1, > gfc_expr * expr2, bool init_flag, > > assoc_assign = is_assoc_assign (expr1, expr2); > > - realloc_flag = flag_realloc_lhs > - && gfc_is_reallocatable_lhs (expr1) > - && expr2->rank > - && !is_runtime_conformable (expr1, expr2); > - > /* Only analyze the expressions for coarray properties, when in > coarray-lib > mode. Avoid false-positive uninitialized diagnostics with > initializing > the codimension flag unconditionally. */ > -- > 2.47.2 > >