xref: /llvm-project/flang/test/Semantics/select-rank03.f90 (revision 9ab292d72651c6dda098a653320f7fbb3624b778)
1031b4e5eSPeter Klausler! RUN: %python %S/test_errors.py %s %flang_fc1
2031b4e5eSPeter Klauslerprogram test
3031b4e5eSPeter Klausler  real, allocatable :: a0, a1(:)
4031b4e5eSPeter Klausler  real, pointer :: p0, p1(:)
5031b4e5eSPeter Klausler  real, target :: t0, t1(1)
6031b4e5eSPeter Klausler contains
7031b4e5eSPeter Klausler  subroutine allocatables(a)
8031b4e5eSPeter Klausler    real, allocatable :: a(..)
9031b4e5eSPeter Klausler    select rank(a)
10031b4e5eSPeter Klausler    rank (0)
11031b4e5eSPeter Klausler      allocate(a) ! ok
12031b4e5eSPeter Klausler      deallocate(a) ! ok
13031b4e5eSPeter Klausler      allocate(a, source=a0) ! ok
14031b4e5eSPeter Klausler      allocate(a, mold=p0) ! ok
15031b4e5eSPeter Klausler      a = 1. ! ok
16031b4e5eSPeter Klausler      !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar REAL(4) and rank 1 array of REAL(4)
17031b4e5eSPeter Klausler      a = [1.]
18031b4e5eSPeter Klausler      !ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
19031b4e5eSPeter Klausler      allocate(a, source=a1)
20031b4e5eSPeter Klausler      allocate(a, mold=p1) ! ok, mold= ignored
21031b4e5eSPeter Klausler    rank (1)
22031b4e5eSPeter Klausler      allocate(a(1)) ! ok
23031b4e5eSPeter Klausler      deallocate(a) ! ok
24031b4e5eSPeter Klausler      a = 1. ! ok
25031b4e5eSPeter Klausler      a = [1.] ! ok
26031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
27031b4e5eSPeter Klausler      allocate(a, source=a0)
28031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
29031b4e5eSPeter Klausler      allocate(a, mold=p0)
30031b4e5eSPeter Klausler      allocate(a, source=a1) ! ok
31031b4e5eSPeter Klausler      allocate(a, mold=p1) ! ok
32031b4e5eSPeter Klausler    rank (2)
33031b4e5eSPeter Klausler      allocate(a(1,1)) ! ok
34031b4e5eSPeter Klausler      deallocate(a) ! ok
35031b4e5eSPeter Klausler      a = 1. ! ok
36031b4e5eSPeter Klausler      !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches rank 2 array of REAL(4) and rank 1 array of REAL(4)
37031b4e5eSPeter Klausler      a = [1.]
38031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
39031b4e5eSPeter Klausler      allocate(a, source=a0)
40031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
41031b4e5eSPeter Klausler      allocate(a, mold=p0)
42031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
43031b4e5eSPeter Klausler      allocate(a, source=a1)
44031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
45031b4e5eSPeter Klausler      allocate(a, mold=p1)
464fed5959SPeter Klausler    !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE
47031b4e5eSPeter Klausler    rank (*)
484fed5959SPeter Klausler      !ERROR: Whole assumed-size array 'a' may not appear here without subscripts
49031b4e5eSPeter Klausler      allocate(a)
504fed5959SPeter Klausler      !ERROR: Whole assumed-size array 'a' may not appear here without subscripts
51031b4e5eSPeter Klausler      deallocate(a)
524fed5959SPeter Klausler      !ERROR: Whole assumed-size array 'a' may not appear here without subscripts
53031b4e5eSPeter Klausler      a = 1.
54031b4e5eSPeter Klausler    rank default
55*9ab292d7SPeter Klausler      !ERROR: An assumed-rank dummy argument may not appear in an ALLOCATE statement
56031b4e5eSPeter Klausler      allocate(a)
57031b4e5eSPeter Klausler      deallocate(a)
58*9ab292d7SPeter Klausler      !ERROR: An assumed-rank dummy argument is not allowed in an assignment statement
59*9ab292d7SPeter Klausler      !ERROR: An assumed-rank dummy argument is not allowed as an operand here
60*9ab292d7SPeter Klausler      a = a + 1.
61031b4e5eSPeter Klausler    end select
6268227087SPeter Klausler    ! Test nested associations
6368227087SPeter Klausler    select rank(a)
6468227087SPeter Klausler    rank default
6568227087SPeter Klausler      select rank(a)
6668227087SPeter Klausler      rank default
6768227087SPeter Klausler        select rank(a)
6868227087SPeter Klausler        rank (0)
6968227087SPeter Klausler          allocate(a) ! ok
7068227087SPeter Klausler          deallocate(a) ! ok
7168227087SPeter Klausler        rank (1)
7268227087SPeter Klausler          allocate(a(1)) ! ok
7368227087SPeter Klausler          deallocate(a) ! ok
7468227087SPeter Klausler        end select
7568227087SPeter Klausler      end select
7668227087SPeter Klausler    end select
77031b4e5eSPeter Klausler  end
78031b4e5eSPeter Klausler  subroutine pointers(p)
79031b4e5eSPeter Klausler    real, pointer :: p(..)
80031b4e5eSPeter Klausler    select rank(p)
81031b4e5eSPeter Klausler    rank (0)
82031b4e5eSPeter Klausler      allocate(p) ! ok
83031b4e5eSPeter Klausler      deallocate(p) ! ok
84031b4e5eSPeter Klausler      allocate(p, source=a0) ! ok
85031b4e5eSPeter Klausler      allocate(p, mold=p0) ! ok
86031b4e5eSPeter Klausler      !ERROR: If SOURCE appears, the related expression must be scalar or have the same rank as each allocatable object in ALLOCATE
87031b4e5eSPeter Klausler      allocate(p, source=a1)
88031b4e5eSPeter Klausler      allocate(p, mold=p1) ! ok, mold ignored
89031b4e5eSPeter Klausler      p => t0 ! ok
90031b4e5eSPeter Klausler      !ERROR: Pointer has rank 0 but target has rank 1
91031b4e5eSPeter Klausler      p => t1
92031b4e5eSPeter Klausler    rank (1)
93031b4e5eSPeter Klausler      allocate(p(1)) ! ok
94031b4e5eSPeter Klausler      deallocate(p) ! ok
95031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
96031b4e5eSPeter Klausler      allocate(p, source=a0)
97031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
98031b4e5eSPeter Klausler      allocate(p, mold=p0)
99031b4e5eSPeter Klausler      allocate(p, source=a1) ! ok
100031b4e5eSPeter Klausler      allocate(p, mold=p1) ! ok
101031b4e5eSPeter Klausler      !ERROR: Pointer has rank 1 but target has rank 0
102031b4e5eSPeter Klausler      p => t0
103031b4e5eSPeter Klausler      p => t1 ! ok
104031b4e5eSPeter Klausler    rank (2)
105031b4e5eSPeter Klausler      allocate(p(1,1)) ! ok
106031b4e5eSPeter Klausler      deallocate(p) ! ok
107031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
108031b4e5eSPeter Klausler      allocate(p, source=a0)
109031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
110031b4e5eSPeter Klausler      allocate(p, mold=p0)
111031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
112031b4e5eSPeter Klausler      allocate(p, source=a1)
113031b4e5eSPeter Klausler      !ERROR: Arrays in ALLOCATE must have a shape specification or an expression of the same rank must appear in SOURCE or MOLD
114031b4e5eSPeter Klausler      allocate(p, mold=p1)
115031b4e5eSPeter Klausler      !ERROR: Pointer has rank 2 but target has rank 0
116031b4e5eSPeter Klausler      p => t0
117031b4e5eSPeter Klausler      !ERROR: Pointer has rank 2 but target has rank 1
118031b4e5eSPeter Klausler      p => t1
1194fed5959SPeter Klausler    !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE
120031b4e5eSPeter Klausler    rank (*)
1214fed5959SPeter Klausler      !ERROR: Whole assumed-size array 'p' may not appear here without subscripts
122031b4e5eSPeter Klausler      allocate(p)
1234fed5959SPeter Klausler      !ERROR: Whole assumed-size array 'p' may not appear here without subscripts
124031b4e5eSPeter Klausler      deallocate(p)
125031b4e5eSPeter Klausler    rank default
126*9ab292d7SPeter Klausler      !ERROR: An assumed-rank dummy argument may not appear in an ALLOCATE statement
127031b4e5eSPeter Klausler      allocate(p)
128031b4e5eSPeter Klausler      deallocate(p)
129*9ab292d7SPeter Klausler      !ERROR: The left-hand side of a pointer assignment must not be an assumed-rank dummy argument
130031b4e5eSPeter Klausler      !ERROR: pointer 'p' associated with object 't0' with incompatible type or shape
131031b4e5eSPeter Klausler      p => t0
132*9ab292d7SPeter Klausler      !ERROR: The left-hand side of a pointer assignment must not be an assumed-rank dummy argument
133031b4e5eSPeter Klausler      !ERROR: pointer 'p' associated with object 't1' with incompatible type or shape
134031b4e5eSPeter Klausler      p => t1
135031b4e5eSPeter Klausler    end select
136031b4e5eSPeter Klausler  end
137f06ea103SPeter Klausler  subroutine undefinable(p)
138f06ea103SPeter Klausler    real, pointer, intent(in) :: p(..)
139f06ea103SPeter Klausler    real, target :: t
140f06ea103SPeter Klausler    select rank(p)
141f06ea103SPeter Klausler    rank (0)
142f06ea103SPeter Klausler      !ERROR: The left-hand side of a pointer assignment is not definable
143f06ea103SPeter Klausler      !BECAUSE: 'p' is an INTENT(IN) dummy argument
144f06ea103SPeter Klausler      p => t
145f06ea103SPeter Klausler      !ERROR: Name in DEALLOCATE statement is not definable
146f06ea103SPeter Klausler      !BECAUSE: 'p' is an INTENT(IN) dummy argument
147f06ea103SPeter Klausler      deallocate(p)
148f06ea103SPeter Klausler    !ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE
149f06ea103SPeter Klausler    rank (*)
150f06ea103SPeter Klausler      !ERROR: Whole assumed-size array 'p' may not appear here without subscripts
151f06ea103SPeter Klausler      !ERROR: Name in DEALLOCATE statement is not definable
152f06ea103SPeter Klausler      !BECAUSE: 'p' is an INTENT(IN) dummy argument
153f06ea103SPeter Klausler      deallocate(p)
154f06ea103SPeter Klausler    rank default
155f06ea103SPeter Klausler      !ERROR: Name in DEALLOCATE statement is not definable
156f06ea103SPeter Klausler      !BECAUSE: 'p' is an INTENT(IN) dummy argument
157f06ea103SPeter Klausler      deallocate(p)
158f06ea103SPeter Klausler    end select
159f06ea103SPeter Klausler  end
160031b4e5eSPeter Klauslerend
161