mirror of
https://github.com/intel/llvm.git
synced 2026-01-24 00:20:25 +08:00
[flang] Added test for specification expressions
I added a test the exercises all of the cases instances of specification expressions as defined in section 10.1.11. Summary: [flang] Added test for specification expressions Reviewers: tskeith, klausler, DavidTruby Subscribers: llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D81759
This commit is contained in:
175
flang/test/Semantics/spec-expr.f90
Normal file
175
flang/test/Semantics/spec-expr.f90
Normal file
@@ -0,0 +1,175 @@
|
||||
! RUN: %S/test_errors.sh %s %t %f18
|
||||
! Tests for the 14 items that specify a "specification expression" in section
|
||||
! 10.1.11
|
||||
|
||||
! a constant or subobject of a constant,
|
||||
subroutine s1()
|
||||
type dType
|
||||
integer :: field
|
||||
end type dType
|
||||
|
||||
type(dType), parameter :: dConst = dType(3)
|
||||
real, dimension(3) :: realVar1
|
||||
real, dimension(dConst%field) :: realVar2
|
||||
end subroutine s1
|
||||
|
||||
! an object designator with a base object that is a dummy argument that has
|
||||
! neither the OPTIONAL nor the INTENT (OUT) attribute,
|
||||
subroutine s2(inArg, inoutArg, outArg, optArg)
|
||||
integer, intent(in) :: inArg
|
||||
integer, intent(inout) :: inoutArg
|
||||
integer, intent(out) :: outArg
|
||||
integer, intent(in), optional :: optArg
|
||||
real, dimension(inArg) :: realVar1
|
||||
real, dimension(inoutArg) :: realVar2
|
||||
!ERROR: Invalid specification expression: reference to INTENT(OUT) dummy argument 'outarg'
|
||||
real, dimension(outArg) :: realVar3
|
||||
!ERROR: Invalid specification expression: reference to OPTIONAL dummy argument 'optarg'
|
||||
real, dimension(optArg) :: realVar4
|
||||
|
||||
outArg = 3
|
||||
end subroutine s2
|
||||
|
||||
! an object designator with a base object that is in a common block,
|
||||
subroutine s3()
|
||||
integer :: intVar
|
||||
common intCommonVar
|
||||
real, dimension(intCommonVar) :: realVar
|
||||
end subroutine s3
|
||||
|
||||
! an object designator with a base object that is made accessible by
|
||||
! use or host association,
|
||||
module m4
|
||||
integer :: intVar
|
||||
end module m4
|
||||
|
||||
subroutine s4()
|
||||
use m4
|
||||
real, dimension(intVar) :: realVar
|
||||
end subroutine s4
|
||||
|
||||
! an array constructor where each element and each scalar-int-expr of
|
||||
! each ac-implied-do-control is a restricted expression,
|
||||
subroutine s5()
|
||||
real, dimension(storage_size([1,2])) :: realVar
|
||||
end subroutine s5
|
||||
|
||||
! a structure constructor where each component is a restricted expression,
|
||||
subroutine s6()
|
||||
type :: dType
|
||||
integer :: field1
|
||||
integer :: field2
|
||||
end type dType
|
||||
|
||||
real, dimension(storage_size(dType(1, 2))) :: realArray
|
||||
end subroutine s6
|
||||
|
||||
! a specification inquiry where each designator or argument is
|
||||
! (a) a restricted expression or
|
||||
subroutine s7a()
|
||||
real, dimension(3) :: realArray1
|
||||
real, dimension(size(realArray1)) :: realArray2
|
||||
end subroutine s7a
|
||||
|
||||
! a specification inquiry where each designator or argument is
|
||||
! (b) a variable that is not an optional dummy argument, and whose
|
||||
! properties inquired about are not
|
||||
! (i) dependent on the upper bound of the last dimension of an
|
||||
! assumed-size array,
|
||||
subroutine s7bi(assumedArg)
|
||||
integer, dimension(2, *) :: assumedArg
|
||||
real, dimension(ubound(assumedArg, 1)) :: realArray1
|
||||
! Should be an error since 2 is the last dimension of an assumed-size array
|
||||
real, dimension(ubound(assumedArg, 2)) :: realArray2
|
||||
end subroutine s7bi
|
||||
|
||||
! a specification inquiry where each designator or argument is
|
||||
! (b) a variable that is not an optional dummy argument, and whose
|
||||
! properties inquired about are not
|
||||
! (ii) deferred, or
|
||||
subroutine s7bii(dummy)
|
||||
character(len=:), pointer :: dummy
|
||||
! Should be an error since "dummy" is deferred, but all compilers handle it
|
||||
real, dimension(len(dummy)) :: realArray
|
||||
end subroutine s7bii
|
||||
|
||||
! a specification inquiry where each designator or argument is
|
||||
! (b) a variable that is not an optional dummy argument, and whose
|
||||
! properties inquired about are not
|
||||
! (iii) defined by an expression that is not a restricted expression,
|
||||
subroutine s7biii()
|
||||
integer, parameter :: localConst = 5
|
||||
integer :: local = 5
|
||||
! OK, since "localConst" is a constant
|
||||
real, dimension(localConst) :: realArray1
|
||||
!ERROR: Invalid specification expression: reference to local entity 'local'
|
||||
real, dimension(local) :: realArray2
|
||||
end subroutine s7biii
|
||||
|
||||
! a specification inquiry that is a constant expression,
|
||||
subroutine s8()
|
||||
integer :: iVar
|
||||
real, dimension(bit_size(iVar)) :: realArray
|
||||
end subroutine s8
|
||||
|
||||
! a reference to the intrinsic function PRESENT,
|
||||
subroutine s9(optArg)
|
||||
integer, optional :: optArg
|
||||
real, dimension(merge(3, 4, present(optArg))) :: realArray
|
||||
end subroutine s9
|
||||
|
||||
! a reference to any other standard intrinsic function where each
|
||||
! argument is a restricted expression,
|
||||
subroutine s10()
|
||||
integer :: iVar
|
||||
real, dimension(bit_size(iVar)) :: realArray
|
||||
end subroutine s10
|
||||
|
||||
! a reference to a transformational function from the intrinsic module
|
||||
! IEEE_ARITHMETIC, IEEE_EXCEPTIONS, or ISO_C_BINDING, where each argument
|
||||
! is a restricted expression,
|
||||
subroutine s11()
|
||||
use ieee_exceptions
|
||||
real, dimension(merge(3, 4, ieee_support_halting(ieee_invalid))) :: realArray
|
||||
end subroutine s11
|
||||
|
||||
! a reference to a specification function where each argument is a
|
||||
! restricted expression,
|
||||
module m12
|
||||
contains
|
||||
pure function specFunc(arg)
|
||||
integer, intent(in) :: arg
|
||||
integer :: specFunc
|
||||
specFunc = 3 + arg
|
||||
end function specFunc
|
||||
end module m12
|
||||
|
||||
subroutine s12()
|
||||
use m12
|
||||
real, dimension(specFunc(2)) :: realArray
|
||||
end subroutine s12
|
||||
|
||||
! a type parameter of the derived type being defined,
|
||||
subroutine s13()
|
||||
type :: dtype(param)
|
||||
integer, len :: param
|
||||
real, dimension(param) :: realField
|
||||
end type dtype
|
||||
end subroutine s13
|
||||
|
||||
! an ac-do-variable within an array constructor where each
|
||||
! scalar-int-expr of the corresponding ac-implied-do-control is a restricted
|
||||
! expression, or
|
||||
subroutine s14()
|
||||
real, dimension(5) :: realField = [(i, i = 1, 5)]
|
||||
end subroutine s14
|
||||
|
||||
! a restricted expression enclosed in parentheses,where each subscript,
|
||||
! section subscript, substring starting point, substring ending point, and
|
||||
! type parameter value is a restricted expression
|
||||
subroutine s15()
|
||||
type :: dtype(param)
|
||||
integer, len :: param
|
||||
real, dimension((param + 2)) :: realField
|
||||
end type dtype
|
||||
end subroutine s15
|
||||
Reference in New Issue
Block a user