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
