llvm-project/flang/test/Semantics/select-rank.f90
Peter Klausler cb1b846eda
[flang] Improve error reporting for procedures determined by usage (#88184)
When a symbol is known to be a procedure due to its being referenced as
a function or subroutine, improve the error messages that appear if the
symbol is also used as an object by attaching the source location of its
procedural use. Also, for errors spotted in name resolution due to how a
given symbol has been used, don't unconditionally set the symbol's error
flag (which is otherwise generally a good idea, to prevent cascades of
errors), so that more unrelated errors related to usage will appear.
2024-04-22 14:27:39 -07:00

268 lines
6.7 KiB
Fortran

! RUN: %python %S/test_errors.py %s %flang_fc1
!Tests for SELECT RANK Construct(R1148)
program select_rank
implicit none
integer, dimension(10:30, 10:20, -1:20) :: x
integer, parameter :: y(*) = [1,2,3,4]
integer, dimension(5) :: z
integer, allocatable :: a(:)
allocate(a(10:20))
call CALL_SHAPE(x)
call CALL_SHAPE(y)
call CALL_SHAPE(z)
call CALL_SHAPE(a)
contains
!No error expected
subroutine CALL_ME(x)
implicit none
integer :: x(..)
SELECT RANK(x)
RANK (0)
print *, "PRINT RANK 0"
RANK (1)
print *, "PRINT RANK 1"
END SELECT
end
subroutine CALL_ME9(x)
implicit none
integer :: x(..),j
boo: SELECT RANK(x)
RANK (1+0)
print *, "PRINT RANK 1"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == (1+0)))
END SELECT boo
end subroutine
!Error expected
subroutine CALL_ME2(x)
implicit none
integer :: x(..)
integer :: y(3),j
!ERROR: Selector 'y' is not an assumed-rank array variable
SELECT RANK(y)
RANK (0)
print *, "PRINT RANK 0"
RANK (1)
print *, "PRINT RANK 1"
END SELECT
SELECT RANK(x)
RANK(0)
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 0)) ! will fail when RANK(x) is not zero here
END SELECT
end subroutine
subroutine CALL_ME3(x)
implicit none
integer :: x(..),j
SELECT RANK(x)
!ERROR: The value of the selector must be between zero and 15
RANK (16)
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 16))
END SELECT
end subroutine
subroutine CALL_ME4(x)
implicit none
integer :: x(..)
SELECT RANK(x)
RANK DEFAULT
print *, "ok "
!ERROR: Not more than one of the selectors of SELECT RANK statement may be DEFAULT
RANK DEFAULT
print *, "not ok"
RANK (3)
print *, "IT'S 3"
END SELECT
end subroutine
subroutine CALL_ME5(x)
implicit none
integer :: x(..),j
SELECT RANK(x)
RANK (0)
print *, "PRINT RANK 0"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 0))
RANK(1)
print *, "PRINT RANK 1"
!ERROR: Same rank value (0) not allowed more than once
RANK(0)
print *, "ERROR"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 0))
RANK(1+1)
!ERROR: Same rank value (2) not allowed more than once
RANK(1+1)
END SELECT
end subroutine
subroutine CALL_ME6(x)
implicit none
integer :: x(..),j
SELECT RANK(x)
RANK (3)
print *, "one"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 3))
!ERROR: The value of the selector must be between zero and 15
RANK(-1)
print *, "rank: negative"
!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == -1))
END SELECT
end subroutine
subroutine CALL_ME7(arg)
implicit none
integer :: i,j
integer, dimension(..), pointer :: arg
integer, pointer :: arg2
select RANK(arg)
!ERROR: RANK (*) cannot be used when selector is POINTER or ALLOCATABLE
RANK (*)
print *, arg(1:1)
RANK (1)
print *, arg
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(arg) == 1))
end select
!ERROR: Selector 'arg2' is not an assumed-rank array variable
select RANK(arg2)
RANK (*)
print *,"This would lead to crash when saveSelSymbol has std::nullptr"
RANK (1)
print *, "Rank is 1"
end select
end subroutine
subroutine CALL_ME8(x)
implicit none
integer :: x(..),j
SELECT RANK(x)
Rank(2)
print *, "Now it's rank 2 "
RANK (*)
print *, "Going for another rank"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 1))
!ERROR: Not more than one of the selectors of SELECT RANK statement may be '*'
RANK (*)
print *, "This is Wrong"
END SELECT
end subroutine
subroutine CALL_ME10(x)
implicit none
integer:: x(..), a=10,b=20,j
integer, dimension(5) :: arr = (/1,2,3,4,5/),brr
integer :: const_variable=10
integer, pointer :: ptr,nullptr=>NULL()
type derived
character(len = 50) :: title
end type derived
type(derived) :: obj1
SELECT RANK(x)
Rank(2)
print *, "Now it's rank 2 "
RANK (*)
print *, "Going for a other rank"
!ERROR: Not more than one of the selectors of SELECT RANK statement may be '*'
RANK (*)
print *, "This is Wrong"
END SELECT
!ERROR: Selector 'brr' is not an assumed-rank array variable
SELECT RANK(ptr=>brr)
!ERROR: Must be a constant value
RANK(const_variable)
print *, "PRINT RANK 3"
!j = INT(0, KIND=MERGE(KIND(0), -1, RANK(ptr) == 1))
!ERROR: Must be a constant value
RANK(nullptr)
print *, "PRINT RANK 3"
END SELECT
!ERROR: Selector 'x(1) + x(2)' is not an assumed-rank array variable
SELECT RANK (x(1) + x(2))
END SELECT
!ERROR: Selector 'x(1)' is not an assumed-rank array variable
SELECT RANK(x(1))
END SELECT
!ERROR: Selector 'x(1:2)' is not an assumed-rank array variable
SELECT RANK(x(1:2))
END SELECT
!ERROR: 'x' is not an object of derived type
SELECT RANK(x(1)%x(2))
END SELECT
!ERROR: Selector 'obj1%title' is not an assumed-rank array variable
SELECT RANK(obj1%title)
END SELECT
!ERROR: Selector 'arr(1:2)+ arr(4:5)' is not an assumed-rank array variable
SELECT RANK(arr(1:2)+ arr(4:5))
END SELECT
SELECT RANK(ptr=>x)
RANK (3)
PRINT *, "PRINT RANK 3"
!ERROR: 'kind=' argument must be a constant scalar integer whose value is a supported kind for the intrinsic result type
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(ptr) == 0))
RANK (1)
PRINT *, "PRINT RANK 1"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(ptr) == 1))
END SELECT
end subroutine
subroutine CALL_ME_TYPES(x)
implicit none
integer :: x(..),j
SELECT RANK(x)
!ERROR: Must have INTEGER type, but is LOGICAL(4)
RANK(.TRUE.)
!ERROR: Must have INTEGER type, but is REAL(4)
RANK(1.0)
!ERROR: Must be a constant value
RANK(RANK(x))
!ERROR: Must have INTEGER type, but is CHARACTER(KIND=1,LEN=6_8)
RANK("STRING")
END SELECT
end subroutine
subroutine CALL_SHAPE(x)
implicit none
integer :: x(..)
integer :: j
integer, pointer :: ptr
SELECT RANK(x)
RANK(1)
print *, "RANK 1"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 1))
RANK (3)
print *, "RANK 3"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(x) == 3))
END SELECT
SELECT RANK(ptr => x )
RANK(1)
print *, "RANK 1"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(ptr) == 1))
RANK (3)
print *, "RANK 3"
j = INT(0, KIND=MERGE(KIND(0), -1, RANK(ptr) == 3))
END SELECT
end subroutine
end program