diff --git a/flang/test/Semantics/spec-expr.f90 b/flang/test/Semantics/spec-expr.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/spec-expr.f90 @@ -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