diff options
author | Mikael Morin <morin-mikael@orange.fr> | 2025-08-05 14:57:58 +0200 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2025-08-05 22:35:06 +0200 |
commit | d358dc6f331c58bb5f0046dd1e04fc100775c5e8 (patch) | |
tree | c8d77124d0d684bb716b35ecac0d7ef053c4bbbe | |
parent | 40da83e4a770f0a05ef6ace4cdd75397609e5bde (diff) | |
download | gcc-d358dc6f331c58bb5f0046dd1e04fc100775c5e8.zip gcc-d358dc6f331c58bb5f0046dd1e04fc100775c5e8.tar.gz gcc-d358dc6f331c58bb5f0046dd1e04fc100775c5e8.tar.bz2 |
fortran: Remove span overwrite with pointer assignments
Remove an overwrite of the array descriptor span field when pointer-
assigning from a polymorphic function result to a non-polymorphic
pointer. That overwrite doesn't make sense because the span is
determined by the memory layout of the array; we can't change it
without also changing the data pointer.
gcc/fortran/ChangeLog:
* trans-expr.cc (gfc_trans_pointer_assignment): Remove overwrite
of the span after assignment of the array descriptor in the
polymorphic function result to non-polymorphic pointer case.
gcc/testsuite/ChangeLog:
* gfortran.dg/pointer_assign_16.f90: New test.
-rw-r--r-- | gcc/fortran/trans-expr.cc | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/pointer_assign_16.f90 | 25 |
2 files changed, 25 insertions, 5 deletions
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index 2dd0936..69952b3 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -11146,11 +11146,6 @@ gfc_trans_pointer_assignment (gfc_expr * expr1, gfc_expr * expr2) { rse.expr = gfc_class_data_get (rse.expr); gfc_add_modify (&lse.pre, desc, rse.expr); - /* Set the lhs span. */ - tmp = TREE_TYPE (rse.expr); - tmp = TYPE_SIZE_UNIT (gfc_get_element_type (tmp)); - tmp = fold_convert (gfc_array_index_type, tmp); - gfc_conv_descriptor_span_set (&lse.pre, desc, tmp); } else { diff --git a/gcc/testsuite/gfortran.dg/pointer_assign_16.f90 b/gcc/testsuite/gfortran.dg/pointer_assign_16.f90 new file mode 100644 index 0000000..9282283 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pointer_assign_16.f90 @@ -0,0 +1,25 @@ +! { dg-do run } +! +! Check the span of the descriptor of an array pointer after it has been +! assigned to from a polymorphic function result. + +program test + implicit none + type t + integer :: c + end type t + type, extends(t) :: u + integer :: d + end type u + type(t), pointer :: p(:) + class(t), allocatable, target :: a(:) + p => f() + ! print *, p%c + if (any(p%c /= [2,5,11,17,23])) error stop 1 +contains + function f() + class(t), pointer :: f(:) + a = [ u(2,3), u(5,7), u(11,13), u(17,19), u(23,29) ] + f => a + end function +end program |