https://gcc.gnu.org/g:a14d0798ecb9a4b0285e0eeb114f422883312ec9
commit a14d0798ecb9a4b0285e0eeb114f422883312ec9 Author: Mikael Morin <[email protected]> Date: Sun Sep 28 23:03:25 2025 +0200 Correction régression pointer_assign_16.f90 Diff: --- gcc/fortran/trans-descriptor.cc | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index c37dbbded43f..24ff391958df 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -1688,24 +1688,31 @@ void gfc_copy_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, bool subref) { - gcc_assert (GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (dest)) - == GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))); - - struct lang_type *dest_ls = TYPE_LANG_SPECIFIC (TREE_TYPE (dest)); - struct lang_type *src_ls = TYPE_LANG_SPECIFIC (TREE_TYPE (src)); + if (GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (dest)) + == GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))) + { + struct lang_type *dest_ls = TYPE_LANG_SPECIFIC (TREE_TYPE (dest)); + struct lang_type *src_ls = TYPE_LANG_SPECIFIC (TREE_TYPE (src)); + + /* When only the array_kind differs, do a view_convert. */ + tree tmp1; + if (dest_ls + && src_ls + && dest_ls->rank == src_ls->rank + && dest_ls->akind != src_ls->akind) + tmp1 = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dest), src); + else + tmp1 = src; - /* When only the array_kind differs, do a view_convert. */ - tree tmp1; - if (dest_ls - && src_ls - && dest_ls->rank == src_ls->rank - && dest_ls->akind != src_ls->akind) - tmp1 = build1 (VIEW_CONVERT_EXPR, TREE_TYPE (dest), src); + /* Copy the descriptor for pointer assignments. */ + gfc_add_modify (block, dest, tmp1); + } else - tmp1 = src; - - /* Copy the descriptor for pointer assignments. */ - gfc_add_modify (block, dest, tmp1); + { + gcc_assert (GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (dest)) + && !GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))); + gfc_copy_descriptor (block, dest, src); + } /* Add any offsets from subreferences. */ gfc_get_dataptr_offset (block, dest, src, NULL_TREE, subref, src_expr);
