aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorHarald Anlauf <anlauf@gmx.de>2024-08-29 21:21:39 +0200
committerHarald Anlauf <anlauf@gmx.de>2024-08-29 21:21:39 +0200
commit6bfeba12c86b4d0dae27d99b484f64774dd49398 (patch)
tree1a4100a5240e63a509cd0822081504d6a2abea0b /gcc
parent81c47986e1d8efa70a4bd28e8dfc62bfca8e8362 (diff)
downloadgcc-6bfeba12c86b4d0dae27d99b484f64774dd49398.zip
gcc-6bfeba12c86b4d0dae27d99b484f64774dd49398.tar.gz
gcc-6bfeba12c86b4d0dae27d99b484f64774dd49398.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/trans-io.cc3
-rw-r--r--gcc/testsuite/gfortran.dg/use_rename_12.f9027
2 files changed, 29 insertions, 1 deletions
diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index 7ab82fa..c0baa71 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 0000000..0447d5f
--- /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