https://gcc.gnu.org/g:5999dd8a610acbaff9dfb6bdeb67f33380336132

commit r14-10621-g5999dd8a610acbaff9dfb6bdeb67f33380336132
Author: Harald Anlauf <anl...@gmx.de>
Date:   Thu Aug 29 21:21:39 2024 +0200

    Fortran: fix ICE with use with rename of namelist member [PR116530]
    
    gcc/fortran/ChangeLog:
    
            PR fortran/116530
            * trans-io.cc (transfer_namelist_element): Prevent NULL pointer
            dereference.
    
    gcc/testsuite/ChangeLog:
    
            PR fortran/116530
            * gfortran.dg/use_rename_12.f90: New test.
    
    (cherry picked from commit 6bfeba12c86b4d0dae27d99b484f64774dd49398)

Diff:
---
 gcc/fortran/trans-io.cc                     |  3 ++-
 gcc/testsuite/gfortran.dg/use_rename_12.f90 | 27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index ee2cc560cdfa..0c5a1714be6f 100644
--- a/gcc/fortran/trans-io.cc
+++ b/gcc/fortran/trans-io.cc
@@ -1692,7 +1692,8 @@ transfer_namelist_element (stmtblock_t * block, const 
char * var_name,
   gcc_assert (sym || c);
 
   /* Build the namelist object name.  */
-  if (sym && !sym->attr.use_only && sym->attr.use_rename)
+  if (sym && !sym->attr.use_only && sym->attr.use_rename
+      && sym->ns->use_stmts->rename)
     string = gfc_build_cstring_const (sym->ns->use_stmts->rename->local_name);
   else
     string = gfc_build_cstring_const (var_name);
diff --git a/gcc/testsuite/gfortran.dg/use_rename_12.f90 
b/gcc/testsuite/gfortran.dg/use_rename_12.f90
new file mode 100644
index 000000000000..0447d5fe1504
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/use_rename_12.f90
@@ -0,0 +1,27 @@
+! { dg-do compile }
+! PR fortran/116530 - ICE with member of namelist renamed by use module
+!
+! Reported by philippe.wautelet at cnrs.fr 
+
+module mod_nml1
+  implicit none
+  logical :: ldiag
+  namelist /nam_nml1/ldiag
+end module mod_nml1
+
+module mod_interm
+  use mod_nml1
+end module mod_interm
+
+program ice_nml
+  use mod_nml1,        ldiag_nml1 => ldiag
+  use mod_nml1, only : ldiag_only => ldiag
+  use mod_interm
+  implicit none
+  integer :: ilu = 10
+  read(unit=ilu,nml=nam_nml1)
+  write(unit=*,nml=nam_nml1)
+  print *, ldiag
+  print *, ldiag_nml1
+  print *, ldiag_only
+end program ice_nml

Reply via email to