[Bug fortran/92178] Segmentation fault after passing allocatable array as intent(out) and its element as value into the same subroutine
sgk at troutmask dot apl.washington.edu
gcc-bugzilla@gcc.gnu.org
Tue Oct 22 23:18:00 GMT 2019
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92178
--- Comment #7 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Tue, Oct 22, 2019 at 10:22:42PM +0000, sgk at troutmask dot
apl.washington.edu wrote:
> --- Comment #6 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
> On Tue, Oct 22, 2019 at 09:30:14PM +0000, sgk at troutmask dot
> apl.washington.edu wrote:
> >
> > Cutting the -ftree-dump-original down to the 'call' statement
> > gives
> >
> > MAIN__ ()
> > {
> > {
> > integer(kind=4) D.3955;
> > integer(kind=4) D.3956;
> > integer(kind=4) M.7;
> >
> > D.3955 = (*(integer(kind=4)[0:] * restrict) a.data)[a.offset + 1];
> > D.3956 = D.3955 * D.3955;
> > M.7 = D.3956;
> > M.7 = MIN_EXPR <M.7, 0>;
> > if ((integer(kind=4)[0:] * restrict) a.data != 0B)
> > {
> > __builtin_free ((void *) a.data);
> > (integer(kind=4)[0:] * restrict) a.data = 0B;
> > }
> > assign (M.7, &a);
> > }
> > }
> >
> > which shows the argument evaluation is done correctly. In short,
> > gfortran needs to scan the effective and dummy arguments for a
> > deallocation and just do the right thing.
> >
>
> The evaluation of arguments seems to be done in trans-expr.c
> gfc_conv_procedure_call(), where the argument list is simply
> walked and evaluated. That's not good as this pr shows. :(
>
There is a massive for-loop (lines: 5478-6638) that is used
for the evaluation of arguments. Within those lines, the
blocks 5924-5981, 6071-6111, and 6242-6273 are used to
delete allocated actual args for intent(out) dummy args.
I suspect that those blocks need to be removed, and second
following for-loop should scan the arg list to do the
deallocations.
More information about the Gcc-bugs
mailing list