[Bug fortran/126303] [13/14/15/16/17 Regression] ICE in gmp with non-integral loop iterator since r15-11154

"cvs-commit at gcc dot gnu.org via Gcc-bugs" <[email protected]>
Newsgroups gmane.comp.gcc.bugs
Message-ID <[email protected]/bugzilla/>
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=126303

--- Comment #4 from GCC Commits <cvs-commit at gcc dot gnu.org> ---
The releases/gcc-16 branch has been updated by Jakub Jelinek
<[email protected]>:

https://gcc.gnu.org/g:0a9e52931016938c35f9944acc870650f3e8492f

commit r16-9416-g0a9e52931016938c35f9944acc870650f3e8492f
Author: Jakub Jelinek <[email protected]>
Date:   Mon Jul 27 18:54:37 2026 +0200

    fortran: Fix ICE with loops with (deprecated) non-integral iterators
[PR126303]

    do_subscript contains
                  do_sym = dl->ext.iterator->var->symtree->n.sym;
                  if (do_sym->ts.type != BT_INTEGER)
                    continue;
    check to ignore loops with non-integral iterator.  But r15-11154
    PR94978 change has added inner_loop_may_be_skipped function and that
    happily accesses inner loop iterator's step, start and end if EXPR_CONSTANT
    with mpz_init_set (..., ...value.integer);
    Now, given the layout of mpfr_t (usually long, int, long, pointer)
    and mpz_t (usually int, int, pointer), this sometimes just produces
silently
    garbage (e.g. on 64-bit little-endian, where the second int in mpz_t is
    the most significant 32-bits of _mpfr_prec and so usually 0 and so _mp_size
    is 0 and nothing is dereferenced:
    p loop->ext.iterator->step.value.real
    $1 = {{_mpfr_prec = 24, _mpfr_sign = 1, _mpfr_exp = 1, _mpfr_d =
0x4eac658}}
    p loop->ext.iterator->step.value.integer
    $2 = {{_mp_alloc = 24, _mp_size = 0, _mp_d = 0x1}}
    or it ICEs somewhere in gmp (on 32-bit little-endian, e.g. i686, or
    big-endian, e.g. s390x), because _mp_size is in that case _mpfr_sign but
    _mp_d is _mpfr_exp (32-bit little-endian), or _mp_size is least significant
    part of _mpfr_prec, in both cases non-zero, but _mp_d is not a usable
    pointer in either case.

    The following patch fixes that by punting for inner loops with non-integral
    iterator.

    2026-07-27  Jakub Jelinek  <[email protected]>

            PR fortran/126303
            * frontend-passes.cc (inner_loop_may_be_skipped): If inner loop
iterator
            is not integral, return true.

            * gfortran.dg/pr126303.f: New test.

    Reviewed-by: Jerry DeLisle <[email protected]>
    (cherry picked from commit 822ce7e451fdbbeeca2df5d8ddbdf6bccc254abb)
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.