blob: e09c531f38ae86d72002e68d9d0c24759eaf7607 [file] [log] [blame]
// EXTRA_SOURCES: imports/ufcs5a.d imports/ufcs5b.d imports/ufcs5c.d imports/ufcs5d.d imports/ufcs5e.d
module ufcs;
extern (C) int printf(const char*, ...);
/*******************************************/
struct S {}
int foo(int n) { return 1; }
int foo(int n, int m) { return 2; }
int goo(int[] a) { return 1; }
int goo(int[] a, int m) { return 2; }
int bar(S s) { return 1; }
int bar(S s, int n) { return 2; }
int baz(X)(X x) { return 1; }
int baz(X)(X x, int n) { return 2; }
int temp;
ref int boo(int n) { return temp; }
ref int coo(int[] a) { return temp; }
ref int mar(S s) { return temp; }
ref int maz(X)(X x) { return temp; }
void test1()
{
int n;
int[] a;
S s;
assert( foo(4) == 1); assert( baz(4) == 1);
assert( 4.foo() == 1); assert( 4.baz() == 1);
assert( 4.foo == 1); assert( 4.baz == 1);
assert( foo(4, 2) == 2); assert( baz(4, 2) == 2);
assert( 4.foo(2) == 2); assert( 4.baz(2) == 2);
assert((4.foo = 2) == 2); assert((4.baz = 2) == 2);
assert( goo(a) == 1); assert( baz(a) == 1);
assert( a.goo() == 1); assert( a.baz() == 1);
assert( a.goo == 1); assert( a.baz == 1);
assert( goo(a, 2) == 2); assert( baz(a, 2) == 2);
assert( a.goo(2) == 2); assert( a.baz(2) == 2);
assert((a.goo = 2) == 2); assert((a.baz = 2) == 2);
assert( bar(s) == 1); assert( baz(s) == 1);
assert( s.bar() == 1); assert( s.baz() == 1);
assert( s.bar == 1); assert( s.baz == 1);
assert( bar(s, 2) == 2); assert( baz(s, 2) == 2);
assert( s.bar(2) == 2); assert( s.baz(2) == 2);
assert((s.bar = 2) == 2); assert((s.baz = 2) == 2);
assert(( boo(4) = 2) == 2); assert(( maz(4) = 2) == 2);
assert((4.boo = 2) == 2); assert((4.maz = 2) == 2);
assert(( coo(a) = 2) == 2); assert(( maz(a) = 2) == 2);
assert((a.coo = 2) == 2); assert((a.maz = 2) == 2);
assert(( mar(s) = 2) == 2); assert(( maz(s) = 2) == 2);
assert((s.mar = 2) == 2); assert((s.maz = 2) == 2);
}
int hoo(T)(int n) { return 1; }
int hoo(T)(int n, int m) { return 2; }
int koo(T)(int[] a) { return 1; }
int koo(T)(int[] a, int m) { return 2; }
int var(T)(S s) { return 1; }
int var(T)(S s, int n) { return 2; }
int vaz(T, X)(X x) { return 1; }
int vaz(T, X)(X x, int n) { return 2; }
//int temp;
ref int voo(T)(int n) { return temp; }
ref int woo(T)(int[] a) { return temp; }
ref int nar(T)(S s) { return temp; }
ref int naz(T, X)(X x) { return temp; }
void test2()
{
int n;
int[] a;
S s;
assert( hoo!int(4) == 1); assert( vaz!int(4) == 1);
assert( 4.hoo!int() == 1); assert( 4.vaz!int() == 1);
assert( 4.hoo!int == 1); assert( 4.vaz!int == 1);
assert( hoo!int(4, 2) == 2); assert( vaz!int(4, 2) == 2);
assert( 4.hoo!int(2) == 2); assert( 4.vaz!int(2) == 2);
assert((4.hoo!int = 2) == 2); assert((4.vaz!int = 2) == 2);
assert( koo!int(a) == 1); assert( vaz!int(a) == 1);
assert( a.koo!int() == 1); assert( a.vaz!int() == 1);
assert( a.koo!int == 1); assert( a.vaz!int == 1);
assert( koo!int(a, 2) == 2); assert( vaz!int(a, 2) == 2);
assert( a.koo!int(2) == 2); assert( a.vaz!int(2) == 2);
assert((a.koo!int = 2) == 2); assert((a.vaz!int = 2) == 2);
assert( var!int(s) == 1); assert( vaz!int(s) == 1);
assert( s.var!int() == 1); assert( s.vaz!int() == 1);
assert( s.var!int == 1); assert( s.vaz!int == 1);
assert( var!int(s, 2) == 2); assert( vaz!int(s, 2) == 2);
assert( s.var!int(2) == 2); assert( s.vaz!int(2) == 2);
assert((s.var!int = 2) == 2); assert((s.vaz!int = 2) == 2);
assert(( voo!int(4) = 2) == 2); assert(( naz!int(4) = 2) == 2);
assert((4.voo!int = 2) == 2); assert((4.naz!int = 2) == 2);
assert(( woo!int(a) = 2) == 2); assert(( naz!int(a) = 2) == 2);
assert((a.woo!int = 2) == 2); assert((a.naz!int = 2) == 2);
assert(( nar!int(s) = 2) == 2); assert(( naz!int(s) = 2) == 2);
assert((s.nar!int = 2) == 2); assert((s.naz!int = 2) == 2);
}
/*******************************************/
auto init(T)(T val) { return 1; }
auto sort(alias fun, T)(T val) { return 1; }
@property auto max(alias fun, T)(T val) { return 1; }
@property auto infinity(alias opt, T)(T val) { return 1; }
void test3()
{
// See built-in 'init' property
assert(1 .init == 0);
assert([1] .init == null);
assert([1:1].init == null);
assert(1.0 .init is double.nan);
assert(10i .init is idouble.nan);
assert('c' .init == 0xFF);
assert("s" .init == null);
// x.init() has parens, so it runs UFCS call
assert( 1 .init() == 1);
assert([1] .init() == 1);
assert([1:1].init() == 1);
assert(1.0 .init() == 1);
assert(10i .init() == 1);
assert('c' .init() == 1);
assert("s" .init() == 1);
// x.init!YYY matches templatized UFCS call.
assert( 1 .init!int() == 1);
assert([1] .init!(int[])() == 1);
assert([1:1].init!(int[int])() == 1);
assert(1.0 .init!double() == 1);
assert(10i .init!idouble() == 1);
assert('c' .init!char() == 1);
assert("s" .init!string() == 1);
assert([1].sort!"a<b"() == 1);
// templatized properties runs UFCS call.
assert(1024.max!"a<b" == 1);
assert(1024.max == int.max);
assert(3.14.infinity!"+" == 1);
assert(3.14.infinity == (double).infinity);
}
/*******************************************/
template Signal4()
{
void connect(){}
}
struct S4
{
mixin Signal4!() s;
}
void test4()
{
S4 s;
s.s.connect(); // s.s is TOKdotexp, so never match UFCS
}
/*******************************************/
auto f5_1(int) { return 1; }
auto f5_2(string) { return 2; }
auto f5_3(double) { return 3; }
alias f5_4 = f5_1, f5_4 = f5_2;
alias f5_5 = f5_3, f5_5 = f5_4;
@property p5_1(int) { return 1; } @property p5_1(int, int) { return 1; }
@property p5_2(string) { return 2; } @property p5_2(string, int) { return 2; }
@property p5_3(double) { return 3; } @property p5_3(double, int) { return 3; }
alias p5_4 = p5_1, p5_4 = p5_2; alias p5_4 = p5_1, p5_4 = p5_2;
alias p5_5 = p5_3, p5_5 = p5_4; alias p5_5 = p5_3, p5_5 = p5_4;
// import overload set 'f5ov' and 'p5ov'
import imports.ufcs5b, imports.ufcs5c;
void test5()
{
{
// f5_1 .. f5_5 are symbols which declared in module scope
assert(100.f5_1() == 1);
assert("s".f5_2() == 2);
assert(1.4.f5_3() == 3);
assert(100.f5_4() == 1);
assert("s".f5_4() == 2);
assert(100.f5_5() == 1);
assert("s".f5_5() == 2);
assert(1.4.f5_5() == 3);
// overload set
assert(100.f5ov() == 1);
assert("s".f5ov() == 2);
// UFCS does not see function local alias
alias func5 = f5_1;
static assert(!__traits(compiles, { 1.func5(); }));
// property getter/setter
assert(100.p5_1 == 1); assert((100.p5_1 = 1) == 1);
assert("s".p5_2 == 2); assert(("s".p5_2 = 1) == 2);
assert(1.4.p5_3 == 3); assert((1.4.p5_3 = 1) == 3);
assert(100.p5_4 == 1); assert((100.p5_4 = 1) == 1);
assert("s".p5_4 == 2); assert(("s".p5_4 = 1) == 2);
assert(100.p5_5 == 1); assert((100.p5_5 = 1) == 1);
assert("s".p5_5 == 2); assert(("s".p5_5 = 1) == 2);
assert(1.4.p5_5 == 3); assert((1.4.p5_5 = 1) == 3);
// overload set ); assert(
assert(100.p5ov == 1); assert((100.p5ov = 1) == 1);
assert("s".p5ov == 2); assert(("s".p5ov = 1) == 2);
// local alias
alias prop5 = p5_1;
static assert(!__traits(compiles, { 1.prop5; }));
static assert(!__traits(compiles, { 1.prop5 = 1; }));
}
{
// f5a1 .. f5a5 are symbols which declared in module scope
import imports.ufcs5a;
// overload set 'f5ov' and 'p5ov'
import imports.ufcs5b, imports.ufcs5c;
assert(100.f5a1() == 1);
assert("s".f5a2() == 2);
assert(1.4.f5a3() == 3);
assert(100.f5a4() == 1);
assert("s".f5a4() == 2);
assert(100.f5a5() == 1);
assert("s".f5a5() == 2);
assert(1.4.f5a5() == 3);
assert(100.f5ov() == 1);
assert("s".f5ov() == 2);
assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
assert(1.4.p5a3 == 3); assert((1.4.p5a3 = 1) == 3);
assert(100.p5a4 == 1); assert((100.p5a4 = 1) == 1);
assert("s".p5a4 == 2); assert(("s".p5a4 = 1) == 2);
assert(100.p5a5 == 1); assert((100.p5a5 = 1) == 1);
assert("s".p5a5 == 2); assert(("s".p5a5 = 1) == 2);
assert(1.4.p5a5 == 3); assert((1.4.p5a5 = 1) == 3);
assert(100.p5ov == 1); assert((100.p5ov = 1) == 1);
assert("s".p5ov == 2); assert(("s".p5ov = 1) == 2);
}
{
// selective imports also work as expected
import imports.ufcs5a : f5a1, f5a2;
import imports.ufcs5a : p5a1, p5a2;
assert(100.f5a1() == 1);
assert("s".f5a2() == 2);
static assert(!__traits(compiles, { 1.4.f5a3(); }));
static assert(!__traits(compiles, { 100.f5a4(); }));
static assert(!__traits(compiles, { "s".f5a4(); }));
static assert(!__traits(compiles, { 100.f5a5(); }));
static assert(!__traits(compiles, { "s".f5a5(); }));
static assert(!__traits(compiles, { 1.4.f5a5(); }));
assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
static assert(!__traits(compiles, { 1.4.p5a3; }) && !__traits(compiles, { 1.4.p5a3 = 1; }));
static assert(!__traits(compiles, { 100.p5a4; }) && !__traits(compiles, { 100.p5a4 = 1; }));
static assert(!__traits(compiles, { "s".p5a4; }) && !__traits(compiles, { "s".p5a4 = 1; }));
static assert(!__traits(compiles, { 100.p5a5; }) && !__traits(compiles, { 100.p5a5 = 1; }));
static assert(!__traits(compiles, { "s".p5a5; }) && !__traits(compiles, { "s".p5a5 = 1; }));
static assert(!__traits(compiles, { 1.4.p5a5; }) && !__traits(compiles, { 1.4.p5a5 = 1; }));
}
{
// renamed imports also work as expected
import imports.ufcs5a : f5x1 = f5a1, f5x2 = f5a2;
import imports.ufcs5a : p5x1 = p5a1, p5x2 = p5a2;
assert(100.f5x1() == 1);
assert("s".f5x2() == 2);
static assert(!__traits(compiles, { 100.f5a1(); }));
static assert(!__traits(compiles, { "s".f5a2(); }));
static assert(!__traits(compiles, { 1.4.f5a3(); }));
static assert(!__traits(compiles, { 100.f5a4(); }));
static assert(!__traits(compiles, { "s".f5a4(); }));
static assert(!__traits(compiles, { 100.f5a5(); }));
static assert(!__traits(compiles, { "s".f5a5(); }));
static assert(!__traits(compiles, { 1.4.f5a5(); }));
assert(100.p5x1 == 1); assert((100.p5x1 = 1) == 1);
assert("s".p5x2 == 2); assert(("s".p5x2 = 1) == 2);
static assert(!__traits(compiles, { 100.p5a1; }) && !__traits(compiles, { 100.p5a1 = 1; }));
static assert(!__traits(compiles, { "s".p5a2; }) && !__traits(compiles, { "s".p5a2 = 1; }));
static assert(!__traits(compiles, { 1.4.p5a3; }) && !__traits(compiles, { 1.4.p5a3 = 1; }));
static assert(!__traits(compiles, { 100.p5a4; }) && !__traits(compiles, { 100.p5a4 = 1; }));
static assert(!__traits(compiles, { "s".p5a4; }) && !__traits(compiles, { "s".p5a4 = 1; }));
static assert(!__traits(compiles, { 100.p5a5; }) && !__traits(compiles, { 100.p5a5 = 1; }));
static assert(!__traits(compiles, { "s".p5a5; }) && !__traits(compiles, { "s".p5a5 = 1; }));
static assert(!__traits(compiles, { 1.4.p5a5; }) && !__traits(compiles, { 1.4.p5a5 = 1; }));
}
{
auto c5 = new C5();
foreach (name; __traits(allMembers, C5))
{
static if (name.length >= 4 && name[0..4] == "test")
{
mixin("c5."~name~"();"); // call test function
}
}
}
}
class B5
{
int g5bm(int) { return 0; }
static int g5bs(int) { return 0; }
}
class C5 : B5
{
// normal import works.
import imports.ufcs5a;
void test1()
{
assert(100.f5a1() == 1);
assert("s".f5a2() == 2);
assert(1.4.f5a3() == 3);
assert(100.f5a4() == 1);
assert("s".f5a4() == 2);
assert(100.f5a5() == 1);
assert("s".f5a5() == 2);
assert(1.4.f5a5() == 3);
assert(100.p5a1 == 1); assert((100.p5a1 = 1) == 1);
assert("s".p5a2 == 2); assert(("s".p5a2 = 1) == 2);
assert(1.4.p5a3 == 3); assert((1.4.p5a3 = 1) == 3);
assert(100.p5a4 == 1); assert((100.p5a4 = 1) == 1);
assert("s".p5a4 == 2); assert(("s".p5a4 = 1) == 2);
assert(100.p5a5 == 1); assert((100.p5a5 = 1) == 1);
assert("s".p5a5 == 2); assert(("s".p5a5 = 1) == 2);
assert(1.4.p5a5 == 3); assert((1.4.p5a5 = 1) == 3);
}
// selective imports also work as expected
import imports.ufcs5d : f5d1, f5d2;
import imports.ufcs5d : p5d1, p5d2;
void test2()
{
assert(100.f5d1() == 1);
assert("s".f5d2() == 2);
static assert(!__traits(compiles, { 1.4.f5d3(); }));
static assert(!__traits(compiles, { 100.f5d4(); }));
static assert(!__traits(compiles, { "s".f5d4(); }));
static assert(!__traits(compiles, { 100.f5d5(); }));
static assert(!__traits(compiles, { "s".f5d5(); }));
static assert(!__traits(compiles, { 1.4.f5d5(); }));
assert(100.p5d1 == 1); assert((100.p5d1 = 1) == 1);
assert("s".p5d2 == 2); assert(("s".p5d2 = 1) == 2);
static assert(!__traits(compiles, { 1.4.p5d3; }) && !__traits(compiles, { 1.4.p5d3 = 1; }));
static assert(!__traits(compiles, { 100.p5d4; }) && !__traits(compiles, { 100.p5d4 = 1; }));
static assert(!__traits(compiles, { "s".p5d4; }) && !__traits(compiles, { "s".p5d4 = 1; }));
static assert(!__traits(compiles, { 100.p5d5; }) && !__traits(compiles, { 100.p5d5 = 1; }));
static assert(!__traits(compiles, { "s".p5d5; }) && !__traits(compiles, { "s".p5d5 = 1; }));
static assert(!__traits(compiles, { 1.4.p5d5; }) && !__traits(compiles, { 1.4.p5d5 = 1; }));
}
// renamed imports also work as expected
import imports.ufcs5e : f5y1 = f5e1, f5y2 = f5e2;
import imports.ufcs5e : p5y1 = p5e1, p5y2 = p5e2;
void test3()
{
assert(100.f5y1() == 1);
assert("s".f5y2() == 2);
static assert(!__traits(compiles, { 100.f5e1(); }));
static assert(!__traits(compiles, { "s".f5e2(); }));
static assert(!__traits(compiles, { 1.4.f5e3(); }));
static assert(!__traits(compiles, { 100.f5e4(); }));
static assert(!__traits(compiles, { "s".f5e4(); }));
static assert(!__traits(compiles, { 100.f5e5(); }));
static assert(!__traits(compiles, { "s".f5e5(); }));
static assert(!__traits(compiles, { 1.4.f5e5(); }));
assert(100.p5y1 == 1); assert((100.p5y1 = 1) == 1);
assert("s".p5y2 == 2); assert(("s".p5y2 = 1) == 2);
static assert(!__traits(compiles, { 100.p5e1; }) && !__traits(compiles, { (100.p5e1 = 1); }));
static assert(!__traits(compiles, { "s".p5e2; }) && !__traits(compiles, { ("s".p5e2 = 1); }));
static assert(!__traits(compiles, { 1.4.p5e3; }) && !__traits(compiles, { (1.4.p5e3 = 1); }));
static assert(!__traits(compiles, { 100.p5e4; }) && !__traits(compiles, { (100.p5e4 = 1); }));
static assert(!__traits(compiles, { "s".p5e4; }) && !__traits(compiles, { ("s".p5e4 = 1); }));
static assert(!__traits(compiles, { 100.p5e5; }) && !__traits(compiles, { (100.p5e5 = 1); }));
static assert(!__traits(compiles, { "s".p5e5; }) && !__traits(compiles, { ("s".p5e5 = 1); }));
static assert(!__traits(compiles, { 1.4.p5e5; }) && !__traits(compiles, { (1.4.p5e5 = 1); }));
}
int g5cm(int) { return 0; }
static int g5cs(int) { return 0; }
void test4()
{
// UFCS does not see aggregate members
static assert(!__traits(compiles, { 1.g5cm(); }));
static assert(!__traits(compiles, { 1.g5cs(); }));
// Even if it is in base class
static assert(!__traits(compiles, { 1.g5bm(); }));
static assert(!__traits(compiles, { 1.g5bs(); }));
}
}
/*******************************************/
// 662
import std.stdio,std.string, std.conv;
enum Etest
{
a,b,c,d
}
//typedef int testi = 10;
//typedef Test Test2;
int test() { return 33; }
class Test
{
static int test(int i) { return i; }
}
int test(Etest test)
{
return cast(int)test;
}
//int test(testi i)
//{
// return cast(int)i;
//}
void test682()
{
assert(22.to!string() == "22");
assert((new Test).test(11) == 11);
assert(Test.test(11) == 11);
//assert(Test2.test(11) == 11);
assert(test() == 33);
assert(ufcs.test() == 33);
assert(Etest.d.test() == Etest.d);
//testi i;
//assert(i.test() == i.init);
}
/*******************************************/
// 3382
import std.range, std.algorithm;
@property T twice(T)(T x){ return x * x; }
real toreal(ireal x){ return x.im; }
char toupper(char c){ return ('a'<=c && c<='z') ? cast(char)(c - 'a' + 'A') : c; }
@property ref T setter(T)(ref T x, T v){ x = v; return x; }
void test3382()
{
auto r = iota(0, 10).map!"a*3"().filter!"a%2 != 0"();
foreach (e; r)
printf("e = %d\n", e);
assert(10.twice == 100);
assert(0.5.twice == 0.25);
assert(1.4i.toreal() == 1.4);
assert('c'.toupper() == 'C');
}
/*******************************************/
// 6185
void test6185()
{
import std.algorithm;
auto r1 = [1,2,3].map!"a*2";
assert(equal(r1, [2,4,6]));
auto r2 = r1.map!"a+2"();
assert(equal(r2, [4,6,8]));
}
/*******************************************/
// 6070
enum test6070a = ["test"].foo6070();
enum test6070b = foo6070(["test"]);
string foo6070(string[] s) { return ""; }
/*******************************************/
// 7670
struct A7670
{
double x;
}
@property ref double y7670(ref A7670 a)
{
return a.x;
}
void test7670()
{
A7670 a1;
a1.y7670() = 2.0; // OK
a1.y7670 = 2.0; // Error
}
/*******************************************/
// 7703
void f7703(T)(T a) { }
void test7703()
{
int x;
x.f7703; // accepted
x.f7703(); // accepted
x.f7703!int; // rejected -- "f(x) isn't a template"
x.f7703!int(); // accepted
}
/*******************************************/
// 7773
//import std.stdio;
void writeln7773(int n){}
void test7773()
{
(int.max).writeln7773(); // OK
int.max.writeln7773(); // error
}
/*******************************************/
// 7943
struct Foo7943
{
int _member;
alias _member this;
}
int foo7943(Foo7943 f) { return 1; }
int foo7943(int i) { return 2; }
void test7943()
{
Foo7943 f;
assert(f.foo7943() == 1);
}
/*******************************************/
// 8180
int writeln8180(T...)(T args) { return 1; }
struct Tuple8180(T...)
{
T field;
alias field this;
}
void test8180()
{
auto t = Tuple8180!(int)(10);
assert(t.writeln8180() == 1);
}
/*******************************************/
// 8245
string toStr8245(immutable(char)* p) { return null; }
@property string asStr8245(immutable(char)* p) { return null; }
void test8245()
{
immutable(char)* p = "foobar".ptr;
p.toStr8245();
p.asStr8245; // Error: no property 'asStr' for type 'immutable(char)'
}
/*******************************************/
// 8252
bool f(int x) { return !x; }
void test8252()
{
static assert(!1.f); // ok
static assert( 0.f); // fail
}
/*******************************************/
// 8453
T[] sort8453(T)(T[] a) { return a; }
void test8453()
{
int[int] foo;
auto bar1 = foo.keys().sort8453(); // OK
auto bar2 = foo.keys.sort8453(); // Error
}
/*******************************************/
// 8503
void α8503(int i) {}
void test8503()
{
0.α8503(); // Error
1.α8503(); // Error
}
/*******************************************/
// 9014
@property ref int foo9014(int[] a)
{
return a[0];
}
void test9014()
{
int[] bar;
static assert(!__traits(compiles, {
bar.foo9014 = missing.foo9014;
}));
}
/*******************************************/
// 9590
auto func9590(E)(lazy E expr) { }
int f9590a() { assert(0); }
void f9590b() { assert(0); }
void test9590()
{
func9590(f9590a()); // ok, no exceptions (lazy)
f9590a().func9590; // ok, no exceptions (lazy)
func9590(f9590b()); // ok, no exceptions (lazy)
f9590b().func9590; // L12: NG
}
/*******************************************/
// 9946
size_t count9946(alias x)(int[] haystack)
{
return 0;
}
void test9946()
{
int[] data;
auto n1 = count9946!5(data); // OK
auto n2 = data.count9946!5; // OK
auto a1 = new int[count9946!5(data)]; // OK
auto a2 = new int[data.count9946!5]; // Error
}
/*******************************************/
// 10618
template Temp10618(T)
{
size_t len = 1;
}
void test10618()
{
auto arr = new int[Temp10618!int.len];
assert(arr.length == 1);
}
/*******************************************/
// 10003
void foo10003(void *p) {}
void test10003()
{
void* p;
p.foo10003();
}
/*******************************************/
// 10041
auto writeln10041(T...)(T args) { return typeof(args[0]).stringof; }
void test10041()
{
auto aa = [1: 2];
assert(aa.writeln10041 == "int[int]");
assert(writeln10041(aa) == "int[int]");
}
/*******************************************/
// 10047
struct Typedef10047(T)
{
template opDispatch(string name)
{
static assert(0);
}
}
struct A10047 {}
int foo10047(Typedef10047!A10047 a) { return 10; }
void test10047()
{
Typedef10047!A10047 a;
assert(a.foo10047() == 10);
}
/*******************************************/
// 10166
auto foo10166()
{
0.bar10166!({})(0);
}
void bar10166(alias handler, T)(T t, int i)
{
t.bar10166!buzz10166(i);
}
void buzz10166() {}
/*******************************************/
// 10526
struct S10526
{
int opDispatch(string s, A...)(A args)
if (s[0..3] == "foo")
{
return 1;
}
}
int bar10526(X)(X) { return 2; }
int baz10526(T, X)(X) { return 3; }
void test10526()
{
S10526 s;
// with parenthesis
assert(s.foo10526() == 1);
assert(s.bar10526() == 2);
assert(s.baz10526!string() == 3);
// without parenthesis
assert(s.foo10526 == 1);
assert(s.bar10526 == 2);
assert(s.baz10526!string == 3);
}
/********************************************************/
// 10609
int foo10609(int x) { return x; }
void test10609()
{
int x = 1;
static assert(__traits(compiles, foo10609(x)));
static assert(__traits(compiles, 1.foo10609 ));
static assert(__traits(compiles, x.foo10609 ));
}
/*******************************************/
// 11312
struct S11312;
S11312* getS11312() { return null; }
int getValue(S11312*) { return 10; }
void test11312()
{
S11312* op = getS11312();
int x = op.getValue();
assert(x == 10);
}
/*******************************************/
// 15123
auto keys15123(K, V)(V[K] aa) { return [1]; }
auto values15123(K, V)(V[K] aa) { return [2]; }
alias id15123(alias arg) = arg;
enum int[int] aa15123 = [1:2];
static assert(id15123!(aa15123.keys15123) == [1]); // TypeIdentifier + UFCS
T[T] f15123(T)() { return [1:2]; }
static assert(id15123!(f15123!int.values15123) == [2]); // TypeInstance + UFCS
/*******************************************/
int main()
{
test1();
test2();
test3();
test4();
test5();
test682();
test3382();
test6185();
test7670();
test7703();
test7773();
test7943();
test8180();
test8245();
test8252();
test8453();
test8503();
test9014();
test9590();
test9946();
test10618();
test10003();
test10041();
test10047();
test10526();
test11312();
printf("Success\n");
return 0;
}