! { dg-do run } ! { dg-additional-sources PR94327.c } ! ! Test the fix for PR94327 ! program attr_p use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer :: i integer, parameter :: n = 11 integer, parameter :: u(*) = [(i, i=1,n)] interface function attr_p_as(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), pointer, intent(in) :: a(:) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_p_as function attr_a_as(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), allocatable, intent(in) :: a(:) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_a_as function attr_o_as(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), intent(in) :: a(:) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_o_as function attr_p_ar(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), pointer, intent(in) :: a(..) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_p_ar function attr_a_ar(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), allocatable, intent(in) :: a(..) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_a_ar function attr_o_ar(a, s) result(c) & bind(c, name="get_attr") use, intrinsic :: iso_c_binding, only: & c_int, c_bool, c_char implicit none integer(kind=c_int), intent(in) :: a(..) logical(kind=c_bool), value, intent(in) :: s character(kind=c_char) :: c end function attr_o_ar end interface integer(kind=c_int), target :: a(n) integer(kind=c_int), allocatable, target :: b(:) integer(kind=c_int), pointer :: p(:) character(kind=c_char) :: c a = u c = attr_p_as(a, .true._c_bool) if(c/='p') stop 1 if(any(a/=u)) stop 2 ! a = u c = attr_p_ar(a, .true._c_bool) if(c/='p') stop 3 if(any(a/=u)) stop 4 ! a = u c = attr_o_as(a, .true._c_bool) if(c/='o') stop 5 if(any(a/=u)) stop 6 ! a = u c = attr_o_ar(a, .true._c_bool) if(c/='o') stop 7 if(any(a/=u)) stop 8 ! allocate(b, source=u) c = attr_p_as(b, .true._c_bool) if(c/='p') stop 9 if(.not.allocated(b)) stop 10 if(any(b/=u)) stop 11 ! deallocate(b) allocate(b, source=u) c = attr_p_ar(b, .true._c_bool) if(c/='p') stop 12 if(.not.allocated(b)) stop 13 if(any(b/=u)) stop 14 ! deallocate(b) allocate(b, source=u) c = attr_a_as(b, .true._c_bool) if(c/='a') stop 15 if(.not.allocated(b)) stop 16 if(any(b/=u)) stop 17 ! deallocate(b) allocate(b, source=u) c = attr_a_ar(b, .true._c_bool) if(c/='a') stop 18 if(.not.allocated(b)) stop 19 if(any(b/=u)) stop 20 ! deallocate(b) allocate(b, source=u) c = attr_o_as(b, .true._c_bool) if(c/='o') stop 21 if(.not.allocated(b)) stop 22 if(any(b/=u)) stop 23 ! deallocate(b) allocate(b, source=u) c = attr_o_ar(b, .true._c_bool) if(c/='o') stop 24 if(.not.allocated(b)) stop 25 if(any(b/=u)) stop 26 ! deallocate(b) c = attr_a_as(b, .false._c_bool) if(c/='a') stop 27 if(allocated(b)) stop 28 ! c = attr_a_ar(b, .false._c_bool) if(c/='a') stop 29 if(allocated(b)) stop 30 ! nullify(p) p => a c = attr_p_as(p, .true._c_bool) if(c/='p') stop 31 if(.not.associated(p)) stop 32 if(.not.associated(p, a)) stop 33 if(any(p/=u)) stop 34 ! nullify(p) p => a c = attr_p_ar(p, .true._c_bool) if(c/='p') stop 35 if(.not.associated(p)) stop 36 if(.not.associated(p, a)) stop 37 if(any(p/=u)) stop 38 ! nullify(p) p => a c = attr_o_as(p, .true._c_bool) if(c/='o') stop 39 if(.not.associated(p)) stop 40 if(.not.associated(p, a)) stop 41 if(any(p/=u)) stop 42 ! nullify(p) p => a c = attr_o_ar(p, .true._c_bool) if(c/='o') stop 43 if(.not.associated(p)) stop 44 if(.not.associated(p, a)) stop 45 if(any(p/=u)) stop 46 ! nullify(p) c = attr_p_as(p, .false._c_bool) if(c/='p') stop 47 if(associated(p)) stop 48 if(associated(p, a)) stop 49 ! nullify(p) c = attr_p_ar(p, .false._c_bool) if(c/='p') stop 50 if(associated(p)) stop 51 if(associated(p, a)) stop 52 stop end program attr_p