(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
intent_optimize_10.f90
! { dg-do run }
! { dg-additional-options "-fno-inline -fno-ipa-modref -fdump-tree-optimized -fdump-tree-original" }
!
! PR fortran/41453
! Check that the INTENT(OUT) attribute causes in the case of non-polymorphic derived type arguments:
!  - one clobber to be emitted in the caller before calls to FOO in the *.original dump,
!  - no clobber to be emitted in the caller before calls to BAR in the *.original dump,
!  - the initialization constants to be optimized away in the *.optimized dump.

module x
  implicit none
  type :: t
    integer :: c
  end type t
  type, extends(t) :: u
    integer :: d
  end type u
contains
  subroutine foo(a)
    type(t), intent(out) :: a
    a = t(42)
  end subroutine foo
  subroutine bar(b)
    class(t), intent(out) :: b
    b%c = 24
  end subroutine bar
end module x

program main
  use x
  implicit none
  type(t) :: tc
  type(u) :: uc, ud
  class(t), allocatable :: te, tf

  tc = t(123456789)
  call foo(tc)
  if (tc%c /= 42) stop 1

  uc = u(987654321, 0)
  call foo(uc%t)
  if (uc%c /= 42) stop 2
  if (uc%d /= 0) stop 3

  ud = u(11223344, 0)
  call bar(ud)
  if (ud%c /= 24) stop 4

  te = t(55667788)
  call foo(te)
  if (te%c /= 42) stop 5

  tf = t(99887766)
  call bar(tf)
  if (tf%c /= 24) stop 6

end program main

! We don't support class descriptors, neither derived type components, so there is a clobber for tc only;
! no clobber for uc, ud, te, tf.
! { dg-final { scan-tree-dump-times "CLOBBER" 1 "original" } }
! { dg-final { scan-tree-dump "tc = {CLOBBER};" "original" } }

! There is a clobber for tc, so we should manage to optimize away the associated initialization constant (but not other
! initialization constants).
! { dg-final { scan-tree-dump-not "123456789" "optimized" { target __OPTIMIZE__ } } }