The data statement variable checker is missing some cases, like expressions that are not variables. Run the checker first to enjoy its very specific error messages, but when it finds no problems, still apply a general check that an expression is a "variable" and also not a constant expression at the top level as a backstop. Differential Revision: https://reviews.llvm.org/D146580
93 lines
2.9 KiB
Fortran
93 lines
2.9 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1
|
|
!Testing data constraints : C874 - C875, C878 - C881
|
|
module m
|
|
integer, target :: modarray(1)
|
|
contains
|
|
function f(i)
|
|
integer, intent(in) :: i
|
|
integer, pointer :: f
|
|
f => modarray(i)
|
|
end
|
|
subroutine CheckObject
|
|
type specialNumbers
|
|
integer one
|
|
integer numbers(5)
|
|
end type
|
|
type large
|
|
integer elt(10)
|
|
integer val
|
|
type(specialNumbers) nums
|
|
type(specialNumbers) numsArray(5)
|
|
end type
|
|
type(specialNumbers), parameter ::newNums = &
|
|
specialNumbers(1, (/ 1, 2, 3, 4, 5 /))
|
|
type(specialNumbers), parameter ::newNumsArray(2) = &
|
|
(/ SpecialNumbers(1, (/ 1, 2, 3, 4, 5 /)), &
|
|
SpecialNumbers(1, (/ 1, 2, 3,4, 5 /)) /)
|
|
type(specialNumbers) nums
|
|
type(large) largeArray(5)
|
|
type(large) largeNumber
|
|
real :: a[*]
|
|
real :: b(5)
|
|
integer :: x
|
|
real, parameter:: c(5) = (/ 1, 2, 3, 4, 5 /)
|
|
integer :: d(10, 10)
|
|
character :: name(12)
|
|
integer :: ind = 2
|
|
!ERROR: Data statement object must be a variable
|
|
DATA name%len / 666 /
|
|
!C874
|
|
!ERROR: Data object must not be a coindexed variable
|
|
DATA a[1] / 1 /
|
|
!C874
|
|
!ERROR: Data object must not be a coindexed variable
|
|
DATA(a[i], i = 1, 5) / 5 * 1 /
|
|
!C875
|
|
!ERROR: Data object variable must not be a function reference
|
|
DATA f(1) / 1 /
|
|
!C875
|
|
!ERROR: Data object must have constant subscripts
|
|
DATA b(ind) / 1 /
|
|
!C875
|
|
!ERROR: Data object must have constant subscripts
|
|
DATA name( : ind) / 'Ancd' /
|
|
!C875
|
|
!ERROR: Data object must have constant subscripts
|
|
DATA name(ind:) / 'Ancd' /
|
|
!C878
|
|
!ERROR: Data implied do object must be a variable
|
|
DATA(c(i), i = 1, 5) / 5 * 1 /
|
|
!C878
|
|
!ERROR: Data implied do object must be a variable
|
|
DATA(newNumsArray(i), i = 1, 2) &
|
|
/ specialNumbers(1, 2 * (/ 1, 2, 3, 4, 5 /)) /
|
|
!C880
|
|
!ERROR: Data implied do structure component must be subscripted
|
|
DATA(nums % one, i = 1, 5) / 5 * 1 /
|
|
!C879
|
|
!ERROR: Data implied do object must be a variable
|
|
DATA(newNums % numbers(i), i = 1, 5) / 5 * 1 /
|
|
!C879
|
|
!ERROR: Data implied do object must be a variable
|
|
DATA(newNumsArray(i) % one, i = 1, 5) / 5 * 1 /
|
|
!C880
|
|
!OK: Correct use
|
|
DATA(largeArray(j) % nums % one, j = 1, 5) / 5 * 1 /
|
|
!C880
|
|
!OK: Correct use
|
|
DATA(largeNumber % numsArray(j) % one, j = 1, 5) / 5 * 1 /
|
|
!C881
|
|
!ERROR: Data object must have constant subscripts
|
|
DATA(b(x), i = 1, 5) / 5 * 1 /
|
|
!C881
|
|
!OK: Correct use
|
|
DATA(nums % numbers(i), i = 1, 5) / 5 * 1 /
|
|
!C881
|
|
!OK: Correct use
|
|
DATA((d(i, j), i = 1, 10), j = 1, 10) / 100 * 1 /
|
|
!C881
|
|
!OK: Correct use
|
|
DATA(d(i, 1), i = 1, 10) / 10 * 1 /
|
|
end
|
|
end
|