This commit lays the groundwork for semantic analysis of rank-1 integer array expressions being used as bounds in a declaration with explicit bounds.
117 lines
5.5 KiB
Fortran
117 lines
5.5 KiB
Fortran
! RUN: %python %S/test_errors.py %s %flang_fc1 -Wautomatic-in-main-program -Wsaved-local-in-spec-expr
|
|
! ---- Module with rank-1 array-bounded declarations, USE'd elsewhere ----
|
|
module bounds_provider
|
|
implicit none
|
|
integer, parameter :: dims(3) = [5, 5, 5]
|
|
integer, parameter :: lo(2) = [2, 3]
|
|
integer, parameter :: hi(2) = [10, 20]
|
|
end module
|
|
module consumer
|
|
use bounds_provider
|
|
implicit none
|
|
! Declare arrays using USE-associated rank-1 parameter arrays
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: arr_upper(dims)
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: arr_both(lo : hi)
|
|
end module
|
|
subroutine sub_consumer()
|
|
use bounds_provider, only: dims, lo, hi
|
|
implicit none
|
|
! USE'd parameter arrays as bounds in a subroutine
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: local_arr(dims)
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: local_arr2(lo : hi)
|
|
end subroutine
|
|
subroutine sub_use_consumer()
|
|
use consumer, only: arr_upper, arr_both
|
|
implicit none
|
|
! USE the arrays that were themselves declared with rank-1 array bounds
|
|
arr_upper = 1
|
|
arr_both = 2
|
|
end subroutine
|
|
|
|
module data
|
|
integer :: rank1_array_module(3) = [5, 5, 5]
|
|
!future_ERROR: Automatic data object 'gg2' may not appear in a module
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: gg2(rank1_array_module)
|
|
integer, allocatable :: nonconstsize(:)
|
|
!future_ERROR: Rank-1 integer array used as lower bounds in DECLARATION must have constant size
|
|
!future_ERROR: Rank-1 integer array used as upper bounds in DECLARATION must have constant size
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: gg3(nonconstsize : nonconstsize)
|
|
end module
|
|
program declaration_array_bounds
|
|
implicit none
|
|
|
|
! Valid cases (no errors expected)
|
|
|
|
! Array upper bound only
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: c([3, 4, 5])
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer, dimension([3, 4, 5]) :: cc
|
|
|
|
! Array lower and upper bounds, same size
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: d((/2, 3/) : [10, 20])
|
|
|
|
! Scalar lower, array upper
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: e(2 : [10, 20])
|
|
|
|
! Array lower, scalar upper
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: f([2, 3] : 10)
|
|
|
|
! Using non-literal PARAMETER variables
|
|
integer, parameter :: rank1_parameter_array(3) = [5,5,5]
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: g(rank1_parameter_array)
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: ggg(rank1_parameter_array * 2 : rank1_parameter_array - 1)
|
|
|
|
|
|
! Negative cases (errors expected)
|
|
integer :: rank1_array(3) = [5,5,5]
|
|
! Use existing error message for constness checking
|
|
!future_PORTABILITY: specification expression refers to local object 'rank1_array' (initialized and saved) [-Wsaved-local-in-spec-expr]
|
|
!future_PORTABILITY: Automatic data object 'gg' should not appear in the specification part of a main program [-Wautomatic-in-main-program]
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: gg(rank1_array)
|
|
integer :: scalar
|
|
!future_ERROR: Invalid specification expression: reference to local entity 'scalar'
|
|
!future_PORTABILITY: Automatic data object 'gggg' should not appear in the specification part of a main program [-Wautomatic-in-main-program]
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: gggg(rank1_parameter_array : scalar)
|
|
|
|
!ERROR: Must have INTEGER type, but is REAL(4)
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: h([1.2,2.2,3.2]:[1,2,3])
|
|
!future_ERROR: DECLARATION bounds integer rank-1 arrays must have the same size; lower bounds has 3 elements, upper bounds has 2 elements
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: i([1,2,3]:[3,3])
|
|
|
|
! Test error for rank > 1, fulfilling constness
|
|
integer, parameter :: rank2_parameter_array(2,2) = reshape([[1,2],[3,4]], [2,2])
|
|
!future_ERROR: Integer array used as upper bounds in DECLARATION must be rank-1 but is rank-2
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: j(rank2_parameter_array)
|
|
! Test combined bounds error, first bound as before but second bound as wrong rank
|
|
! and nonconst
|
|
integer :: rank3_array(2,2,2)
|
|
!future_ERROR: Integer array used as lower bounds in DECLARATION must be rank-1 but is rank-2
|
|
!future_ERROR: Integer array used as upper bounds in DECLARATION must be rank-1 but is rank-3
|
|
!ERROR: not yet implemented: TODO: Analyze overload for ExplicitShapeBoundsSpec
|
|
integer :: k(rank2_parameter_array : rank3_array)
|
|
|
|
! Test that any comma list is parsed as ExplicitShapeSpecList and not rewritten
|
|
! to ExplicitShapeBoundsSpec, giving error messages expecting scalar integer values.
|
|
!ERROR: Must be a scalar value, but is a rank-1 array
|
|
!ERROR: Must be a scalar value, but is a rank-1 array
|
|
!ERROR: Must be a scalar value, but is a rank-1 array
|
|
!ERROR: Must have INTEGER type, but is REAL(4)
|
|
integer :: test_array([1,2,3] : [2,3,4], 3, [1,2,3], 5.2)
|
|
end program
|