Skip to content

Commit 427a33d

Browse files
author
git apple-llvm automerger
committed
Merge commit 'f2d633fcc1de' from apple/master into swift/master-next
2 parents 07363b9 + f2d633f commit 427a33d

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed

flang/test/Semantics/spec-expr.f90

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
! RUN: %S/test_errors.sh %s %t %f18
2+
! Tests for the 14 items that specify a "specification expression" in section
3+
! 10.1.11
4+
5+
! a constant or subobject of a constant,
6+
subroutine s1()
7+
type dType
8+
integer :: field
9+
end type dType
10+
11+
type(dType), parameter :: dConst = dType(3)
12+
real, dimension(3) :: realVar1
13+
real, dimension(dConst%field) :: realVar2
14+
end subroutine s1
15+
16+
! an object designator with a base object that is a dummy argument that has
17+
! neither the OPTIONAL nor the INTENT (OUT) attribute,
18+
subroutine s2(inArg, inoutArg, outArg, optArg)
19+
integer, intent(in) :: inArg
20+
integer, intent(inout) :: inoutArg
21+
integer, intent(out) :: outArg
22+
integer, intent(in), optional :: optArg
23+
real, dimension(inArg) :: realVar1
24+
real, dimension(inoutArg) :: realVar2
25+
!ERROR: Invalid specification expression: reference to INTENT(OUT) dummy argument 'outarg'
26+
real, dimension(outArg) :: realVar3
27+
!ERROR: Invalid specification expression: reference to OPTIONAL dummy argument 'optarg'
28+
real, dimension(optArg) :: realVar4
29+
30+
outArg = 3
31+
end subroutine s2
32+
33+
! an object designator with a base object that is in a common block,
34+
subroutine s3()
35+
integer :: intVar
36+
common intCommonVar
37+
real, dimension(intCommonVar) :: realVar
38+
end subroutine s3
39+
40+
! an object designator with a base object that is made accessible by
41+
! use or host association,
42+
module m4
43+
integer :: intVar
44+
end module m4
45+
46+
subroutine s4()
47+
use m4
48+
real, dimension(intVar) :: realVar
49+
end subroutine s4
50+
51+
! an array constructor where each element and each scalar-int-expr of
52+
! each ac-implied-do-control is a restricted expression,
53+
subroutine s5()
54+
real, dimension(storage_size([1,2])) :: realVar
55+
end subroutine s5
56+
57+
! a structure constructor where each component is a restricted expression,
58+
subroutine s6()
59+
type :: dType
60+
integer :: field1
61+
integer :: field2
62+
end type dType
63+
64+
real, dimension(storage_size(dType(1, 2))) :: realArray
65+
end subroutine s6
66+
67+
! a specification inquiry where each designator or argument is
68+
! (a) a restricted expression or
69+
subroutine s7a()
70+
real, dimension(3) :: realArray1
71+
real, dimension(size(realArray1)) :: realArray2
72+
end subroutine s7a
73+
74+
! a specification inquiry where each designator or argument is
75+
! (b) a variable that is not an optional dummy argument, and whose
76+
! properties inquired about are not
77+
! (i) dependent on the upper bound of the last dimension of an
78+
! assumed-size array,
79+
subroutine s7bi(assumedArg)
80+
integer, dimension(2, *) :: assumedArg
81+
real, dimension(ubound(assumedArg, 1)) :: realArray1
82+
! Should be an error since 2 is the last dimension of an assumed-size array
83+
real, dimension(ubound(assumedArg, 2)) :: realArray2
84+
end subroutine s7bi
85+
86+
! a specification inquiry where each designator or argument is
87+
! (b) a variable that is not an optional dummy argument, and whose
88+
! properties inquired about are not
89+
! (ii) deferred, or
90+
subroutine s7bii(dummy)
91+
character(len=:), pointer :: dummy
92+
! Should be an error since "dummy" is deferred, but all compilers handle it
93+
real, dimension(len(dummy)) :: realArray
94+
end subroutine s7bii
95+
96+
! a specification inquiry where each designator or argument is
97+
! (b) a variable that is not an optional dummy argument, and whose
98+
! properties inquired about are not
99+
! (iii) defined by an expression that is not a restricted expression,
100+
subroutine s7biii()
101+
integer, parameter :: localConst = 5
102+
integer :: local = 5
103+
! OK, since "localConst" is a constant
104+
real, dimension(localConst) :: realArray1
105+
!ERROR: Invalid specification expression: reference to local entity 'local'
106+
real, dimension(local) :: realArray2
107+
end subroutine s7biii
108+
109+
! a specification inquiry that is a constant expression,
110+
subroutine s8()
111+
integer :: iVar
112+
real, dimension(bit_size(iVar)) :: realArray
113+
end subroutine s8
114+
115+
! a reference to the intrinsic function PRESENT,
116+
subroutine s9(optArg)
117+
integer, optional :: optArg
118+
real, dimension(merge(3, 4, present(optArg))) :: realArray
119+
end subroutine s9
120+
121+
! a reference to any other standard intrinsic function where each
122+
! argument is a restricted expression,
123+
subroutine s10()
124+
integer :: iVar
125+
real, dimension(bit_size(iVar)) :: realArray
126+
end subroutine s10
127+
128+
! a reference to a transformational function from the intrinsic module
129+
! IEEE_ARITHMETIC, IEEE_EXCEPTIONS, or ISO_C_BINDING, where each argument
130+
! is a restricted expression,
131+
subroutine s11()
132+
use ieee_exceptions
133+
real, dimension(merge(3, 4, ieee_support_halting(ieee_invalid))) :: realArray
134+
end subroutine s11
135+
136+
! a reference to a specification function where each argument is a
137+
! restricted expression,
138+
module m12
139+
contains
140+
pure function specFunc(arg)
141+
integer, intent(in) :: arg
142+
integer :: specFunc
143+
specFunc = 3 + arg
144+
end function specFunc
145+
end module m12
146+
147+
subroutine s12()
148+
use m12
149+
real, dimension(specFunc(2)) :: realArray
150+
end subroutine s12
151+
152+
! a type parameter of the derived type being defined,
153+
subroutine s13()
154+
type :: dtype(param)
155+
integer, len :: param
156+
real, dimension(param) :: realField
157+
end type dtype
158+
end subroutine s13
159+
160+
! an ac-do-variable within an array constructor where each
161+
! scalar-int-expr of the corresponding ac-implied-do-control is a restricted
162+
! expression, or
163+
subroutine s14()
164+
real, dimension(5) :: realField = [(i, i = 1, 5)]
165+
end subroutine s14
166+
167+
! a restricted expression enclosed in parentheses,where each subscript,
168+
! section subscript, substring starting point, substring ending point, and
169+
! type parameter value is a restricted expression
170+
subroutine s15()
171+
type :: dtype(param)
172+
integer, len :: param
173+
real, dimension((param + 2)) :: realField
174+
end type dtype
175+
end subroutine s15

0 commit comments

Comments
 (0)