ubuntu-buildroot/output/build/host-gcc-initial-11.4.0/gcc/testsuite/gdc.test/runnable/ufcs.d

859 lines
24 KiB
D
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 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;
}