1 // EXTRA_SOURCES: imports/ufcs5a.d imports/ufcs5b.d imports/ufcs5c.d imports/ufcs5d.d imports/ufcs5e.d
5 extern (C) int printf(const char*, ...);
7 /*******************************************/
11 int foo(int n) { return 1; }
12 int foo(int n, int m) { return 2; }
13 int goo(int[] a) { return 1; }
14 int goo(int[] a, int m) { return 2; }
15 int bar(S s) { return 1; }
16 int bar(S s, int n) { return 2; }
18 int baz(X)(X x) { return 1; }
19 int baz(X)(X x, int n) { return 2; }
22 ref int boo(int n) { return temp; }
23 ref int coo(int[] a) { return temp; }
24 ref int mar(S s) { return temp; }
26 ref int maz(X)(X x) { return temp; }
34 assert( foo(4) == 1); assert( baz(4) == 1);
35 assert( 4.foo() == 1); assert( 4.baz() == 1);
36 assert( 4.foo == 1); assert( 4.baz == 1);
37 assert( foo(4, 2) == 2); assert( baz(4, 2) == 2);
38 assert( 4.foo(2) == 2); assert( 4.baz(2) == 2);
39 assert((4.foo = 2) == 2); assert((4.baz = 2) == 2);
41 assert( goo(a) == 1); assert( baz(a) == 1);
42 assert( a.goo() == 1); assert( a.baz() == 1);
43 assert( a.goo == 1); assert( a.baz == 1);
44 assert( goo(a, 2) == 2); assert( baz(a, 2) == 2);
45 assert( a.goo(2) == 2); assert( a.baz(2) == 2);
46 assert((a.goo = 2) == 2); assert((a.baz = 2) == 2);
48 assert( bar(s) == 1); assert( baz(s) == 1);
49 assert( s.bar() == 1); assert( s.baz() == 1);
50 assert( s.bar == 1); assert( s.baz == 1);
51 assert( bar(s, 2) == 2); assert( baz(s, 2) == 2);
52 assert( s.bar(2) == 2); assert( s.baz(2) == 2);
53 assert((s.bar = 2) == 2); assert((s.baz = 2) == 2);
55 assert(( boo(4) = 2) == 2); assert(( maz(4) = 2) == 2);
56 assert((4.boo = 2) == 2); assert((4.maz = 2) == 2);
57 assert(( coo(a) = 2) == 2); assert(( maz(a) = 2) == 2);
58 assert((a.coo = 2) == 2); assert((a.maz = 2) == 2);
59 assert(( mar(s) = 2) == 2); assert(( maz(s) = 2) == 2);
60 assert((s.mar = 2) == 2); assert((s.maz = 2) == 2);
63 int hoo(T)(int n) { return 1; }
64 int hoo(T)(int n, int m) { return 2; }
65 int koo(T)(int[] a) { return 1; }
66 int koo(T)(int[] a, int m) { return 2; }
67 int var(T)(S s) { return 1; }
68 int var(T)(S s, int n) { return 2; }
70 int vaz(T, X)(X x) { return 1; }
71 int vaz(T, X)(X x, int n) { return 2; }
74 ref int voo(T)(int n) { return temp; }
75 ref int woo(T)(int[] a) { return temp; }
76 ref int nar(T)(S s) { return temp; }
78 ref int naz(T, X)(X x) { return temp; }
86 assert( hoo!int(4) == 1); assert( vaz!int(4) == 1);
87 assert( 4.hoo!int() == 1); assert( 4.vaz!int() == 1);
88 assert( 4.hoo!int == 1); assert( 4.vaz!int == 1);
89 assert( hoo!int(4, 2) == 2); assert( vaz!int(4, 2) == 2);
90 assert( 4.hoo!int(2) == 2); assert( 4.vaz!int(2) == 2);
91 assert((4.hoo!int = 2) == 2); assert((4.vaz!int = 2) == 2);
93 assert( koo!int(a) == 1); assert( vaz!int(a) == 1);
94 assert( a.koo!int() == 1); assert( a.vaz!int() == 1);
95 assert( a.koo!int == 1); assert( a.vaz!int == 1);
96 assert( koo!int(a, 2) == 2); assert( vaz!int(a, 2) == 2);
97 assert( a.koo!int(2) == 2); assert( a.vaz!int(2) == 2);
98 assert((a.koo!int = 2) == 2); assert((a.vaz!int = 2) == 2);
100 assert( var!int(s) == 1); assert( vaz!int(s) == 1);
101 assert( s.var!int() == 1); assert( s.vaz!int() == 1);
102 assert( s.var!int == 1); assert( s.vaz!int == 1);
103 assert( var!int(s, 2) == 2); assert( vaz!int(s, 2) == 2);
104 assert( s.var!int(2) == 2); assert( s.vaz!int(2) == 2);
105 assert((s.var!int = 2) == 2); assert((s.vaz!int = 2) == 2);
107 assert(( voo!int(4) = 2) == 2); assert(( naz!int(4) = 2) == 2);
108 assert((4.voo!int = 2) == 2); assert((4.naz!int = 2) == 2);
109 assert(( woo!int(a) = 2) == 2); assert(( naz!int(a) = 2) == 2);
110 assert((a.woo!int = 2) == 2); assert((a.naz!int = 2) == 2);
111 assert(( nar!int(s) = 2) == 2); assert(( naz!int(s) = 2) == 2);
112 assert((s.nar!int = 2) == 2); assert((s.naz!int = 2) == 2);
115 /*******************************************/
117 auto init(T)(T val) { return 1; }
119 auto sort(alias fun, T)(T val) { return 1; }
121 @property auto max(alias fun, T)(T val) { return 1; }
123 @property auto infinity(alias opt, T)(T val) { return 1; }
127 // See built-in 'init' property
128 assert(1 .init == 0);
129 assert([1] .init == null);
130 assert([1:1].init == null);
131 assert(1.0 .init is double.nan);
132 assert(10i .init is idouble.nan);
133 assert('c' .init == 0xFF);
134 assert("s" .init == null);
136 // x.init() has parens, so it runs UFCS call
137 assert( 1 .init() == 1);
138 assert([1] .init() == 1);
139 assert([1:1].init() == 1);
140 assert(1.0 .init() == 1);
141 assert(10i .init() == 1);
142 assert('c' .init() == 1);
143 assert("s" .init() == 1);
145 // x.init!YYY matches templatized UFCS call.
146 assert( 1 .init!int() == 1);
147 assert([1] .init!(int[])() == 1);
148 assert([1:1].init!(int[int])() == 1);
149 assert(1.0 .init!double() == 1);
150 assert(10i .init!idouble() == 1);
151 assert('c' .init!char() == 1);
152 assert("s" .init!string() == 1);
154 assert([1].sort!"a<b"() == 1);
156 // templatized properties runs UFCS call.
157 assert(1024.max!"a<b" == 1);
158 assert(1024.max == int.max);
160 assert(3.14.infinity!"+" == 1);
161 assert(3.14.infinity == (double).infinity);
164 /*******************************************/
177 s.s.connect(); // s.s is TOKdotexp, so never match UFCS
180 /*******************************************/
182 auto f5_1(int) { return 1; }
183 auto f5_2(string) { return 2; }
184 auto f5_3(double) { return 3; }
185 alias f5_4 = f5_1, f5_4 = f5_2;
186 alias f5_5 = f5_3, f5_5 = f5_4;
188 @property p5_1(int) { return 1; } @property p5_1(int, int) { return 1; }
189 @property p5_2(string) { return 2; } @property p5_2(string, int) { return 2; }
190 @property p5_3(double) { return 3; } @property p5_3(double, int) { return 3; }
191 alias p5_4 = p5_1, p5_4 = p5_2; alias p5_4 = p5_1, p5_4 = p5_2;
192 alias p5_5 = p5_3, p5_5 = p5_4; alias p5_5 = p5_3, p5_5 = p5_4;
194 // import overload set 'f5ov' and 'p5ov'
195 import imports.ufcs5b, imports.ufcs5c;
200 // f5_1 .. f5_5 are symbols which declared in module scope
201 assert(100.f5_1() == 1);
202 assert("s".f5_2() == 2);
203 assert(1.4.f5_3() == 3);
204 assert(100.f5_4() == 1);
205 assert("s".f5_4() == 2);
206 assert(100.f5_5() == 1);
207 assert("s".f5_5() == 2);
208 assert(1.4.f5_5() == 3);
210 assert(100.f5ov() == 1);
211 assert("s".f5ov() == 2);
212 // UFCS does not see function local alias
214 static assert(!__traits(compiles, { 1.func5(); }));
216 // property getter/setter
217 assert(100.p5_1 == 1); assert((100.p5_1 = 1) == 1);
218 assert("s".p5_2 == 2); assert(("s".p5_2 = 1) == 2);
219 assert(1.4.p5_3 == 3); assert((1.4.p5_3 = 1) == 3);
220 assert(100.p5_4 == 1); assert((100.p5_4 = 1) == 1);
221 assert("s".p5_4 == 2); assert(("s".p5_4 = 1) == 2);
222 assert(100.p5_5 == 1); assert((100.p5_5 = 1) == 1);
223 assert("s".p5_5 == 2); assert(("s".p5_5 = 1) == 2);
224 assert(1.4.p5_5 == 3); assert((1.4.p5_5 = 1) == 3);
225 // overload set ); assert(
226 assert(100.p5ov == 1); assert((100.p5ov = 1) == 1);
227 assert("s".p5ov == 2); assert(("s".p5ov = 1) == 2);
230 static assert(!__traits(compiles, { 1.prop5; }));
231 static assert(!__traits(compiles, { 1.prop5 = 1; }));
235 // f5a1 .. f5a5 are symbols which declared in module scope
236 import imports.ufcs5a;
237 // overload set 'f5ov' and 'p5ov'
238 import imports.ufcs5b, imports.ufcs5c;
240 assert(100.f5a1() == 1);
241 assert("s".f5a2() == 2);
242 assert(1.4.f5a3() == 3);
243 assert(100.f5a4() == 1);
244 assert("s".f5a4() == 2);
245 assert(100.f5a5() == 1);
246 assert("s".f5a5() == 2);
247 assert(1.4.f5a5() == 3);
248 assert(100.f5ov() == 1);
249 assert("s".f5ov() == 2);
251 assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
252 assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
253 assert(1.4.p5a3 == 3); assert((1.4.p5a3 = 1) == 3);
254 assert(100.p5a4 == 1); assert((100.p5a4 = 1) == 1);
255 assert("s".p5a4 == 2); assert(("s".p5a4 = 1) == 2);
256 assert(100.p5a5 == 1); assert((100.p5a5 = 1) == 1);
257 assert("s".p5a5 == 2); assert(("s".p5a5 = 1) == 2);
258 assert(1.4.p5a5 == 3); assert((1.4.p5a5 = 1) == 3);
259 assert(100.p5ov == 1); assert((100.p5ov = 1) == 1);
260 assert("s".p5ov == 2); assert(("s".p5ov = 1) == 2);
264 // selective imports also work as expected
265 import imports.ufcs5a : f5a1, f5a2;
266 import imports.ufcs5a : p5a1, p5a2;
268 assert(100.f5a1() == 1);
269 assert("s".f5a2() == 2);
270 static assert(!__traits(compiles, { 1.4.f5a3(); }));
271 static assert(!__traits(compiles, { 100.f5a4(); }));
272 static assert(!__traits(compiles, { "s".f5a4(); }));
273 static assert(!__traits(compiles, { 100.f5a5(); }));
274 static assert(!__traits(compiles, { "s".f5a5(); }));
275 static assert(!__traits(compiles, { 1.4.f5a5(); }));
277 assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
278 assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
279 static assert(!__traits(compiles, { 1.4.p5a3; }) && !__traits(compiles, { 1.4.p5a3 = 1; }));
280 static assert(!__traits(compiles, { 100.p5a4; }) && !__traits(compiles, { 100.p5a4 = 1; }));
281 static assert(!__traits(compiles, { "s".p5a4; }) && !__traits(compiles, { "s".p5a4 = 1; }));
282 static assert(!__traits(compiles, { 100.p5a5; }) && !__traits(compiles, { 100.p5a5 = 1; }));
283 static assert(!__traits(compiles, { "s".p5a5; }) && !__traits(compiles, { "s".p5a5 = 1; }));
284 static assert(!__traits(compiles, { 1.4.p5a5; }) && !__traits(compiles, { 1.4.p5a5 = 1; }));
288 // renamed imports also work as expected
289 import imports.ufcs5a : f5x1 = f5a1, f5x2 = f5a2;
290 import imports.ufcs5a : p5x1 = p5a1, p5x2 = p5a2;
292 assert(100.f5x1() == 1);
293 assert("s".f5x2() == 2);
294 static assert(!__traits(compiles, { 100.f5a1(); }));
295 static assert(!__traits(compiles, { "s".f5a2(); }));
296 static assert(!__traits(compiles, { 1.4.f5a3(); }));
297 static assert(!__traits(compiles, { 100.f5a4(); }));
298 static assert(!__traits(compiles, { "s".f5a4(); }));
299 static assert(!__traits(compiles, { 100.f5a5(); }));
300 static assert(!__traits(compiles, { "s".f5a5(); }));
301 static assert(!__traits(compiles, { 1.4.f5a5(); }));
303 assert(100.p5x1 == 1); assert((100.p5x1 = 1) == 1);
304 assert("s".p5x2 == 2); assert(("s".p5x2 = 1) == 2);
305 static assert(!__traits(compiles, { 100.p5a1; }) && !__traits(compiles, { 100.p5a1 = 1; }));
306 static assert(!__traits(compiles, { "s".p5a2; }) && !__traits(compiles, { "s".p5a2 = 1; }));
307 static assert(!__traits(compiles, { 1.4.p5a3; }) && !__traits(compiles, { 1.4.p5a3 = 1; }));
308 static assert(!__traits(compiles, { 100.p5a4; }) && !__traits(compiles, { 100.p5a4 = 1; }));
309 static assert(!__traits(compiles, { "s".p5a4; }) && !__traits(compiles, { "s".p5a4 = 1; }));
310 static assert(!__traits(compiles, { 100.p5a5; }) && !__traits(compiles, { 100.p5a5 = 1; }));
311 static assert(!__traits(compiles, { "s".p5a5; }) && !__traits(compiles, { "s".p5a5 = 1; }));
312 static assert(!__traits(compiles, { 1.4.p5a5; }) && !__traits(compiles, { 1.4.p5a5 = 1; }));
317 foreach (name; __traits(allMembers, C5))
319 static if (name.length >= 4 && name[0..4] == "test")
321 mixin("c5."~name~"();"); // call test function
329 int g5bm(int) { return 0; }
330 static int g5bs(int) { return 0; }
335 // normal import works.
336 import imports.ufcs5a;
339 assert(100.f5a1() == 1);
340 assert("s".f5a2() == 2);
341 assert(1.4.f5a3() == 3);
342 assert(100.f5a4() == 1);
343 assert("s".f5a4() == 2);
344 assert(100.f5a5() == 1);
345 assert("s".f5a5() == 2);
346 assert(1.4.f5a5() == 3);
348 assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
349 assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
350 assert(1.4.p5a3 == 3); assert((1.4.p5a3 = 1) == 3);
351 assert(100.p5a4 == 1); assert((100.p5a4 = 1) == 1);
352 assert("s".p5a4 == 2); assert(("s".p5a4 = 1) == 2);
353 assert(100.p5a5 == 1); assert((100.p5a5 = 1) == 1);
354 assert("s".p5a5 == 2); assert(("s".p5a5 = 1) == 2);
355 assert(1.4.p5a5 == 3); assert((1.4.p5a5 = 1) == 3);
358 // selective imports also work as expected
359 import imports.ufcs5d : f5d1, f5d2;
360 import imports.ufcs5d : p5d1, p5d2;
363 assert(100.f5d1() == 1);
364 assert("s".f5d2() == 2);
365 static assert(!__traits(compiles, { 1.4.f5d3(); }));
366 static assert(!__traits(compiles, { 100.f5d4(); }));
367 static assert(!__traits(compiles, { "s".f5d4(); }));
368 static assert(!__traits(compiles, { 100.f5d5(); }));
369 static assert(!__traits(compiles, { "s".f5d5(); }));
370 static assert(!__traits(compiles, { 1.4.f5d5(); }));
372 assert(100.p5d1 == 1); assert((100.p5d1 = 1) == 1);
373 assert("s".p5d2 == 2); assert(("s".p5d2 = 1) == 2);
374 static assert(!__traits(compiles, { 1.4.p5d3; }) && !__traits(compiles, { 1.4.p5d3 = 1; }));
375 static assert(!__traits(compiles, { 100.p5d4; }) && !__traits(compiles, { 100.p5d4 = 1; }));
376 static assert(!__traits(compiles, { "s".p5d4; }) && !__traits(compiles, { "s".p5d4 = 1; }));
377 static assert(!__traits(compiles, { 100.p5d5; }) && !__traits(compiles, { 100.p5d5 = 1; }));
378 static assert(!__traits(compiles, { "s".p5d5; }) && !__traits(compiles, { "s".p5d5 = 1; }));
379 static assert(!__traits(compiles, { 1.4.p5d5; }) && !__traits(compiles, { 1.4.p5d5 = 1; }));
382 // renamed imports also work as expected
383 import imports.ufcs5e : f5y1 = f5e1, f5y2 = f5e2;
384 import imports.ufcs5e : p5y1 = p5e1, p5y2 = p5e2;
387 assert(100.f5y1() == 1);
388 assert("s".f5y2() == 2);
389 static assert(!__traits(compiles, { 100.f5e1(); }));
390 static assert(!__traits(compiles, { "s".f5e2(); }));
391 static assert(!__traits(compiles, { 1.4.f5e3(); }));
392 static assert(!__traits(compiles, { 100.f5e4(); }));
393 static assert(!__traits(compiles, { "s".f5e4(); }));
394 static assert(!__traits(compiles, { 100.f5e5(); }));
395 static assert(!__traits(compiles, { "s".f5e5(); }));
396 static assert(!__traits(compiles, { 1.4.f5e5(); }));
398 assert(100.p5y1 == 1); assert((100.p5y1 = 1) == 1);
399 assert("s".p5y2 == 2); assert(("s".p5y2 = 1) == 2);
400 static assert(!__traits(compiles, { 100.p5e1; }) && !__traits(compiles, { (100.p5e1 = 1); }));
401 static assert(!__traits(compiles, { "s".p5e2; }) && !__traits(compiles, { ("s".p5e2 = 1); }));
402 static assert(!__traits(compiles, { 1.4.p5e3; }) && !__traits(compiles, { (1.4.p5e3 = 1); }));
403 static assert(!__traits(compiles, { 100.p5e4; }) && !__traits(compiles, { (100.p5e4 = 1); }));
404 static assert(!__traits(compiles, { "s".p5e4; }) && !__traits(compiles, { ("s".p5e4 = 1); }));
405 static assert(!__traits(compiles, { 100.p5e5; }) && !__traits(compiles, { (100.p5e5 = 1); }));
406 static assert(!__traits(compiles, { "s".p5e5; }) && !__traits(compiles, { ("s".p5e5 = 1); }));
407 static assert(!__traits(compiles, { 1.4.p5e5; }) && !__traits(compiles, { (1.4.p5e5 = 1); }));
410 int g5cm(int) { return 0; }
411 static int g5cs(int) { return 0; }
414 // UFCS does not see aggregate members
415 static assert(!__traits(compiles, { 1.g5cm(); }));
416 static assert(!__traits(compiles, { 1.g5cs(); }));
418 // Even if it is in base class
419 static assert(!__traits(compiles, { 1.g5bm(); }));
420 static assert(!__traits(compiles, { 1.g5bs(); }));
424 /*******************************************/
427 import std.stdio,std.string, std.conv;
434 //typedef int testi = 10;
435 //typedef Test Test2;
437 int test() { return 33; }
441 static int test(int i) { return i; }
446 return cast(int)test;
451 // return cast(int)i;
456 assert(22.to!string() == "22");
457 assert((new Test).test(11) == 11);
458 assert(Test.test(11) == 11);
459 //assert(Test2.test(11) == 11);
460 assert(test() == 33);
461 assert(ufcs.test() == 33);
462 assert(Etest.d.test() == Etest.d);
464 //assert(i.test() == i.init);
467 /*******************************************/
470 import std.range, std.algorithm;
472 @property T twice(T)(T x){ return x * x; }
473 real toreal(ireal x){ return x.im; }
474 char toupper(char c){ return ('a'<=c && c<='z') ? cast(char)(c - 'a' + 'A') : c; }
476 @property ref T setter(T)(ref T x, T v){ x = v; return x; }
480 auto r = iota(0, 10).map!"a*3"().filter!"a%2 != 0"();
482 printf("e = %d\n", e);
484 assert(10.twice == 100);
485 assert(0.5.twice == 0.25);
486 assert(1.4i.toreal() == 1.4);
487 assert('c'.toupper() == 'C');
490 /*******************************************/
495 import std.algorithm;
497 auto r1 = [1,2,3].map!"a*2";
498 assert(equal(r1, [2,4,6]));
500 auto r2 = r1.map!"a+2"();
501 assert(equal(r2, [4,6,8]));
504 /*******************************************/
507 enum test6070a = ["test"].foo6070();
508 enum test6070b = foo6070(["test"]);
510 string foo6070(string[] s) { return ""; }
512 /*******************************************/
519 @property ref double y7670(ref A7670 a)
526 a1.y7670() = 2.0; // OK
527 a1.y7670 = 2.0; // Error
530 /*******************************************/
532 void f7703(T)(T a) { }
538 x.f7703(); // accepted
539 x.f7703!int; // rejected -- "f(x) isn't a template"
540 x.f7703!int(); // accepted
543 /*******************************************/
547 void writeln7773(int n){}
550 (int.max).writeln7773(); // OK
551 int.max.writeln7773(); // error
554 /*******************************************/
563 int foo7943(Foo7943 f) { return 1; }
564 int foo7943(int i) { return 2; }
569 assert(f.foo7943() == 1);
572 /*******************************************/
575 int writeln8180(T...)(T args) { return 1; }
577 struct Tuple8180(T...)
585 auto t = Tuple8180!(int)(10);
586 assert(t.writeln8180() == 1);
589 /*******************************************/
592 string toStr8245(immutable(char)* p) { return null; }
593 @property string asStr8245(immutable(char)* p) { return null; }
597 immutable(char)* p = "foobar".ptr;
599 p.asStr8245; // Error: no property 'asStr' for type 'immutable(char)'
602 /*******************************************/
605 bool f(int x) { return !x; }
609 static assert(!1.f); // ok
610 static assert( 0.f); // fail
613 /*******************************************/
616 T[] sort8453(T)(T[] a) { return a; }
621 auto bar1 = foo.keys().sort8453(); // OK
622 auto bar2 = foo.keys.sort8453(); // Error
625 /*******************************************/
636 /*******************************************/
639 @property ref int foo9014(int[] a)
646 static assert(!__traits(compiles, {
647 bar.foo9014 = missing.foo9014;
651 /*******************************************/
654 auto func9590(E)(lazy E expr) { }
656 int f9590a() { assert(0); }
657 void f9590b() { assert(0); }
661 func9590(f9590a()); // ok, no exceptions (lazy)
662 f9590a().func9590; // ok, no exceptions (lazy)
664 func9590(f9590b()); // ok, no exceptions (lazy)
665 f9590b().func9590; // L12: NG
668 /*******************************************/
671 size_t count9946(alias x)(int[] haystack)
678 auto n1 = count9946!5(data); // OK
679 auto n2 = data.count9946!5; // OK
680 auto a1 = new int[count9946!5(data)]; // OK
681 auto a2 = new int[data.count9946!5]; // Error
684 /*******************************************/
687 template Temp10618(T)
693 auto arr = new int[Temp10618!int.len];
694 assert(arr.length == 1);
697 /*******************************************/
700 void foo10003(void *p) {}
707 /*******************************************/
710 auto writeln10041(T...)(T args) { return typeof(args[0]).stringof; }
715 assert(aa.writeln10041 == "int[int]");
716 assert(writeln10041(aa) == "int[int]");
719 /*******************************************/
722 struct Typedef10047(T)
724 template opDispatch(string name)
731 int foo10047(Typedef10047!A10047 a) { return 10; }
735 Typedef10047!A10047 a;
736 assert(a.foo10047() == 10);
739 /*******************************************/
747 void bar10166(alias handler, T)(T t, int i)
749 t.bar10166!buzz10166(i);
754 /*******************************************/
759 int opDispatch(string s, A...)(A args)
760 if (s[0..3] == "foo")
765 int bar10526(X)(X) { return 2; }
766 int baz10526(T, X)(X) { return 3; }
773 assert(s.foo10526() == 1);
774 assert(s.bar10526() == 2);
775 assert(s.baz10526!string() == 3);
777 // without parenthesis
778 assert(s.foo10526 == 1);
779 assert(s.bar10526 == 2);
780 assert(s.baz10526!string == 3);
783 /********************************************************/
786 int foo10609(int x) { return x; }
791 static assert(__traits(compiles, foo10609(x)));
792 static assert(__traits(compiles, 1.foo10609 ));
793 static assert(__traits(compiles, x.foo10609 ));
796 /*******************************************/
801 S11312* getS11312() { return null; }
802 int getValue(S11312*) { return 10; }
806 S11312* op = getS11312();
807 int x = op.getValue();
811 /*******************************************/
814 auto keys15123(K, V)(V[K] aa) { return [1]; }
815 auto values15123(K, V)(V[K] aa) { return [2]; }
817 alias id15123(alias arg) = arg;
819 enum int[int] aa15123 = [1:2];
820 static assert(id15123!(aa15123.keys15123) == [1]); // TypeIdentifier + UFCS
822 T[T] f15123(T)() { return [1:2]; }
823 static assert(id15123!(f15123!int.values15123) == [2]); // TypeInstance + UFCS
825 /*******************************************/