]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Fortran: Fix namelist with use association and renaming
authorSteve Kargl <kargl@gcc.gnu.org>
Wed, 7 Jan 2026 23:14:23 +0000 (15:14 -0800)
committerJerry DeLisle <jvdelisle@gcc.gnu.org>
Thu, 8 Jan 2026 01:16:02 +0000 (17:16 -0800)
PR fortran/123012

gcc/fortran/ChangeLog:

* trans-io.cc (transfer_namelist_element): Adjust the
conditions determining when to use the local name or
the var name to build the object name.

gcc/testsuite/ChangeLog:

* gfortran.dg/namelist_99.f90: New test.

gcc/fortran/trans-io.cc
gcc/testsuite/gfortran.dg/namelist_99.f90 [new file with mode: 0644]

index 2ed256ef30bffc2765c91a5d8c3c58e7a189e1f4..2d799b129725fe5a3d8e0935bbdf6941d9a2a641 100644 (file)
@@ -1698,8 +1698,10 @@ 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
-      && sym->ns->use_stmts->rename)
+  if (sym && sym->attr.use_rename && sym->ns->use_stmts->rename
+      && sym->ns->use_stmts->rename->local_name
+      && sym->ns->use_stmts->rename->local_name[0]
+      && strcmp(sym->ns->use_stmts->rename->use_name, var_name) == 0)
     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/namelist_99.f90 b/gcc/testsuite/gfortran.dg/namelist_99.f90
new file mode 100644 (file)
index 0000000..9be1273
--- /dev/null
@@ -0,0 +1,46 @@
+! { dg-do run }
+module m
+   implicit none
+   private
+   public tol, z
+   integer :: tol = 42
+   integer :: z = 42
+end module m
+
+subroutine no_only_clause
+   use m
+   implicit none
+   character(len=20) :: str = "&v z=1 tol=1/"
+   namelist /v/ tol, z
+   read(str, nml=v)
+   if (z /= 1) stop 3
+   if (tol /= 1) stop 4
+end subroutine no_only_clause
+
+subroutine only_clause_without_renaming
+   use m, only : tol, z
+   implicit none
+   character(len=20) :: str = "&v z=1 tol=1/"
+   namelist /v/ z, tol
+   read(str, nml=v)
+   if (z /= 1) stop 3
+   if (tol /= 1) stop 4
+end subroutine only_clause_without_renaming
+
+subroutine only_clause_with_renaming
+   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 only_clause_with_renaming
+
+program p
+   call no_only_clause
+   call only_clause_without_renaming
+   call only_clause_with_renaming
+end program p