| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Check for semantic errors in ALLOCATE statements |
| |
| ! Creating a symbol that allocate should accept |
| module share |
| real, pointer :: rp |
| end module share |
| |
| module m |
| ! Creating symbols that allocate should not accept |
| type :: a_type |
| real, allocatable :: x |
| contains |
| procedure, pass :: foo => mfoo |
| procedure, pass :: bar => mbar |
| end type |
| |
| contains |
| function mfoo(x) |
| class(a_type) :: x |
| class(a_type), allocatable :: foo |
| foo = x |
| end function |
| subroutine mbar(x) |
| class(a_type) :: x |
| end subroutine |
| end module |
| |
| subroutine C932(ed1, ed5, ed7, edc9, edc10, okad1, okpd1, okacd5) |
| ! Each allocate-object shall be a data pointer or an allocatable variable. |
| use :: share |
| use :: m, only: a_type |
| type TestType1 |
| integer, allocatable :: ok(:) |
| integer :: nok(10) |
| end type |
| type TestType2 |
| integer, pointer :: ok |
| integer :: nok |
| end type |
| interface |
| function foo(x) |
| real(4) :: foo, x |
| end function |
| subroutine bar() |
| end subroutine |
| end interface |
| real ed1(:), e2 |
| real, save :: e3[*] |
| real , target :: e4, ed5(:) |
| real , parameter :: e6 = 5. |
| procedure(foo), pointer :: proc_ptr1 => NULL() |
| procedure(bar), pointer :: proc_ptr2 |
| type(TestType1) ed7 |
| type(TestType2) e8 |
| type(TestType1) edc9[*] |
| type(TestType2) edc10[*] |
| class(a_type), allocatable :: a_var |
| |
| real, allocatable :: oka1(:, :), okad1(:, :), oka2 |
| real, pointer :: okp1(:, :), okpd1(:, :), okp2 |
| real, pointer, save :: okp3 |
| real, allocatable, save :: oka3, okac4[:,:] |
| real, allocatable :: okacd5(:, :)[:] |
| |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(foo) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(bar) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(C932) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(proc_ptr1) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(proc_ptr2) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(a_var%foo) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(a_var%bar) |
| |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed1) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(e2) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(e3) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(e4) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed5) |
| !ERROR: Name in ALLOCATE statement must be a variable name |
| allocate(e6) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed7) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed7%nok(2)) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed8) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(ed8) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(edc9%nok) |
| !ERROR: Entity in ALLOCATE statement must have the ALLOCATABLE or POINTER attribute |
| allocate(edc10) |
| |
| ! No errors expected below: |
| allocate(a_var) |
| allocate(a_var%x) |
| allocate(oka1(5, 7), okad1(4, 8), oka2) |
| allocate(okp1(5, 7), okpd1(4, 8), okp2) |
| allocate(okp1(5, 7), okpd1(4, 8), okp2) |
| allocate(okp3, oka3) |
| allocate(okac4[2:4,4:*]) |
| allocate(okacd5(1:2,3:4)[5:*]) |
| allocate(ed7%ok(7)) |
| allocate(e8%ok) |
| allocate(edc9%ok(4)) |
| allocate(edc10%ok) |
| allocate(rp) |
| end subroutine |