Planning to commit this soon.

Patch developed by Steve. I did one fix-up after reading that
giving strlen a NULL pointer can be undefined on some systems.

Regression tested on x86_64-linux-gnu.

Thanks Steve.

Regards all,

Jerry

$ git show
commit 2df097c4934ac47eadbd8b9b5d23e7bec8bb1049 (HEAD -> master)
Author: Steve Kargl <[email protected]>
Date:   Wed Jan 7 15:14:23 2026 -0800

    Fortran: Fix namelist with use association and renaming

            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.

commit 2df097c4934ac47eadbd8b9b5d23e7bec8bb1049
Author: Steve Kargl <[email protected]>
Date:   Wed Jan 7 15:14:23 2026 -0800

    Fortran: Fix namelist with use association and renaming
    
            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.

diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index 2ed256ef30b..2d799b12972 100644
--- a/gcc/fortran/trans-io.cc
+++ b/gcc/fortran/trans-io.cc
@@ -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
index 00000000000..9be12732a8a
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/namelist_99.f90
@@ -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

Reply via email to