https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125192

Mikael Morin <mikael at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |mikael at gcc dot 
gnu.org

--- Comment #5 from Mikael Morin <mikael at gcc dot gnu.org> ---
(In reply to anlauf from comment #3)
> Might be related to PR124661.

(In reply to anlauf from comment #4)
> Mikael, can you please have a look at this one?

Indeed, this is a fallout of:
    r16-2371-g8f41c87654fd819e48c9f6f1ac3d87e35794d310
    fortran: Factor array descriptor references
similar to PR124661.
Once again the new variable is used before it is defined.

In this case, gfc_conv_expr_descriptor's bound checking adds code to the root
block, but the array descriptor is defined by the scalarizer, so it's defined
in the loop block which is appended to the root block at the end.

Draft patch:

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 4ab1d04440d..d633d70e707 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8639,7 +8639,12 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)

   /* Add bounds-checking for elemental dimensions.  */
   if ((gfc_option.rtcheck & GFC_RTCHECK_BOUNDS) && !expr->no_bounds_check)
-    array_bound_check_elemental (se, ss, expr);
+    {
+      gfc_se bnd_ck_se;
+      gfc_init_se (&bnd_ck_se, nullptr);
+      array_bound_check_elemental (&bnd_ck_se, ss, expr);
+      gfc_add_block_to_block (&outermost_loop (&loop)->pre, &bnd_ck_se.pre);
+    }

   if (need_tmp)
     {


Taking.

Reply via email to