https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87359

--- Comment #42 from Paul Thomas <pault at gcc dot gnu.org> ---
Created attachment 44746
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=44746&action=edit
Patch for the PR

Many thanks Juergen for the reduced test. This is now DEJA-GNUified (see
below).

The patch regtests OK. Note that I cannot commit this until next week.

(Thomas or Dominique, are you in a position to do the honours?)

Best regards

Paul

! { dg-do compile }
! { dg-options "-fdump-tree-original" }
!
! Test the fix for the second part of PR87359 in which the reallocation on
! assignment for components of associate names was disallowed by r264358.
! -fcheck-all exposed the mismatch in array shapes.
!
! Contributed by Juergen Reuter  <juergen.reu...@desy.de>
!
module phs_fks
  implicit none
  private
  public :: phs_identifier_t
  public :: phs_fks_t
  type :: phs_identifier_t
     integer, dimension(:), allocatable :: contributors
  contains
    procedure :: init => phs_identifier_init
  end type phs_identifier_t

  type :: phs_fks_t
     type(phs_identifier_t), dimension(:), allocatable :: phs_identifiers
  end type phs_fks_t
contains

  subroutine phs_identifier_init &
     (phs_id, contributors)
     class(phs_identifier_t), intent(out) :: phs_id
     integer, intent(in), dimension(:) :: contributors
     allocate (phs_id%contributors (size (contributors)))
     phs_id%contributors = contributors
   end subroutine phs_identifier_init

end module phs_fks

!!!!!

module instances
  use phs_fks
  implicit none
  private
  public :: process_instance_t

  type :: nlo_event_deps_t
     type(phs_identifier_t), dimension(:), allocatable :: phs_identifiers
  end type nlo_event_deps_t

  type :: process_instance_t
     type(phs_fks_t), pointer :: phs => null ()
     type(nlo_event_deps_t) :: event_deps
   contains
     procedure :: init => process_instance_init
     procedure :: setup_real_event_kinematics => pi_setup_real_event_kinematics
  end type process_instance_t

contains

  subroutine process_instance_init (instance)
    class(process_instance_t), intent(out), target :: instance
    integer :: i
    integer :: i_born, i_real
    print *, "Process instance init"
    allocate (instance%phs)
  end subroutine process_instance_init

  subroutine pi_setup_real_event_kinematics (process_instance)
    class(process_instance_t), intent(inout) :: process_instance
    integer :: i_real, i
    associate (event_deps => process_instance%event_deps)
       i_real = 2
       associate (phs => process_instance%phs)
          print *, "Type is phs_fks_t"
          allocate (phs%phs_identifiers (3))
          call phs%phs_identifiers(1)%init ([1])
          call phs%phs_identifiers(2)%init ([1,2])
          call phs%phs_identifiers(3)%init ([1,2,3])
          event_deps%phs_identifiers = phs%phs_identifiers  ! Error: mismatch
in array shapes.
       end associate
    end associate
  end subroutine pi_setup_real_event_kinematics

end module instances

!!!!!

program main
  use instances, only: process_instance_t
  implicit none
  type(process_instance_t), allocatable, target :: process_instance
  allocate (process_instance)
  call process_instance%init ()
  call process_instance%setup_real_event_kinematics ()
end program main
! { dg-final { scan-tree-dump-times "__builtin_realloc" 2 "original" } }

Reply via email to