1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
|
! RUN: not %flang_fc1 %s 2>&1 | FileCheck %s
! Check errors found in folding
! TODO: test others emitted from flang/lib/Evaluate
module m
type t
real x
end type t
contains
subroutine s1(a,b)
real :: a(*), b(:)
!CHECK: error: DIM=1 dimension is out of range for rank-1 assumed-size array
integer :: ub1(ubound(a,1))
!CHECK-NOT: error: DIM=1 dimension is out of range for rank-1 assumed-size array
integer :: lb1(lbound(a,1))
!CHECK: error: DIM=0 dimension is out of range for rank-1 array
integer :: ub2(ubound(a,0))
!CHECK: error: DIM=2 dimension is out of range for rank-1 array
integer :: ub3(ubound(a,2))
!CHECK: error: DIM=0 dimension is out of range for rank-1 array
integer :: lb2(lbound(b,0))
!CHECK: error: DIM=2 dimension is out of range for rank-1 array
integer :: lb3(lbound(b,2))
end subroutine
subroutine s2
integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
integer :: x(2, 3)
!CHECK: error: Invalid 'dim=' argument (0) in CSHIFT
x = cshift(array, [1, 2], dim=0)
!CHECK: error: Invalid 'shift=' argument in CSHIFT: extent on dimension 1 is 2 but must be 3
x = cshift(array, [1, 2], dim=1)
end subroutine
subroutine s3
integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
integer :: x(2, 3)
!CHECK: error: Invalid 'dim=' argument (0) in EOSHIFT
x = eoshift(array, [1, 2], dim=0)
!CHECK: error: Invalid 'shift=' argument in EOSHIFT: extent on dimension 1 is 2 but must be 3
x = eoshift(array, [1, 2], dim=1)
!CHECK: error: Invalid 'boundary=' argument in EOSHIFT: extent on dimension 1 is 3 but must be 2
x = eoshift(array, 1, [0, 0, 0], 2)
end subroutine
subroutine s4
integer, parameter :: array(2,3) = reshape([(j, j=1, 6)], shape(array))
logical, parameter :: mask(*,*) = reshape([(.true., j=1,3),(.false., j=1,3)], shape(array))
integer :: x(3)
!CHECK: error: Invalid 'vector=' argument in PACK: the 'mask=' argument has 3 true elements, but the vector has only 2 elements
x = pack(array, mask, [0,0])
end subroutine
subroutine s5
logical, parameter :: mask(2,3) = reshape([.false., .true., .true., .false., .false., .true.], shape(mask))
integer, parameter :: field(3,2) = reshape([(-j,j=1,6)], shape(field))
integer :: x(2,3)
!CHECK: error: Invalid 'vector=' argument in UNPACK: the 'mask=' argument has 3 true elements, but the vector has only 2 elements
x = unpack([1,2], mask, 0)
end subroutine
subroutine s6
!CHECK: error: POS=-1 out of range for BTEST
logical, parameter :: bad1 = btest(0, -1)
!CHECK: error: POS=32 out of range for BTEST
logical, parameter :: bad2 = btest(0, 32)
!CHECK-NOT: error: POS=33 out of range for BTEST
logical, parameter :: ok1 = btest(0_8, 33)
!CHECK: error: POS=64 out of range for BTEST
logical, parameter :: bad4 = btest(0_8, 64)
end subroutine
subroutine s7
!CHECK: error: SHIFT=-33 count for ishft is less than -32
integer, parameter :: bad1 = ishft(1, -33)
integer, parameter :: ok1 = ishft(1, -32)
integer, parameter :: ok2 = ishft(1, 32)
!CHECK: error: SHIFT=33 count for ishft is greater than 32
integer, parameter :: bad2 = ishft(1, 33)
!CHECK: error: SHIFT=-65 count for ishft is less than -64
integer(8), parameter :: bad3 = ishft(1_8, -65)
integer(8), parameter :: ok3 = ishft(1_8, -64)
integer(8), parameter :: ok4 = ishft(1_8, 64)
!CHECK: error: SHIFT=65 count for ishft is greater than 64
integer(8), parameter :: bad4 = ishft(1_8, 65)
end subroutine
subroutine s8
!CHECK: error: SHIFT=-33 count for shiftl is negative
integer, parameter :: bad1 = shiftl(1, -33)
!CHECK: error: SHIFT=-32 count for shiftl is negative
integer, parameter :: bad2 = shiftl(1, -32)
integer, parameter :: ok1 = shiftl(1, 32)
!CHECK: error: SHIFT=33 count for shiftl is greater than 32
integer, parameter :: bad3 = shiftl(1, 33)
!CHECK: error: SHIFT=-65 count for shiftl is negative
integer(8), parameter :: bad4 = shiftl(1_8, -65)
!CHECK: error: SHIFT=-64 count for shiftl is negative
integer(8), parameter :: bad5 = shiftl(1_8, -64)
integer(8), parameter :: ok2 = shiftl(1_8, 64)
!CHECK: error: SHIFT=65 count for shiftl is greater than 64
integer(8), parameter :: bad6 = shiftl(1_8, 65)
end subroutine
subroutine s9
integer, parameter :: rank15(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1) = 1
!CHECK: error: SOURCE= argument to SPREAD has rank 15 but must have rank less than 15
integer, parameter :: bad1 = spread(rank15, 1, 1)
integer, parameter :: matrix(2, 2) = reshape([1, 2, 3, 4], [2, 2])
!CHECK: error: DIM=0 argument to SPREAD must be between 1 and 3
integer, parameter :: bad2 = spread(matrix, 0, 1)
!CHECK: error: DIM=4 argument to SPREAD must be between 1 and 3
integer, parameter :: bad3 = spread(matrix, 4, 1)
end subroutine
subroutine s10
!CHECK: warning: CHAR(I=-1) is out of range for CHARACTER(KIND=1)
character(kind=1), parameter :: badc11 = char(-1,kind=1)
!CHECK: warning: ACHAR(I=-1) is out of range for CHARACTER(KIND=1)
character(kind=1), parameter :: bada11 = achar(-1,kind=1)
!CHECK: warning: CHAR(I=-1) is out of range for CHARACTER(KIND=2)
character(kind=2), parameter :: badc21 = char(-1,kind=2)
!CHECK: warning: ACHAR(I=-1) is out of range for CHARACTER(KIND=2)
character(kind=2), parameter :: bada21 = achar(-1,kind=2)
!CHECK: warning: CHAR(I=-1) is out of range for CHARACTER(KIND=4)
character(kind=4), parameter :: badc41 = char(-1,kind=4)
!CHECK: warning: ACHAR(I=-1) is out of range for CHARACTER(KIND=4)
character(kind=4), parameter :: bada41 = achar(-1,kind=4)
!CHECK: warning: CHAR(I=256) is out of range for CHARACTER(KIND=1)
character(kind=1), parameter :: badc12 = char(256,kind=1)
!CHECK: warning: ACHAR(I=256) is out of range for CHARACTER(KIND=1)
character(kind=1), parameter :: bada12 = achar(256,kind=1)
!CHECK: warning: CHAR(I=65536) is out of range for CHARACTER(KIND=2)
character(kind=2), parameter :: badc22 = char(65536,kind=2)
!CHECK: warning: ACHAR(I=65536) is out of range for CHARACTER(KIND=2)
character(kind=2), parameter :: bada22 = achar(65536,kind=2)
!CHECK: warning: CHAR(I=4294967296) is out of range for CHARACTER(KIND=4)
character(kind=4), parameter :: badc42 = char(4294967296_8,kind=4)
!CHECK: warning: ACHAR(I=4294967296) is out of range for CHARACTER(KIND=4)
character(kind=4), parameter :: bada42 = achar(4294967296_8,kind=4)
end subroutine
subroutine s11
character(:), allocatable :: x1
!CHECK: error: Invalid specification expression: non-constant inquiry function 'len' not allowed for local object
character(len(x1)) :: x2
real, allocatable :: x3(:)
!CHECK: error: Invalid specification expression: non-constant descriptor inquiry not allowed for local object
real :: x4(size(x3))
end
subroutine s12(x,y)
class(t), intent(in) :: x
class(*), intent(in) :: y
!CHERK: error: Must be a constant value
integer, parameter :: bad1 = storage_size(x)
!CHERK: error: Must be a constant value
integer, parameter :: bad2 = storage_size(y)
end subroutine
subroutine s13
!CHECK: portability: Result of REPEAT() is too large to compute at compilation time (1.1259e+15 characters)
print *, repeat(repeat(' ', 2**20), 2**30)
!CHECK: error: NCOPIES= argument to REPEAT() should be nonnegative, but is -666
print *, repeat(' ', -666)
end subroutine
subroutine warnings
real, parameter :: ok1 = scale(0.0, 99999) ! 0.0
real, parameter :: ok2 = scale(1.0, -99999) ! 0.0
!CHECK: SCALE intrinsic folding overflow
real, parameter :: bad1 = scale(1.0, 99999)
!CHECK: complex ABS intrinsic folding overflow
real, parameter :: bad2 = abs(cmplx(huge(0.),huge(0.)))
!CHECK: warning: DIM intrinsic folding overflow
real, parameter :: bad3 = dim(huge(1.),-.5*huge(1.))
!CHECK: warning: DIM intrinsic folding overflow
integer, parameter :: bad4 = dim(huge(1),-1)
!CHECK: warning: overflow on REAL(8) to REAL(4) conversion
x = 1.D40
end subroutine
end module
|