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

--- Comment #5 from Steve Kargl <sgk at troutmask dot apl.washington.edu> ---
On Thu, Feb 22, 2018 at 12:08:24AM +0000, sgk at troutmask dot
apl.washington.edu wrote:
> program TestInquire
>    implicit none
>    integer(8) :: iUnit
>    integer(8) :: iPos
>    open(newunit=iunit, file='output.txt', access='stream', status='replace')
>    write(iUnit) 'TEXT'
>    inquire(iUnit, pos=iPos)
>    print *, iPos
> end program TestInquire
> 

It related to the automatic allocate of UNIT numbers with NEWUNIT.

If I do 

   iunit = 10
   open(unit=iunit, file='output.txt', access='stream', status='replace')

One gets the right answer.

Looking in io/inquire.c, one has 

void
st_inquire (st_parameter_inquire *iqp)
{
  gfc_unit *u;

  library_start (&iqp->common);

  if ((iqp->common.flags & IOPARM_INQUIRE_HAS_FILE) == 0)
    {
      u = find_unit (iqp->common.unit);
      inquire_via_unit (iqp, u);
    }

(gdb) p iqp->common
$1 = {flags = 8192, unit = 10, filename = 0x4a6180 "d.f90", line = 9, 
  iomsg_len = 4806240, iomsg = 0x2008d0010 "", iostat = 0xc}
(gdb) p u
$2 = (gfc_unit *) 0x200ce6f00

Now with newunit.

(gdb) p  iqp->common
$1 = {flags = 8192, unit = -3, filename = 0x4a6140 "d.f90", line = 9, 
  iomsg_len = 4806192, iomsg = 0x2008d0010 "", iostat = 0xc}
(gdb) p u
$2 = (gfc_unit *) 0x0

Whoops.  u = 0x0, then runs into line 228-229.

  if ((cf & IOPARM_INQUIRE_HAS_STRM_POS_OUT) != 0)
    *iqp->strm_pos_out = (u != NULL) ? u->strm_pos : 0;

and there's your 0.

Reply via email to