annotate gcc/testsuite/gdc.test/compilable/staticforeach.d @ 152:2b5abeee2509

update gcc11
author anatofuz
date Mon, 25 May 2020 07:50:57 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
152
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
1 // REQUIRED_ARGS: -o-
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
2 // PERMUTE_ARGS:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
3 // EXTRA_FILES: imports/imp12242a1.d imports/imp12242a2.d
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
4 /*
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
5 TEST_OUTPUT:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
6 ---
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
7 9
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
8 8
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
9 7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
10 6
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
11 5
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
12 4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
13 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
14 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
15 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
16 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
17 S(1, 2, 3, [0, 1, 2])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
18 x0: 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
19 x1: 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
20 x2: 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
21 a: [0, 1, 2]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
22 (int[], char[], bool[], Object[])
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
23 [0, 0]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
24 x0: int
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
25 x1: double
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
26 x2: char
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
27 test(0)→ 0
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
28 test(1)→ 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
29 test(2)→ 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
30 test(3)→ 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
31 test(4)→ 4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
32 test(5)→ 5
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
33 test(6)→ 6
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
34 test(7)→ 7
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
35 test(8)→ 8
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
36 test(9)→ 9
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
37 test(10)→ -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
38 test(11)→ -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
39 test(12)→ -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
40 test(13)→ -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
41 test(14)→ -1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
42 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
43 [1, 2, 3]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
44 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
45 [1, 2, 3]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
46 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
47 [1, 2, 3]
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
48 0 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
49 1 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
50 2 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
51 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
52 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
53 4
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
54 object
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
55 Tuple
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
56 tuple
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
57 main
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
58 front
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
59 popFront
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
60 empty
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
61 back
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
62 popBack
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
63 Iota
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
64 iota
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
65 map
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
66 to
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
67 text
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
68 all
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
69 any
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
70 join
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
71 S
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
72 s
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
73 Seq
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
74 Overloads
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
75 Parameters
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
76 forward
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
77 foo
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
78 A
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
79 B
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
80 C
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
81 D
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
82 E
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
83 Types
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
84 Visitor
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
85 testVisitor
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
86 staticMap
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
87 arrayOf
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
88 StaticForeachLoopVariable
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
89 StaticForeachScopeExit
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
90 StaticForeachReverseHiding
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
91 UnrolledForeachReverse
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
92 StaticForeachReverse
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
93 StaticForeachByAliasDefault
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
94 NestedStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
95 TestAliasOutsideFunctionScope
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
96 OpApplyMultipleStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
97 OpApplyMultipleStaticForeachLowered
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
98 RangeStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
99 OpApplySingleStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
100 TypeStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
101 AliasForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
102 EnumForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
103 TestUninterpretable
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
104 SeqForeachConstant
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
105 SeqForeachBreakContinue
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
106 TestStaticForeach
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
107 testtest
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
108 fun
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
109 testEmpty
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
110 bug17660
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
111 breakContinueBan
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
112 MixinTemplate
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
113 testToStatement
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
114 bug17688
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
115 T
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
116 foo2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
117 T2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
118 1 2 '3'
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
119 2 3 '4'
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
120 0 1
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
121 1 2
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
122 2 3
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
123 ---
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
124 */
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
125
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
126 module staticforeach;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
127
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
128 struct Tuple(T...){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
129 T expand;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
130 alias expand this;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
131 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
132 auto tuple(T...)(T t){ return Tuple!T(t); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
133
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
134 /+struct TupleStaticForeach{ // should work, but is not the fault of the static foreach implementation.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
135 //pragma(msg, [tuple(1,"2",'3'),tuple(2,"3",'4')].map!((x)=>x));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
136 static foreach(a,b,c;[tuple(1,"2",'3'),tuple(2,"3",'4')].map!((x)=>x)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
137 pragma(msg,a," ",b," ",c);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
138 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
139 }+/
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
140
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
141 void main(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
142 static foreach(a,b,c;[tuple(1,"2",'3'),tuple(2,"3",'4')].map!((x)=>x)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
143 pragma(msg, a," ",b," ",c);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
144 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
145 static struct S{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
146 // (aggregate scope, forward referencing possible)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
147 static assert(stripA("123")==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
148 static assert(stripA([1],2)==2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
149 static foreach(i;0..2){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
150 mixin(`import imports.imp12242a`~text(i+1)~`;`);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
151 static assert(stripA("123")==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
152 static assert(stripA([1],2)==2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
153 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
154 static assert(stripA("123")==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
155 static assert(stripA([1],2)==2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
156 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
157 static foreach(i;0..2){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
158 // (function scope, no forward referencing)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
159 mixin(`import imports.imp12242a`~text(i+1)~`;`);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
160 static assert(stripA("123")==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
161 static if(i) static assert(stripA([1],2)==2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
162 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
163 static assert(stripA("123")==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
164 static assert(stripA([1],2)==2);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
165 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
166
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
167 auto front(T)(T[] a){ return a[0]; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
168 auto popFront(T)(ref T[] a){ a=a[1..$]; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
169 auto empty(T)(T[] a){ return !a.length; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
170 auto back(T)(T[] a){ return a[$-1]; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
171 auto popBack(T)(ref T[] a){ a=a[0..$-1]; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
172
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
173 struct Iota(T){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
174 T s,e;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
175 @property bool empty(){ return s>=e; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
176 @property T front(){ return s; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
177 @property T back(){ return cast(T)(e-1); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
178 void popFront(){ s++; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
179 void popBack(){ e--; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
180 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
181 auto iota(T)(T s, T e){ return Iota!T(s,e); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
182
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
183 template map(alias a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
184 struct Map(R){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
185 R r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
186 @property front(){ return a(r.front); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
187 @property back(){ return a(r.back); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
188 @property bool empty(){ return r.empty; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
189 void popFront(){ r.popFront(); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
190 void popBack(){ r.popBack(); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
191 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
192 auto map(R)(R r){ return Map!R(r); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
193 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
194
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
195 template to(T:string){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
196 string to(S)(S x)if(is(S:int)||is(S:size_t)||is(S:char)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
197 static if(is(S==char)) return cast(string)[x];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
198 if(x<0) return "-"~to(-1 * x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
199 if(x==0) return "0";
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
200 return (x>=10?to(x/10):"")~cast(char)(x%10+'0');
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
201 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
202 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
203 auto text(T)(T arg){ return to!string(arg); };
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
204
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
205 template all(alias a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
206 bool all(R)(R r){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
207 foreach(x;r) if(!a(x)) return false;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
208 return true;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
209 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
210 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
211 template any(alias a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
212 bool any(R)(R r){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
213 foreach(x;r) if(a(x)) return true;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
214 return false;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
215 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
216 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
217 auto join(R)(R r,string sep=""){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
218 string a;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
219 int first=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
220 foreach(x;r){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
221 if(first++) a~=sep;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
222 a~=x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
223 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
224 return a;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
225 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
226
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
227 static foreach_reverse(x;iota(0,10).map!(to!string)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
228 pragma(msg, x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
229 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
230
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
231 // create struct members iteratively
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
232 struct S{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
233 static foreach(i;a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
234 mixin("int x"~to!string(i)~";");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
235 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
236 immutable int[] a = [0,1,2];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
237 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
238 enum s=S(1,2,3);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
239 pragma(msg, s);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
240
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
241 // loop over struct members
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
242 static foreach(member;__traits(allMembers,S)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
243 pragma(msg, member,": ",mixin("s."~member));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
244 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
245
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
246 // print prime numbers using overload sets as state variables.
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
247 /+
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
248 static assert(is(typeof(bad57)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
249 static assert(!is(typeof(bad53)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
250
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
251 static foreach(x;iota(2,100)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
252 static foreach(y;iota(2,x)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
253 static if(!(x%y)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
254 mixin("void bad"~to!string(x)~"();");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
255 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
256 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
257 static if(!is(typeof(mixin("bad"~to!string(x))))){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
258 static assert(iota(2,x).all!(y=>!!(x%y)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
259 pragma(msg, x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
260 }else{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
261 static assert(iota(2,x).any!(y=>!(x%y)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
262 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
263 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
264 +/
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
265
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
266
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
267 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
268
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
269 alias Overloads(alias a) = Seq!(__traits(getOverloads, __traits(parent, a), __traits(identifier, a)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
270
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
271 template Parameters(alias f){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
272 static if(is(typeof(f) P == function)) alias Parameters=P;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
273 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
274
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
275 template forward(alias a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
276 enum x=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
277 static foreach(f;Overloads!a){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
278 auto ref forward(Parameters!f args){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
279 return f(args);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
280 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
281 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
282 enum y=3;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
283 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
284
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
285 int foo(int x){ return x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
286 string foo(string x){ return x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
287
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
288 static assert(forward!foo(2)==2 && forward!foo("hi") == "hi");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
289
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
290
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
291 // simple boilerplate-free visitor pattern
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
292 static foreach(char T;'A'..'F'){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
293 mixin("class "~T~q{{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
294 void accept(Visitor v){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
295 return v.visit(this);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
296 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
297 }});
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
298 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
299 alias Types = Seq!(mixin("Seq!("~iota('A','F').map!(to!string).join(", ")~")"));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
300 abstract class Visitor{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
301 static foreach(T;Types){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
302 abstract void visit(T);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
303 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
304 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
305
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
306 string testVisitor(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
307 string r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
308 void writeln(T...)(T args){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
309 static foreach(x;args) r~=x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
310 r~='\n';
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
311 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
312 class Visitor: .Visitor{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
313 static foreach(T;Types){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
314 override void visit(T){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
315 writeln("visited: ",T.stringof);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
316 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
317 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
318 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
319 void main(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
320 auto v=new Visitor;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
321 static foreach(T;Types){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
322 v.visit(new T);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
323 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
324 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
325 main();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
326 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
327 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
328 static assert(testVisitor()=="visited: A
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
329 visited: B
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
330 visited: C
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
331 visited: D
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
332 visited: E
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
333 ");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
334
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
335 // iterative computation over AliasSeq:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
336 template staticMap(alias F,T...){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
337 alias state0=Seq!();
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
338 static foreach(i,A;T){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
339 mixin("alias state"~to!string(i+1)~" = Seq!(state"~to!string(i)~",F!A);");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
340 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
341 alias staticMap = Seq!(mixin("state"~to!string(T.length)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
342 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
343
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
344 alias arrayOf(T)=T[];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
345 static assert(is(staticMap!(arrayOf,int,char,bool,Object)==Seq!(int[], char[], bool[], Object[])));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
346 pragma(msg, staticMap!(arrayOf,int,char,bool,Object));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
347
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
348
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
349 struct StaticForeachLoopVariable{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
350 int x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
351 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
352 mixin("enum x"~text(i)~" = i;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
353 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
354 int y;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
355 static assert(__traits(allMembers, StaticForeachLoopVariable).length==3);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
356 static assert(!is(typeof(StaticForeachLoopVariable.i)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
357 static assert(!is(typeof(__traits(getMember, StaticForeachLoopVariable, "i"))));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
358 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
359
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
360 struct StaticForeachScopeExit{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
361 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
362 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
363 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
364 scope(exit) r ~= 1234;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
365 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
366 static foreach(i;0..5){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
367 scope(exit) r ~= i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
368 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
369 r ~= 5;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
370 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
371 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
372 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
373 static assert(test()==[5,4,3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
374 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
375
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
376 struct StaticForeachReverseHiding{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
377 static foreach(i;[0]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
378 enum i = 1; // TODO: disallow?
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
379 static assert(i==0);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
380 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
381 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
382
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
383 struct UnrolledForeachReverse{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
384 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
385 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
386 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
387 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
388 foreach_reverse(i;Seq!(0,1,2,3)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
389 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
390 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
391 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
392 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
393 static assert(test()==[3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
394 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
395
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
396 struct StaticForeachReverse{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
397 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
398 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
399 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
400 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
401 static foreach_reverse(i;0..4){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
402 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
403 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
404 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
405 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
406 static assert(test()==[3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
407
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
408 int[] test2(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
409 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
410 static foreach_reverse(i;[0,1,2,3]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
411 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
412 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
413 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
414 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
415 static assert(test2()==[3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
416
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
417 int[] test3(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
418 static struct S{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
419 int opApplyReverse(scope int delegate(int) dg){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
420 foreach_reverse(i;0..4) if(auto r=dg(i)) return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
421 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
422 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
423 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
424 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
425 static foreach_reverse(i;S()){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
426 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
427 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
428 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
429 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
430 static assert(test3()==[3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
431
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
432 int[] test4(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
433 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
434 static foreach_reverse(i;Seq!(0,1,2,3)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
435 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
436 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
437 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
438 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
439 static assert(test()==[3,2,1,0]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
440 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
441
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
442 struct StaticForeachByAliasDefault{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
443 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
444 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
445
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
446 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
447 int a,b,c;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
448 static foreach(i,x;Seq!(a,b,c)) x=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
449 return [a,b,c];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
450 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
451 static assert(test()==[0,1,2]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
452
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
453 int[] test2(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
454 int x=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
455 int foo(){ return ++x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
456 static foreach(y;Seq!foo)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
457 return [y,y,y];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
458 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
459 static assert(test2()==[1,2,3]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
460
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
461 void test3(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
462 int x=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
463 int foo(){ return ++x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
464 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
465 static foreach(enum y;Seq!foo)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
466 return [y,y,y];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
467 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
468 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
469 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
470
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
471 struct NestedStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
472 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
473 static foreach(i,name;["a"]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
474 static foreach(j,name2;["d"]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
475 mixin("enum int[] "~name~name2~"=[i, j];");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
476 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
477 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
478 pragma(msg, ad);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
479 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
480
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
481 struct TestAliasOutsideFunctionScope{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
482 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
483 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
484 int a;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
485 static foreach(alias x;Seq!(a)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
486 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
487 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
488
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
489 struct OpApplyMultipleStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
490 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
491 struct OpApply{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
492 int opApply(scope int delegate(int,int) dg){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
493 foreach(i;0..10) if(auto r=dg(i,i*i)) return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
494 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
495 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
496 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
497 static foreach(a,b;OpApply()){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
498 mixin(`enum x`~cast(char)('0'+a)~"=b;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
499 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
500 static foreach(i;0..10){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
501 static assert(mixin(`x`~cast(char)('0'+i))==i*i);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
502 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
503 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
504
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
505
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
506 struct OpApplyMultipleStaticForeachLowered{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
507 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
508 struct OpApply{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
509 int opApply(scope int delegate(int,int) dg){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
510 foreach(i;0..10) if(auto r=dg(i,i*i)) return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
511 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
512 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
513 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
514 static foreach(x;{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
515 static struct S(T...){ this(T k){ this.x=k; } T x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
516 static s(T...)(T a){ return S!T(a); }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
517 typeof({ foreach(a,b;OpApply()){ return s(a,b); } assert(0);}())[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
518 foreach(a,b;OpApply()) r~=s(a,b);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
519 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
520 }()){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
521 mixin(`enum x`~cast(char)('0'+x.x[0])~"=x.x[1];");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
522 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
523 static foreach(i;0..10){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
524 static assert(mixin(`x`~cast(char)('0'+i))==i*i);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
525 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
526 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
527
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
528 struct RangeStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
529 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
530 struct Range{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
531 int x=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
532 this(int x){ this.x=x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
533 @property int front(){ return x; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
534 void popFront(){ x += 2; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
535 @property bool empty(){ return x>=10; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
536 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
537 static foreach(i;Range()){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
538 mixin(`enum x`~cast(char)('0'+i)~"=i;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
539 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
540 static foreach(i;0..5){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
541 static assert(mixin(`x`~cast(char)('0'+2*i))==2*i);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
542 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
543 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
544 struct S{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
545 static foreach(i,k;Range()){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
546 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
547 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
548 static foreach(k;Range()){} // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
549 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
550
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
551 struct OpApplySingleStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
552 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
553 struct OpApply{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
554 int opApply(scope int delegate(int) dg){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
555 foreach(i;0..10) if(auto r=dg(i)) return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
556 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
557 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
558 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
559 static foreach(b;OpApply()){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
560 mixin(`enum x`~cast(char)('0'+b)~"=b;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
561 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
562 static foreach(i;0..10){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
563 static assert(mixin(`x`~cast(char)('0'+i))==i);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
564 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
565 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
566
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
567 struct TypeStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
568 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
569 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
570 static foreach(i,alias T;Seq!(int,double,char)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
571 mixin(`T x`~cast(char)('0'+i)~";");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
572 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
573 pragma(msg, "x0: ",typeof(x0));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
574 pragma(msg, "x1: ",typeof(x1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
575 pragma(msg, "x2: ",typeof(x2));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
576 static assert(is(typeof(x0)==int));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
577 static assert(is(typeof(x1)==double));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
578 static assert(is(typeof(x2)==char));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
579 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
580
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
581 struct AliasForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
582 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
583 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
584 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
585 int a,b,c;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
586 static foreach(x;Seq!(a,b,c,2)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
587 static if(is(typeof({x=2;}))) x=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
588 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
589 int x,y,z;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
590 static foreach(alias k;Seq!(x,y,z,2)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
591 static if(is(typeof({k=2;}))) k=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
592 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
593 int j,k,l;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
594 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
595 static foreach(ref x;Seq!(j,k,l,2)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
596 static if(is(typeof({x=2;}))) x=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
597 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
598 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
599 return [x,y,z];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
600 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
601 static assert(test()==[2,2,2]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
602 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
603
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
604 struct EnumForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
605 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
606 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
607 int a=1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
608 int fun(){ return 1; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
609 int gun(){ return 2; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
610 int hun(){ return 3;}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
611 auto test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
612 static foreach(i,enum x;Seq!(fun,gun,hun)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
613 static assert(i+1==x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
614 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
615 foreach(i,enum x;Seq!(fun,gun,hun)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
616 static assert(i+1==x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
617 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
618 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
619 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
620
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
621 struct TestUninterpretable{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
622 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
623 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
624 auto test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
625 int k;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
626 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
627 static foreach(x;[k]){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
628 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
629 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
630 foreach(enum x;[1,2,3]){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
631 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
632 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
633 foreach(alias x;[1,2,3]){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
634 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
635 foreach(enum x;Seq!(1,2,3)){} // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
636 foreach(alias x;Seq!(1,2,3)){} // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
637 static foreach(enum x;[1,2,3]){} // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
638 static foreach(alias x;[1,2,3]){} // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
639 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
640 static foreach(enum alias x;[1,2,3]){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
641 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
642 int x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
643 static foreach(i;Seq!x){ } // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
644 static foreach(i,j;Seq!(1,2,x)){ } // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
645 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
646 static foreach(ref x;[1,2,3]){}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
647 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
648 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
649 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
650
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
651 struct SeqForeachConstant{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
652 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
653 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
654 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
655 foreach(x;Seq!1) x=2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
656 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
657 int test2(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
658 int r=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
659 foreach(x;Seq!(1,2,3)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
660 enum k=x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
661 r+=k;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
662 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
663 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
664 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
665 static assert(test2()==6);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
666 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
667
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
668 struct SeqForeachBreakContinue{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
669 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
670 alias Seq(T...)=T;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
671 int[] test(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
672 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
673 foreach(i;Seq!(0,1,2,3,4,5)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
674 if(i==2) continue;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
675 if(i==4) break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
676 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
677 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
678 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
679 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
680 static assert(test()==[0,1,3]);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
681 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
682
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
683 struct TestStaticForeach{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
684 static:
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
685 int test(int x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
686 int r=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
687 label: switch(x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
688 static foreach(i;0..10){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
689 case i: r=i; break label; // TODO: remove label when restriction is lifted
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
690 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
691 default: r=-1; break label;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
692 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
693 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
694 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
695 static foreach(i;0..15){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
696 pragma(msg, "test(",i,")→ ",test(i));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
697 static assert(test(i)==(i<10?i:-1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
698 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
699
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
700 enum x=[1,2,3];
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
701
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
702 static foreach(i;x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
703 mixin("enum x"~cast(char)('0'+i)~"="~cast(char)('0'+i)~";");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
704 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
705
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
706 static foreach(i;x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
707 pragma(msg, mixin("x"~cast(char)('0'+i)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
708 pragma(msg,x);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
709 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
710
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
711 int[] noBreakNoContinue(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
712 int[] r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
713 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
714 // if(i==3) continue; // TODO: error?
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
715 // if(i==7) break; // TODO: error?
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
716 r~=i;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
717 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
718 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
719 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
720
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
721 mixin("enum k=3;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
722 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
723
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
724 static foreach(i,j;[1,2,3]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
725 pragma(msg, int(i)," ",j);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
726 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
727
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
728 void testtest(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
729 static foreach(i,v;[1,2,3]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
730 pragma(msg, int(i)," ",v);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
731 static assert(i+1 == v);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
732 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
733 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
734
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
735
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
736 static foreach(i;Seq!(1,2,3,4,int)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
737 static if(!is(i) && i!=2){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
738 pragma(msg, i);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
739 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
740 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
741
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
742 int fun(int x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
743 int r=0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
744 label: switch(x){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
745 static foreach(i;Seq!(0,1,2,3,4,5,6)){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
746 static if (i < 5)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
747 case i: r=i; break label; // TODO: remove label when restriction is lifted
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
748 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
749 default: r=-1; break label;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
750 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
751 return r;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
752 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
753
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
754 static foreach(i;0..10) static assert(fun(i)==(i<5?i:-1));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
755
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
756 static foreach(i;0..0) { }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
757 void testEmpty(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
758 static foreach(i;0..0) { }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
759 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
760
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
761 auto bug17660(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
762 int x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
763 static foreach (i; 0 .. 1) { return 3; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
764 return x;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
765 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
766 static assert(bug17660()==3);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
767
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
768 int breakContinueBan(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
769 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
770 for(;;){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
771 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
772 break;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
773 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
774 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
775 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
776 static assert(!is(typeof({
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
777 for(;;){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
778 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
779 continue;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
780 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
781 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
782 })));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
783 Louter1: for(;;){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
784 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
785 break Louter1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
786 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
787 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
788 Louter2: foreach(i;0..10){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
789 static foreach(j;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
790 continue Louter2;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
791 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
792 return 0;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
793 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
794 static foreach(i;0..1){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
795 for(;;){ break; } // ok
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
796 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
797 return 1;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
798 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
799 static assert(breakContinueBan()==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
800
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
801 mixin template MixinTemplate(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
802 static foreach(i;0..2){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
803 mixin(`enum x`~cast(char)('0'+i)~"=i;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
804 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
805 static foreach(i;[0,1]){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
806 mixin(`enum y`~cast(char)('0'+i)~"=i;");
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
807 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
808 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
809 void testToStatement(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
810 mixin MixinTemplate;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
811 static assert(x0==0 && x1==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
812 static assert(y0==0 && y1==1);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
813 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
814
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
815 void bug17688(){
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
816 final switch(1) static foreach(x;0..1){ int y=3; case 1: return; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
817 static assert(!is(typeof(y)));
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
818 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
819
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
820 struct T{ enum n = 1; }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
821 T foo(T v)@nogc{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
822 static foreach(x;0..v.n){ }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
823 return T.init;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
824 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
825 T foo2(T v)@nogc{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
826 static foreach(_;0..typeof(return).n){ }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
827 return T.init;
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
828 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
829
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
830 //https://issues.dlang.org/show_bug.cgi?id=18698
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
831
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
832 static foreach(m; __traits(allMembers, staticforeach))
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
833 {
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
834 pragma(msg, m);
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
835 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
836
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
837 //https://issues.dlang.org/show_bug.cgi?id=20072
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
838 struct T2{
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
839 static foreach(i;0..1)
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
840 struct S{}
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
841 }
2b5abeee2509 update gcc11
anatofuz
parents:
diff changeset
842 static assert(is(__traits(parent,T2.S)==T2));