[Patch, Fortran, committed] PR 78592: [7 Regression] ICE in gfc_find_specific_dtio_proc, at fortran/interface.c:4939
Janus Weil
janus@gcc.gnu.org
Sat Dec 17 21:55:00 GMT 2016
Hi Mikael,
>> I have just committed a completely obvious patch for this PR. All it
>> does is rearrange some expressions to avoid an ICE (see attachment):
>>
> I have made a late review of it, and I think it’s not as innocent as it
> seems.
> With it, if the first element’s formal is not properly set, the rest of the
> generic linked list is ignored.
>
> Here is a variant of the testcase committed.
> It shows no error if the module procedure line is commented, and two errors
> if it’s uncommented, one error saying that the write of z2 should use DTIO.
> The latter error should not appear.
thanks for the comment, and sorry that I didn't notice this problem.
The attached patch should fix it. What do you think about it?
Btw, with trunk r243776 I get an ICE on your test case, when the
module procedure is commented out. You don't see this?
Cheers,
Janus
> program p
> type t
> end type
> type(t) :: z
> type, extends(t) :: t2
> end type
> class(t2), allocatable :: z2
> interface write(formatted)
> procedure wf2
> module procedure wf ! error
> end interface
> print *, z
> allocate(z2)
> print *, z2 ! spurious error
> contains
> subroutine wf2(this, a, b, c, d, e)
> class(t2), intent(in) :: this
> integer, intent(in) :: a
> character, intent(in) :: b
> integer, intent(in) :: c(:)
> integer, intent(out) :: d
> character, intent(inout) :: e
> end subroutine wf2
> end
>
>
>
>>
>> pr78592.diff
>>
>> Index: gcc/fortran/interface.c
>> ===================================================================
>> --- gcc/fortran/interface.c (revision 243004)
>> +++ gcc/fortran/interface.c (working copy)
>> @@ -4933,15 +4933,15 @@ gfc_find_specific_dtio_proc (gfc_symbol *derived,
>> && tb_io_st->n.sym
>> && tb_io_st->n.sym->generic)
>> {
>> - gfc_interface *intr;
>> - for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
>> + for (gfc_interface *intr = tb_io_st->n.sym->generic;
>> + intr && intr->sym && intr->sym->formal;
>> + intr = intr->next)
>> {
>> gfc_symbol *fsym = intr->sym->formal->sym;
>> - if (intr->sym && intr->sym->formal
>> - && ((fsym->ts.type == BT_CLASS
>> - && CLASS_DATA (fsym)->ts.u.derived == extended)
>> - || (fsym->ts.type == BT_DERIVED
>> - && fsym->ts.u.derived == extended)))
>> + if ((fsym->ts.type == BT_CLASS
>> + && CLASS_DATA (fsym)->ts.u.derived == extended)
>> + || (fsym->ts.type == BT_DERIVED
>> + && fsym->ts.u.derived == extended))
>> {
>> dtio_sub = intr->sym;
>> break;
>
>
-------------- next part --------------
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c (revision 243776)
+++ gcc/fortran/interface.c (working copy)
@@ -4949,17 +4949,19 @@ gfc_find_specific_dtio_proc (gfc_symbol *derived,
&& tb_io_st->n.sym->generic)
{
for (gfc_interface *intr = tb_io_st->n.sym->generic;
- intr && intr->sym && intr->sym->formal;
- intr = intr->next)
+ intr && intr->sym; intr = intr->next)
{
- gfc_symbol *fsym = intr->sym->formal->sym;
- if ((fsym->ts.type == BT_CLASS
- && CLASS_DATA (fsym)->ts.u.derived == extended)
- || (fsym->ts.type == BT_DERIVED
- && fsym->ts.u.derived == extended))
+ if (intr->sym->formal)
{
- dtio_sub = intr->sym;
- break;
+ gfc_symbol *fsym = intr->sym->formal->sym;
+ if ((fsym->ts.type == BT_CLASS
+ && CLASS_DATA (fsym)->ts.u.derived == extended)
+ || (fsym->ts.type == BT_DERIVED
+ && fsym->ts.u.derived == extended))
+ {
+ dtio_sub = intr->sym;
+ break;
+ }
}
}
}
More information about the Gcc-patches
mailing list