https://gcc.gnu.org/g:71e10df72767eb0732c25e16532604d7df6fb7db

commit r17-5407-g71e10df72767eb0732c25e16532604d7df6fb7db
Author: Paul Thomas <[email protected]>
Date:   Wed Oct 7 12:04:20 2026 +0100

    Fortran: [PDT] (12/16) Parameterized derived type errors [PR82173]
    
    2026-10-20  Paul Thomas  <[email protected]>
    
    gcc/fortran
            PR fortran/82173
            * trans-io.cc (nml_get_addr_expr): Remove nops from the data
            pointer.
            (transfer_namelist_element): Pass descriptors of PDT arrays.
    
    gcc/testsuite/
            PR fortran/82173
            * gfortran.dg/pdt_bug18.f90: New test.

Diff:
---
 gcc/fortran/trans-io.cc                 |  8 +++++++-
 gcc/testsuite/gfortran.dg/pdt_bug18.f90 | 17 +++++++++++++++++
 2 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index 48fdaa5e7335..732c59250d95 100644
--- a/gcc/fortran/trans-io.cc
+++ b/gcc/fortran/trans-io.cc
@@ -1650,7 +1650,10 @@ nml_get_addr_expr (gfc_symbol * sym, gfc_component * c,
     tmp = gfc_class_data_get (tmp);
 
   if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (tmp)))
-    tmp = gfc_conv_array_data (tmp);
+    {
+      tmp = gfc_conv_array_data (tmp);
+      STRIP_NOPS (tmp);
+    }
   else
     {
       if (!POINTER_TYPE_P (TREE_TYPE (tmp)))
@@ -1820,6 +1823,9 @@ transfer_namelist_element (stmtblock_t * block, const 
char * var_name,
 
   for ( n_dim = 0 ; n_dim < rank ; n_dim++ )
     {
+      if (c && c->attr.pdt_array)
+       decl = TREE_OPERAND (nml_get_addr_expr (sym, c, base_addr), 0);
+
       tmp = build_call_expr_loc (input_location,
                             iocall[IOCALL_SET_NML_VAL_DIM], 5,
                             dt_parm_addr,
diff --git a/gcc/testsuite/gfortran.dg/pdt_bug18.f90 
b/gcc/testsuite/gfortran.dg/pdt_bug18.f90
new file mode 100644
index 000000000000..2f263241e20f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pdt_bug18.f90
@@ -0,0 +1,17 @@
+! { dg-do run }
+program q1
+  type :: t(n)
+    integer, len :: n = 1
+    integer :: v(n)
+  end type
+  type(t(5)) :: a
+  namelist /grp/ a
+  a%v = [1,2,3,4,5]
+  open (10, status='SCRATCH')
+  write (10, nml=grp)
+  a%v = 0
+  rewind (10)
+  read (10, nml=grp)
+  close (10)
+  if (any (a%v /= [1,2,3,4,5])) stop 1
+end program

Reply via email to