! { dg-do run } ! { dg-options "-fdump-tree-original" } ! ! PR fortran/91863 ! ! Contributed by G. Steinmetz ! subroutine sub(x) bind(c) implicit none (type, external) integer, allocatable, intent(out) :: x(:) allocate(x(3:5)) x(:) = [1, 2, 3] end subroutine sub program p implicit none (type, external) interface subroutine sub(x) bind(c) integer, allocatable, intent(out) :: x(:) end end interface integer, allocatable :: a(:) call sub(a) if (.not.allocated(a)) stop 1 if (any(shape(a) /= [3])) stop 2 if (lbound(a,1) /= 3 .or. ubound(a,1) /= 5) stop 3 print *, a(0), a(1), a(2), a(3), a(4) print *, a if (any(a /= [1, 2, 3])) stop 4 end program p ! "cfi" only appears in context of "a" -> bind-C descriptor ! the intent(out) implies freeing in the callee (!) (when implemented in Fortran), hence the "free" ! and also in the caller (when implemented in Fortran) ! It is the only 'free' as 'a' is part of the main program and, hence, implicitly has the SAVE attribute. ! The 'cfi = 0' appears before the call due to the deallocate and when preparing the C descriptor ! As cfi (i.e. the descriptor itself) is allocated in libgomp, it has to be freed after the call. ! { dg-final { scan-tree-dump-times "__builtin_free" 2 "original" } } ! { dg-final { scan-tree-dump-times "__builtin_free \\(_x->base_addr\\);" 1 "original" } } ! { dg-final { scan-tree-dump-times "_x->base_addr = 0B;" 1 "original" } } ! { dg-final { scan-tree-dump-times "__builtin_free \\(cfi\\.\[0-9\]+\\.base_addr\\);" 1 "original" } } ! { dg-final { scan-tree-dump-times "cfi\\.\[0-9\]+\\.base_addr = 0B;" 1 "original" } }