Re: Fortran patch ping (Re: [PATCH] fortran: Fix ICE with loops with (deprecated) non-integral iterators [PR126303])
Jerry D <[email protected]> Mon, 27 Jul 2026 09:09:22 -0700
| Newsgroups | gmane.comp.gcc.patches,gmane.comp.gcc.fortran |
|---|---|
| Message-ID | <[email protected]> |
LGTM, thanks for the patch.
Jerry
On 7/27/26 2:59 AM, Jakub Jelinek wrote:
> Hi!
>
> On Mon, Jul 20, 2026 at 09:18:48AM +0200, Jakub Jelinek wrote:
>> 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.
>>
>> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk and
>> affected release branches (I think 14+, the patch has been backported)?
>
> I'd like to ping this patch
> https://gcc.gnu.org/pipermail/fortran/2026-July/064347.html
>
> Thanks.
>
>> 2026-07-20 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.
>
> Jakub
>