| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| program test |
| real, allocatable :: a0, a1(:) |
| real, pointer :: p0, p1(:) |
| real, target :: t0, t1(1) |
| contains |
| subroutine allocatables(a) |
| real, allocatable :: a(..) |
| select rank(a) |
| rank (0) |
| allocate(a) ! ok |
| deallocate(a) ! ok |
| allocate(a, source=a0) ! ok |
| allocate(a, mold=p0) ! ok |
| a = 1. ! ok |
| !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar REAL(4) and rank 1 array of REAL(4) |
| a = [1.] |
| !ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE |
| allocate(a, source=a1) |
| allocate(a, mold=p1) ! ok, mold= ignored |
| rank (1) |
| allocate(a(1)) ! ok |
| deallocate(a) ! ok |
| a = 1. ! ok |
| a = [1.] ! ok |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, source=a0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, mold=p0) |
| allocate(a, source=a1) ! ok |
| allocate(a, mold=p1) ! ok |
| rank (2) |
| allocate(a(1,1)) ! ok |
| deallocate(a) ! ok |
| a = 1. ! ok |
| !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches rank 2 array of REAL(4) and rank 1 array of REAL(4) |
| a = [1.] |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, source=a0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, mold=p0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, source=a1) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(a, mold=p1) |
| !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE |
| rank (*) |
| !ERROR: Whole assumed-size array 'a' may not appear here without subscripts |
| allocate(a) |
| !ERROR: Whole assumed-size array 'a' may not appear here without subscripts |
| deallocate(a) |
| !ERROR: Whole assumed-size array 'a' may not appear here without subscripts |
| a = 1. |
| rank default |
| !ERROR: An assumed-rank object may not appear in an ALLOCATE statement |
| allocate(a) |
| deallocate(a) |
| a = 1. |
| end select |
| ! Test nested associations |
| select rank(a) |
| rank default |
| select rank(a) |
| rank default |
| select rank(a) |
| rank (0) |
| allocate(a) ! ok |
| deallocate(a) ! ok |
| rank (1) |
| allocate(a(1)) ! ok |
| deallocate(a) ! ok |
| end select |
| end select |
| end select |
| end |
| subroutine pointers(p) |
| real, pointer :: p(..) |
| select rank(p) |
| rank (0) |
| allocate(p) ! ok |
| deallocate(p) ! ok |
| allocate(p, source=a0) ! ok |
| allocate(p, mold=p0) ! ok |
| !ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE |
| allocate(p, source=a1) |
| allocate(p, mold=p1) ! ok, mold ignored |
| p => t0 ! ok |
| !ERROR: Pointer has rank 0 but target has rank 1 |
| p => t1 |
| rank (1) |
| allocate(p(1)) ! ok |
| deallocate(p) ! ok |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, source=a0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, mold=p0) |
| allocate(p, source=a1) ! ok |
| allocate(p, mold=p1) ! ok |
| !ERROR: Pointer has rank 1 but target has rank 0 |
| p => t0 |
| p => t1 ! ok |
| rank (2) |
| allocate(p(1,1)) ! ok |
| deallocate(p) ! ok |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, source=a0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, mold=p0) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, source=a1) |
| !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD |
| allocate(p, mold=p1) |
| !ERROR: Pointer has rank 2 but target has rank 0 |
| p => t0 |
| !ERROR: Pointer has rank 2 but target has rank 1 |
| p => t1 |
| !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE |
| rank (*) |
| !ERROR: Whole assumed-size array 'p' may not appear here without subscripts |
| allocate(p) |
| !ERROR: Whole assumed-size array 'p' may not appear here without subscripts |
| deallocate(p) |
| rank default |
| !ERROR: An assumed-rank object may not appear in an ALLOCATE statement |
| allocate(p) |
| deallocate(p) |
| !ERROR: pointer 'p' associated with object 't0' with incompatible type or shape |
| p => t0 |
| !ERROR: pointer 'p' associated with object 't1' with incompatible type or shape |
| p => t1 |
| end select |
| end |
| subroutine undefinable(p) |
| real, pointer, intent(in) :: p(..) |
| real, target :: t |
| select rank(p) |
| rank (0) |
| !ERROR: The left-hand side of a pointer assignment is not definable |
| !BECAUSE: 'p' is an INTENT(IN) dummy argument |
| p => t |
| !ERROR: Name in DEALLOCATE statement is not definable |
| !BECAUSE: 'p' is an INTENT(IN) dummy argument |
| deallocate(p) |
| !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE |
| rank (*) |
| !ERROR: Whole assumed-size array 'p' may not appear here without subscripts |
| !ERROR: Name in DEALLOCATE statement is not definable |
| !BECAUSE: 'p' is an INTENT(IN) dummy argument |
| deallocate(p) |
| rank default |
| !ERROR: Name in DEALLOCATE statement is not definable |
| !BECAUSE: 'p' is an INTENT(IN) dummy argument |
| deallocate(p) |
| end select |
| end |
| end |