| ! { dg-do run } |
| ! { dg-require-visibility "" } |
| ! Test the fix for PR61459 and PR58883. |
| ! |
| ! Contributed by John Wingate <johnww@tds.net> |
| ! and Tao Song <songtao.thu@gmail.com> |
| ! |
| module a |
| |
| implicit none |
| private |
| public :: f_segfault, f_segfault_plus, f_workaround |
| integer, dimension(2,2) :: b = reshape([1,-1,1,1],[2,2]) |
| |
| contains |
| |
| function f_segfault(x) |
| real, dimension(:), allocatable :: f_segfault |
| real, dimension(:), intent(in) :: x |
| allocate(f_segfault(2)) |
| f_segfault = matmul(b,x) |
| end function f_segfault |
| |
| ! Sefaulted without the ALLOCATE as well. |
| function f_segfault_plus(x) |
| real, dimension(:), allocatable :: f_segfault_plus |
| real, dimension(:), intent(in) :: x |
| f_segfault_plus = matmul(b,x) |
| end function f_segfault_plus |
| |
| function f_workaround(x) |
| real, dimension(:), allocatable :: f_workaround |
| real, dimension(:), intent(in) :: x |
| real, dimension(:), allocatable :: tmp |
| allocate(f_workaround(2),tmp(2)) |
| tmp = matmul(b,x) |
| f_workaround = tmp |
| end function f_workaround |
| |
| end module a |
| |
| program main |
| use a |
| implicit none |
| real, dimension(2) :: x = 1.0, y |
| ! PR61459 |
| y = f_workaround (x) |
| if (any (f_segfault (x) .ne. y)) STOP 1 |
| if (any (f_segfault_plus (x) .ne. y)) STOP 2 |
| ! PR58883 |
| if (any (foo () .ne. reshape([1,2,3,4,5,6,7,8],[2,4]))) STOP 3 |
| contains |
| function foo() |
| integer, allocatable :: foo(:,:) |
| integer, allocatable :: temp(:) |
| |
| temp = [1,2,3,4,5,6,7,8] |
| foo = reshape(temp,[2,4]) |
| end function |
| end program main |