blob: 3c26e8179cb9e66acaf0457ab183c36718437b25 [file] [log] [blame]
! { dg-do run }
! { dg-additional-options "-fdump-tree-original" }
! PR fortran/91300 - runtime error message with allocate and errmsg=
! Contributed by zed.three
program bigarray_prog
use, intrinsic :: iso_c_binding, only: C_INTPTR_T
implicit none
real(4), dimension(:), allocatable :: array, bigarray
integer :: stat1, stat2
character(len=100) :: errmsg1, errmsg2
character(*), parameter :: no_error = "no error"
integer(8), parameter :: n1 = huge (1_4) / 3 ! request more than 2GB
integer(8), parameter :: n2 = huge (1_C_INTPTR_T) / 4 ! "safe" for 64bit
integer(8), parameter :: bignumber = max (n1, n2)
stat1 = -1
stat2 = -1
errmsg1 = no_error
errmsg2 = no_error
allocate (array(1), stat=stat1, errmsg=errmsg1)
if (stat1 /= 0 ) stop 1
if (errmsg1 /= no_error) stop 1
! Obtain stat, errmsg for attempt to allocate an allocated object
allocate (array(1), stat=stat1, errmsg=errmsg1)
if (stat1 == 0 ) stop 2
if (errmsg1 == no_error) stop 2
! Try to allocate very large object
allocate (bigarray(bignumber), stat=stat2, errmsg=errmsg2)
if (stat2 /= 0) then
print *, "stat1 =", stat1
print *, "errmsg: ", trim (errmsg1)
print *, "stat2 =", stat2
print *, "errmsg: ", trim (errmsg2)
! Ensure different results for stat, errmsg variables (all compilers)
if (stat2 == stat1 ) stop 3
if (errmsg2 == no_error .or. errmsg2 == errmsg1) stop 4
! Finally verify gfortran-specific error messages
if (errmsg1 /= "Attempt to allocate an allocated object") stop 5
if (errmsg2 /= "Insufficient virtual memory" ) stop 6
end if
end program bigarray_prog
! { dg-final { scan-tree-dump-times "Attempt to allocate an allocated object" 4 "original" } }
! { dg-final { scan-tree-dump-times "Insufficient virtual memory" 4 "original" } }