| ! Copyright 2024 Free Software Foundation, Inc. |
| |
| ! This program is free software; you can redistribute it and/or modify |
| ! it under the terms of the GNU General Public License as published by |
| ! the Free Software Foundation; either version 3 of the License, or |
| ! (at your option) any later version. |
| ! |
| ! This program is distributed in the hope that it will be useful, |
| ! but WITHOUT ANY WARRANTY; without even the implied warranty of |
| ! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| ! GNU General Public License for more details. |
| ! |
| ! You should have received a copy of the GNU General Public License |
| ! along with this program. If not, see <http://www.gnu.org/licenses/>. |
| |
| module data |
| use, intrinsic :: iso_c_binding, only : C_SIZE_T |
| implicit none |
| |
| character, target :: char_v |
| character (len=3), target :: char_a |
| integer, target :: int_v |
| integer, target, dimension(:,:) :: int_2da (3,2) |
| real*4, target :: real_v |
| real*4, target :: real_a(4) |
| real*4, target, dimension (:), allocatable :: real_a_alloc |
| |
| character, pointer :: char_v_p |
| character (len=3), pointer :: char_a_p |
| integer, pointer :: int_v_p |
| integer, pointer, dimension (:,:) :: int_2da_p |
| real*4, pointer :: real_v_p |
| real*4, pointer, dimension(:) :: real_a_p |
| real*4, dimension(:), pointer :: real_alloc_a_p |
| |
| contains |
| subroutine test_sizeof (answer) |
| integer(C_SIZE_T) :: answer |
| |
| print *, answer ! Test breakpoint |
| end subroutine test_sizeof |
| |
| subroutine run_tests () |
| call test_sizeof (sizeof (char_v)) |
| call test_sizeof (sizeof (char_a)) |
| call test_sizeof (sizeof (int_v)) |
| call test_sizeof (sizeof (int_2da)) |
| call test_sizeof (sizeof (real_v)) |
| call test_sizeof (sizeof (real_a)) |
| call test_sizeof (sizeof (real_a_alloc)) |
| |
| call test_sizeof (sizeof (char_v_p)) |
| call test_sizeof (sizeof (char_a_p)) |
| call test_sizeof (sizeof (int_v_p)) |
| call test_sizeof (sizeof (int_2da_p)) |
| call test_sizeof (sizeof (real_v_p)) |
| call test_sizeof (sizeof (real_a_p)) |
| call test_sizeof (sizeof (real_alloc_a_p)) |
| end subroutine run_tests |
| |
| end module data |
| |
| program sizeof_tests |
| use iso_c_binding |
| use data |
| |
| implicit none |
| |
| allocate (real_a_alloc(5)) |
| |
| nullify (char_v_p) |
| nullify (char_a_p) |
| nullify (int_v_p) |
| nullify (int_2da_p) |
| nullify (real_v_p) |
| nullify (real_a_p) |
| nullify (real_alloc_a_p) |
| |
| ! Test nullified |
| call run_tests () |
| |
| char_v_p => char_v ! Past unassigned pointers |
| char_a_p => char_a |
| int_v_p => int_v |
| int_2da_p => int_2da |
| real_v_p => real_v |
| real_a_p => real_a |
| real_alloc_a_p => real_a_alloc |
| |
| ! Test pointer assignment |
| call run_tests () |
| |
| char_v = 'a' |
| char_a = "aaa" |
| int_v = 10 |
| int_2da = reshape((/1, 2, 3, 4, 5, 6/), shape(int_2da)) |
| real_v = 123.123 |
| real_a_p = (/-1.1, -1.2, -1.3, -1.4/) |
| real_a_alloc = (/1.1, 2.2, 3.3, 4.4, 5.5/) |
| |
| ! After allocate/value assignment |
| call run_tests () |
| |
| deallocate (real_a_alloc) |
| |
| print *, "done" ! Final breakpoint |
| |
| end program sizeof_tests |