| ! { dg-do run } |
| ! Tests the fix for PR59414, comment #3, in which the allocate |
| ! expressions were not correctly being stripped to provide the |
| ! vpointer as an lhs to the pointer assignment of the vptr from |
| ! the SOURCE expression. |
| ! |
| ! Contributed by Antony Lewis <antony@cosmologist.info> |
| ! |
| module ObjectLists |
| implicit none |
| |
| type :: t |
| integer :: i |
| end type |
| |
| type Object_array_pointer |
| class(t), pointer :: p(:) |
| end type |
| |
| contains |
| |
| subroutine AddArray1 (P, Pt) |
| class(t) :: P(:) |
| class(Object_array_pointer) :: Pt |
| |
| select type (Pt) |
| class is (Object_array_pointer) |
| if (associated (Pt%P)) deallocate (Pt%P) |
| allocate(Pt%P(1:SIZE(P)), source=P) |
| end select |
| end subroutine |
| |
| subroutine AddArray2 (P, Pt) |
| class(t) :: P(:) |
| class(Object_array_pointer) :: Pt |
| |
| select type (Pt) |
| type is (Object_array_pointer) |
| if (associated (Pt%P)) deallocate (Pt%P) |
| allocate(Pt%P(1:SIZE(P)), source=P) |
| end select |
| end subroutine |
| |
| subroutine AddArray3 (P, Pt) |
| class(t) :: P |
| class(Object_array_pointer) :: Pt |
| |
| select type (Pt) |
| class is (Object_array_pointer) |
| if (associated (Pt%P)) deallocate (Pt%P) |
| allocate(Pt%P(1:4), source=P) |
| end select |
| end subroutine |
| |
| subroutine AddArray4 (P, Pt) |
| type(t) :: P(:) |
| class(Object_array_pointer) :: Pt |
| |
| select type (Pt) |
| class is (Object_array_pointer) |
| if (associated (Pt%P)) deallocate (Pt%P) |
| allocate(Pt%P(1:SIZE(P)), source=P) |
| end select |
| end subroutine |
| end module |
| |
| use ObjectLists |
| type(Object_array_pointer), pointer :: Pt |
| class(t), pointer :: P(:) |
| |
| allocate (P(2), source = [t(1),t(2)]) |
| allocate (Pt, source = Object_array_pointer(NULL())) |
| call AddArray1 (P, Pt) |
| select type (x => Pt%p) |
| type is (t) |
| if (any (x%i .ne. [1,2])) STOP 1 |
| end select |
| deallocate (P) |
| deallocate (pt) |
| |
| allocate (P(3), source = [t(3),t(4),t(5)]) |
| allocate (Pt, source = Object_array_pointer(NULL())) |
| call AddArray2 (P, Pt) |
| select type (x => Pt%p) |
| type is (t) |
| if (any (x%i .ne. [3,4,5])) STOP 2 |
| end select |
| deallocate (P) |
| deallocate (pt) |
| |
| allocate (Pt, source = Object_array_pointer(NULL())) |
| call AddArray3 (t(6), Pt) |
| select type (x => Pt%p) |
| type is (t) |
| if (any (x%i .ne. [6,6,6,6])) STOP 3 |
| end select |
| deallocate (pt) |
| |
| allocate (Pt, source = Object_array_pointer(NULL())) |
| call AddArray4 ([t(7), t(8)], Pt) |
| select type (x => Pt%p) |
| type is (t) |
| if (any (x%i .ne. [7,8])) STOP 4 |
| end select |
| deallocate (pt) |
| end |
| |