llvm / llvm-project / 74cbd71072de4f20c5cb9852dc4cf96ac7a4b5a4 / . / flang / test / Semantics / allocate10.f90

! RUN: %python %S/test_errors.py %s %flang_fc1 | |

! Check for semantic errors in ALLOCATE statements | |

!TODO: mixing expr and source-expr? | |

!TODO: using subcomponent in source expressions | |

subroutine C939_C942a_C945b(xsrc1a, xsrc1c, xsrc0, xsrc2a, xsrc2c, pos) | |

! C939: If an allocate-object is an array, either allocate-shape-spec-list shall | |

! appear in its allocation, or source-expr shall appear in the ALLOCATE | |

! statement and have the same rank as the allocate-object. | |

type A | |

real, pointer :: x(:) | |

end type | |

real, allocatable :: x0 | |

real, allocatable :: x1(:) | |

real, pointer :: x2(:, :, :) | |

type(A) a1 | |

type(A), allocatable :: a2(:, :) | |

real xsrc0 | |

real xsrc1a(*) | |

real xsrc1b(2:7) | |

real, pointer :: xsrc1c(:) | |

real xsrc2a(4:8, 12, *) | |

real xsrc2b(2:7, 5, 9) | |

real, pointer :: xsrc2c(:, :, :) | |

integer pos | |

allocate(x1(5)) | |

allocate(x1(2:7)) | |

allocate(x1, SOURCE=xsrc1a(2:7)) | |

allocate(x1, MOLD=xsrc1b) | |

allocate(x1, SOURCE=xsrc1c) | |

allocate(x2(2,3,4)) | |

allocate(x2(2:7,3:8,4:9)) | |

allocate(x2, SOURCE=xsrc2a(4:8, 1:12, 2:5)) | |

allocate(x2, MOLD=cos(xsrc2b)) | |

allocate(x2, SOURCE=xsrc2c) | |

allocate(x1(5), x2(2,3,4), a1%x(5), a2(1,2)%x(4)) | |

allocate(x1, a1%x, a2(1,2)%x, SOURCE=xsrc1a(2:7)) | |

allocate(x1, a1%x, a2(1,2)%x, MOLD=xsrc1b) | |

allocate(x1, a1%x, a2(1,2)%x, SOURCE=xsrc1c) | |

allocate(x0, x1(5), x2(2,3,4), a1%x(5), SOURCE=xsrc0) | |

! There are NO requirements that mold expression rank match the | |

! allocated-objects when allocate-shape-spec-lists are given. | |

! If it is not needed, the shape of MOLD should be simply ignored. | |

allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc0) | |

allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc1b) | |

allocate(x0, x1(5), x2(2,3,4), a1%x(5), MOLD=xsrc2b) | |

!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD | |

allocate(x1) | |

!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD | |

allocate(x1, SOURCE=xsrc0) | |

!ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD | |

allocate(x1, MOLD=xsrc2c) | |

allocate(x2, SOURCE=xsrc1a(2:7)) | |

allocate(x2, MOLD=xsrc1b) | |

allocate(x2, SOURCE=xsrc1c) | |

allocate(a1%x) | |

allocate(a2(5,3)%x) | |

allocate(x1(5), x2(2,3,4), a1%x, a2(1,2)%x(4)) | |

allocate(x2, a2(1,2)%x, SOURCE=xsrc2a(4:8, 1:12, 2:5)) | |

allocate(a1%x, MOLD=xsrc0) | |

!C942a: The number of allocate-shape-specs in an allocate-shape-spec-list shall | |

!be the same as the rank of the allocate-object. [...] (co-array stuffs). | |

!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object | |

allocate(x1(5, 5)) | |

!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object | |

allocate(x1(2:3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 1, 2)) | |

!ERROR: The number of shape specifications, when they appear, must match the rank of allocatable object | |

allocate(x2(pos)) | |

allocate(x2(2, 3, pos+1, 5)) | |

allocate(x1(5), x2(2,4), a1%x(5), a2(1,2)%x(4)) | |

allocate(x1(2), a1%x(2,5), a2(1,2)%x(2)) | |

! Test the check is not influenced by SOURCE | |

allocate(a1%x(5, 4, 3), SOURCE=xsrc2a(1:5, 1:4, 1:3)) | |

allocate(x2(5), MOLD=xsrc1a(1:5)) | |

allocate(a1%x(5, 4, 3), MOLD=xsrc1b) | |

allocate(x2(5), SOURCE=xsrc2b) | |

! C945b: If SOURCE= appears, source-expr shall be a scalar or have the same | |

! rank as each allocate-object. | |

!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE | |

allocate(x0, SOURCE=xsrc1b) | |

!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE | |

allocate(x2(2, 5, 7), SOURCE=xsrc1a(2:7)) | |

!ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE | |

allocate(x2(2, 5, 7), SOURCE=xsrc1c) | |

allocate(x1(5), SOURCE=xsrc2a(4:8, 1:12, 2:5)) | |

allocate(x1(3), SOURCE=cos(xsrc2b)) | |

allocate(x1(100), SOURCE=xsrc2c) | |

allocate(a1%x(10), x2(20, 30, 40), a2(1,2)%x(50), SOURCE=xsrc1c) | |

allocate(a1%x(25), SOURCE=xsrc2b) | |

end subroutine | |

subroutine C940(a1, pos) | |

! If allocate-object is scalar, allocate-shape-spec-list shall not appear. | |

type A | |

integer(kind=8), allocatable :: i | |

end type | |

type B(k, l1, l2, l3) | |

integer, kind :: k | |

integer, len :: l1, l2, l3 | |

real(kind=k) x(-1:l1, 0:l2, 1:l3) | |

end type | |

integer pos | |

class(A), allocatable :: a1(:) | |

real, pointer :: x | |

type(B(8,4,5,6)), allocatable :: b1 | |

! Nominal | |

allocate(x) | |

allocate(a1(pos)%i) | |

allocate(b1) | |

!ERROR: Shape specifications must not appear when allocatable object is scalar | |

allocate(x(pos)) | |

!ERROR: Shape specifications must not appear when allocatable object is scalar | |

allocate(a1(pos)%i(5:2)) | |

!ERROR: Shape specifications must not appear when allocatable object is scalar | |

allocate(b1(1)) | |

end subroutine |