1! RUN: not %flang_fc1 %s 2>&1 | FileCheck %s
2! Check errors found in folding
3! TODO: test others emitted from flang/lib/Evaluate
4module m
5 contains
6  subroutine s1(a,b)
7    real :: a(*), b(:)
8    !CHECK: error: DIM=1 dimension is out of range for rank-1 assumed-size array
9    integer :: ub1(ubound(a,1))
10    !CHECK-NOT: error: DIM=1 dimension is out of range for rank-1 assumed-size array
11    integer :: lb1(lbound(a,1))
12    !CHECK: error: DIM=0 dimension is out of range for rank-1 array
13    integer :: ub2(ubound(a,0))
14    !CHECK: error: DIM=2 dimension is out of range for rank-1 array
15    integer :: ub3(ubound(a,2))
16    !CHECK: error: DIM=0 dimension is out of range for rank-1 array
17    integer :: lb2(lbound(b,0))
18    !CHECK: error: DIM=2 dimension is out of range for rank-1 array
19    integer :: lb3(lbound(b,2))
20  end subroutine
21  subroutine s2
22    integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
23    integer :: x(2, 3)
24    !CHECK: error: Invalid 'dim=' argument (0) in CSHIFT
25    x = cshift(array, [1, 2], dim=0)
26    !CHECK: error: Invalid 'shift=' argument in CSHIFT: extent on dimension 1 is 2 but must be 3
27    x = cshift(array, [1, 2], dim=1)
28  end subroutine
29  subroutine s3
30    integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
31    integer :: x(2, 3)
32    !CHECK: error: Invalid 'dim=' argument (0) in EOSHIFT
33    x = eoshift(array, [1, 2], dim=0)
34    !CHECK: error: Invalid 'shift=' argument in EOSHIFT: extent on dimension 1 is 2 but must be 3
35    x = eoshift(array, [1, 2], dim=1)
36    !CHECK: error: Invalid 'boundary=' argument in EOSHIFT: extent on dimension 1 is 3 but must be 2
37    x = eoshift(array, 1, [0, 0, 0], 2)
38  end subroutine
39  subroutine s4
40    integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
41    logical, parameter :: mask(*,*) = reshape([(.true., j=1,3),(.false., j=1,3)], shape(array))
42    integer :: x(3)
43    !CHECK: error: Invalid 'vector=' argument in PACK: the 'mask=' argument has 3 true elements, but the vector has only 2 elements
44    x = pack(array, mask, [0,0])
45  end subroutine
46  subroutine s5
47    logical, parameter :: mask(2,3) = reshape([.false., .true., .true., .false., .false., .true.], shape(mask))
48    integer, parameter :: field(3,2) = reshape([(-j,j=1,6)], shape(field))
49    integer :: x(2,3)
50    !CHECK: error: Invalid 'vector=' argument in UNPACK: the 'mask=' argument has 3 true elements, but the vector has only 2 elements
51    x = unpack([1,2], mask, 0)
52  end subroutine
53  subroutine s6
54    !CHECK: error: POS=-1 out of range for BTEST
55    logical, parameter :: bad1 = btest(0, -1)
56    !CHECK: error: POS=32 out of range for BTEST
57    logical, parameter :: bad2 = btest(0, 32)
58    !CHECK-NOT: error: POS=33 out of range for BTEST
59    logical, parameter :: ok1 = btest(0_8, 33)
60    !CHECK: error: POS=64 out of range for BTEST
61    logical, parameter :: bad4 = btest(0_8, 64)
62  end subroutine
63  subroutine s7
64    !CHECK: error: SHIFT=-33 count for ishft is less than -32
65    integer, parameter :: bad1 = ishft(1, -33)
66    integer, parameter :: ok1 = ishft(1, -32)
67    integer, parameter :: ok2 = ishft(1, 32)
68    !CHECK: error: SHIFT=33 count for ishft is greater than 32
69    integer, parameter :: bad2 = ishft(1, 33)
70    !CHECK: error: SHIFT=-65 count for ishft is less than -64
71    integer(8), parameter :: bad3 = ishft(1_8, -65)
72    integer(8), parameter :: ok3 = ishft(1_8, -64)
73    integer(8), parameter :: ok4 = ishft(1_8, 64)
74    !CHECK: error: SHIFT=65 count for ishft is greater than 64
75    integer(8), parameter :: bad4 = ishft(1_8, 65)
76  end subroutine
77  subroutine s8
78    !CHECK: error: SHIFT=-33 count for shiftl is negative
79    integer, parameter :: bad1 = shiftl(1, -33)
80    !CHECK: error: SHIFT=-32 count for shiftl is negative
81    integer, parameter :: bad2 = shiftl(1, -32)
82    integer, parameter :: ok1 = shiftl(1, 32)
83    !CHECK: error: SHIFT=33 count for shiftl is greater than 32
84    integer, parameter :: bad3 = shiftl(1, 33)
85    !CHECK: error: SHIFT=-65 count for shiftl is negative
86    integer(8), parameter :: bad4 = shiftl(1_8, -65)
87    !CHECK: error: SHIFT=-64 count for shiftl is negative
88    integer(8), parameter :: bad5 = shiftl(1_8, -64)
89    integer(8), parameter :: ok2 = shiftl(1_8, 64)
90    !CHECK: error: SHIFT=65 count for shiftl is greater than 64
91    integer(8), parameter :: bad6 = shiftl(1_8, 65)
92  end subroutine
93  subroutine s9
94    integer, parameter :: rank15(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) = 1
95    !CHECK: error: SOURCE= argument to SPREAD has rank 15 but must have rank less than 15
96    integer, parameter :: bad1 = spread(rank15, 1, 1)
97    integer, parameter :: matrix(2, 2) = reshape([1, 2, 3, 4], [2, 2])
98    !CHECK: error: DIM=0 argument to SPREAD must be between 1 and 3
99    integer, parameter :: bad2 = spread(matrix, 0, 1)
100    !CHECK: error: DIM=4 argument to SPREAD must be between 1 and 3
101    integer, parameter :: bad3 = spread(matrix, 4, 1)
102  end subroutine
103  subroutine warnings
104    real, parameter :: ok1 = scale(0.0, 99999) ! 0.0
105    real, parameter :: ok2 = scale(1.0, -99999) ! 0.0
106    !CHECK: SCALE intrinsic folding overflow
107    real, parameter :: bad1 = scale(1.0, 99999)
108  end subroutine
109end module
110