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

--- Comment #2 from Steve Kargl <kargl at gcc dot gnu.org> ---
Created attachment 63173
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=63173&action=edit
dejagnu-ified testcase

Here's a modified version of Van's testcase.  I hope that is
equivalent and suitable for the testsuite.

When compiled with -fdump-tree-original, the subroutine 'b'

subroutine b
   use m, only: y => tol, z
   implicit none
   character(len=20) :: str = "&v z=1 y=1/"
   real :: tol = 0
   namelist /v/ y, z
   read(str, nml=v)
   if (z /= 1) stop 3
   if (y /= 1) stop 4
   if (tol /= 0) stop 5
end subroutine b

produces (edited to show only relevant parts)

__attribute__((fn spec (". ")))
void b ()
{
  namelist v;
  static character(kind=1) str[1:20] = "&v z=1 y=1/         ";
  static real(kind=4) tol = 0.0;

  {
...
    dt_parm.0.internal_unit = (character(kind=1) *) &str;
...
    dt_parm.0.namelist_name = &"v"[1]{lb: 1 sz: 1};
...
    _gfortran_st_set_nml_var (&dt_parm.0, &tol, &"tol"[1]{lb: 1 sz: 1}, 4, 0,
    {.elem_len=4, .version=0, .rank=0, .type=1});

Notice the presences of 'tol' in _gfortran_st_set_nml_var instead of 'y'.
The first &tol is likely correct as gfortran wants to write to that memory
location.  The second &"tol"[1] is where gfortran goes wrong.  This one
should be 'y' to match the namelist definition.

    _gfortran_st_set_nml_var (&dt_parm.0, &z, &"z"[1]{lb: 1 sz: 1}, 4, 0,
    {.elem_len=4, .version=0, .rank=0, .type=1});
    _gfortran_st_read (&dt_parm.0);
    _gfortran_st_read_done (&dt_parm.0);
  }

  if (z != 1)
    {
      _gfortran_stop_numeric (3, 0);
    }

  if (tol != 1)
    {
      _gfortran_stop_numeric (4, 0);
    }

The above is the renamed 'tol' aka 'y'.  (Recall -fdump-tree-original
does not show all info about a symbol.)

  if (tol != 0.0)
    {
      _gfortran_stop_numeric (5, 0);
    }

The above is the local 'tol'.

}

Reply via email to