mirror of
https://github.com/dlang/dmd.git
synced 2025-04-26 05:00:16 +03:00
5165 lines
123 KiB
D
5165 lines
123 KiB
D
/*
|
|
REQUIRED_ARGS: -preview=rvaluerefparam
|
|
PERMUTE_ARGS:
|
|
EXTRA_FILES: imports/testmangle.d
|
|
TEST_OUTPUT:
|
|
---
|
|
func
|
|
double
|
|
All good 1
|
|
All good 2
|
|
All good 3
|
|
_D7imports10testmangle12detectMangleFPSQBlQBg6DetectZQq
|
|
_D7imports10testmangle__T10DetectTmplTiZQpFNaNbNiNfZv
|
|
true
|
|
false
|
|
uint
|
|
int[]
|
|
int[]
|
|
const(K5886)
|
|
4 ; const(K5886)
|
|
8 ; const(K5886)
|
|
K5886
|
|
immutable(K5886)
|
|
4 ; K5886
|
|
4 ; immutable(K5886)
|
|
1 ; K5886
|
|
2 ; const(K5886)
|
|
3 ; immutable(K5886)
|
|
8 ; K5886
|
|
9 ; const(K5886)
|
|
10 ; immutable(K5886)
|
|
> U = int, N:$?:64=ulong = 3LU|32=uint = 3u$
|
|
K=string, V=int
|
|
K=char, V=string
|
|
T = SA, E = int, dim = $?:64=5LU|32=5u$
|
|
T = DA, E = int
|
|
T = AA, K = string, V = int
|
|
pure nothrow @nogc @safe void(int t)
|
|
pure nothrow @nogc @safe void(int t)
|
|
T = byte
|
|
T = char
|
|
---
|
|
|
|
RUN_OUTPUT:
|
|
---
|
|
typeof(T)=double typeof(S)=int
|
|
typeof(T)=double typeof(S)=int
|
|
typeof(T)=float typeof(S)=int
|
|
Success
|
|
---
|
|
*/
|
|
|
|
module breaker;
|
|
|
|
import core.stdc.stdio, core.vararg;
|
|
|
|
/**********************************/
|
|
|
|
U foo(T, U)(U i)
|
|
{
|
|
return i + 1;
|
|
}
|
|
|
|
int foo(T)(int i)
|
|
{
|
|
return i + 2;
|
|
}
|
|
|
|
void test1()
|
|
{
|
|
auto i = foo!(int)(2L);
|
|
// assert(i == 4); // now returns 3
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
U foo2(T, U)(U i)
|
|
{
|
|
return i + 1;
|
|
}
|
|
|
|
void test2()
|
|
{
|
|
auto i = foo2!(int)(2L);
|
|
assert(i == 3);
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
class Foo3
|
|
{
|
|
T bar(T,U)(U u)
|
|
{
|
|
return cast(T)u;
|
|
}
|
|
}
|
|
|
|
void test3()
|
|
{
|
|
Foo3 foo = new Foo3;
|
|
int i = foo.bar!(int)(1.0);
|
|
assert(i == 1);
|
|
}
|
|
|
|
|
|
/**********************************/
|
|
|
|
T* begin4(T)(T[] a) { return a.ptr; }
|
|
|
|
void copy4(string pred = "", Ranges...)(Ranges rs)
|
|
{
|
|
alias rs[$ - 1] target;
|
|
pragma(msg, typeof(target).stringof);
|
|
auto tb = begin4(target);//, te = end(target);
|
|
}
|
|
|
|
void test4()
|
|
{
|
|
int[] a, b, c;
|
|
copy4(a, b, c);
|
|
// comment the following line to prevent compiler from crashing
|
|
copy4!("a > 1")(a, b, c);
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
template foo5(T,S)
|
|
{
|
|
void foo5(T t, S s) {
|
|
const tstr = typeid(T).toString();
|
|
const sstr = typeid(S).toString();
|
|
printf("typeof(T)=%.*s typeof(S)=%.*s\n",
|
|
cast(int)tstr.length, tstr.ptr, cast(int)sstr.length, sstr.ptr);
|
|
}
|
|
}
|
|
|
|
template bar5(T,S)
|
|
{
|
|
void bar5(S s) {
|
|
const tstr = typeid(T).toString();
|
|
const sstr = typeid(S).toString();
|
|
printf("typeof(T)=%.*s typeof(S)=%.*s\n",
|
|
cast(int)tstr.length, tstr.ptr, cast(int)sstr.length, sstr.ptr);
|
|
}
|
|
}
|
|
|
|
|
|
void test5()
|
|
{
|
|
foo5(1.0,33);
|
|
bar5!(double,int)(33);
|
|
bar5!(float)(33);
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
int foo6(T...)(auto ref T x)
|
|
{ int result;
|
|
|
|
foreach (i, v; x)
|
|
{
|
|
if (v == 10)
|
|
assert(__traits(isRef, x[i]));
|
|
else
|
|
assert(!__traits(isRef, x[i]));
|
|
result += v;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
void test6()
|
|
{ int y = 10;
|
|
int r;
|
|
r = foo6(8);
|
|
assert(r == 8);
|
|
r = foo6(y);
|
|
assert(r == 10);
|
|
r = foo6(3, 4, y);
|
|
assert(r == 17);
|
|
r = foo6(4, 5, y);
|
|
assert(r == 19);
|
|
r = foo6(y, 6, y);
|
|
assert(r == 26);
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
auto ref min(T, U)(auto ref T lhs, auto ref U rhs)
|
|
{
|
|
return lhs > rhs ? rhs : lhs;
|
|
}
|
|
|
|
void test7()
|
|
{ int x = 7, y = 8;
|
|
int i;
|
|
|
|
i = min(4, 3);
|
|
assert(i == 3);
|
|
i = min(x, y);
|
|
assert(i == 7);
|
|
min(x, y) = 10;
|
|
assert(x == 10);
|
|
static assert(!__traits(compiles, min(3, y) = 10));
|
|
static assert(!__traits(compiles, min(y, 3) = 10));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5946
|
|
|
|
template TTest8()
|
|
{
|
|
int call(){ return this.g(); }
|
|
}
|
|
class CTest8
|
|
{
|
|
int f() { mixin TTest8!(); return call(); }
|
|
int g() { return 10; }
|
|
}
|
|
void test8()
|
|
{
|
|
assert((new CTest8()).f() == 10);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=693
|
|
|
|
template TTest9(alias sym)
|
|
{
|
|
int call(){ return sym.g(); }
|
|
}
|
|
class CTest9
|
|
{
|
|
int f1() { mixin TTest9!(this); return call(); }
|
|
int f2() { mixin TTest9!this; return call(); }
|
|
int g() { return 10; }
|
|
}
|
|
void test9()
|
|
{
|
|
assert((new CTest9()).f1() == 10);
|
|
assert((new CTest9()).f2() == 10);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=1780
|
|
|
|
template Tuple1780(Ts ...) { alias Ts Tuple1780; }
|
|
|
|
template Decode1780( T ) { alias Tuple1780!() Types; }
|
|
template Decode1780( T : TT!(Us), alias TT, Us... ) { alias Us Types; }
|
|
|
|
void test1780()
|
|
{
|
|
struct S1780(T1, T2) {}
|
|
|
|
// should extract tuple (bool,short) but matches the first specialisation
|
|
alias Decode1780!( S1780!(bool,short) ).Types SQ1780; // --> SQ2 is empty tuple!
|
|
static assert(is(SQ1780 == Tuple1780!(bool, short)));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=1659
|
|
|
|
class Foo1659 { }
|
|
class Bar1659 : Foo1659 { }
|
|
|
|
void f1659(T : Foo1659)() { }
|
|
void f1659(alias T)() { static assert(false); }
|
|
|
|
void test1659()
|
|
{
|
|
f1659!Bar1659();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2025
|
|
|
|
struct S2025 {}
|
|
void f2025() {}
|
|
|
|
template Foo2025(int i) { enum Foo2025 = 1; }
|
|
template Foo2025(TL...) { enum Foo2025 = 2; }
|
|
static assert(Foo2025!1 == 1);
|
|
static assert(Foo2025!int == 2);
|
|
static assert(Foo2025!S2025 == 2);
|
|
static assert(Foo2025!f2025 == 2);
|
|
|
|
template Bar2025(T) { enum Bar2025 = 1; }
|
|
template Bar2025(A...) { enum Bar2025 = 2; }
|
|
static assert(Bar2025!1 == 2);
|
|
static assert(Bar2025!int == 1); // 2 -> 1
|
|
static assert(Bar2025!S2025 == 1); // 2 -> 1
|
|
static assert(Bar2025!f2025 == 2);
|
|
|
|
template Baz2025(T) { enum Baz2025 = 1; }
|
|
template Baz2025(alias A) { enum Baz2025 = 2; }
|
|
static assert(Baz2025!1 == 2);
|
|
static assert(Baz2025!int == 1);
|
|
static assert(Baz2025!S2025 == 1); // 2 -> 1
|
|
static assert(Baz2025!f2025 == 2);
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=3608
|
|
|
|
template foo3608(T, U){}
|
|
|
|
template BaseTemplate3608(alias TTT : U!V, alias U, V...)
|
|
{
|
|
alias U BaseTemplate3608;
|
|
}
|
|
template TemplateParams3608(alias T : U!V, alias U, V...)
|
|
{
|
|
alias V TemplateParams3608;
|
|
}
|
|
|
|
template TyueTuple3608(T...) { alias T TyueTuple3608; }
|
|
|
|
void test3608()
|
|
{
|
|
alias foo3608!(int, long) Foo3608;
|
|
|
|
static assert(__traits(isSame, BaseTemplate3608!Foo3608, foo3608));
|
|
static assert(is(TemplateParams3608!Foo3608 == TyueTuple3608!(int, long)));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5015
|
|
|
|
import breaker;
|
|
|
|
static if (is(ElemType!(int))){}
|
|
|
|
template ElemType(T) {
|
|
alias _ElemType!(T).type ElemType;
|
|
}
|
|
|
|
template _ElemType(T) {
|
|
alias r type;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5185
|
|
|
|
class C5185(V)
|
|
{
|
|
void f()
|
|
{
|
|
C5185!(C5185!(int)) c;
|
|
}
|
|
}
|
|
|
|
void test5185()
|
|
{
|
|
C5185!(C5185!(int)) c;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5893
|
|
|
|
class C5893
|
|
{
|
|
int concatAssign(C5893 other) { return 1; }
|
|
int concatAssign(int other) { return 2; } // to demonstrate overloading
|
|
|
|
template opOpAssign(string op) if (op == "~")
|
|
{ alias concatAssign opOpAssign; }
|
|
|
|
int opOpAssign(string op)(int other) if (op == "+") { return 3; }
|
|
}
|
|
|
|
void test5893()
|
|
{
|
|
auto c = new C5893;
|
|
assert(c.opOpAssign!"~"(c) == 1); // works
|
|
assert(c.opOpAssign!"~"(1) == 2); // works
|
|
assert((c ~= 1) == 2);
|
|
assert((c += 1) == 3); // overload
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5988
|
|
|
|
template Templ5988(alias T)
|
|
{
|
|
alias T!int Templ5988;
|
|
}
|
|
|
|
class C5988a(T) { Templ5988!C5988a foo; }
|
|
//Templ5988!C5988a foo5988a; // Commented version
|
|
void test5988a() { C5988a!int a; } // Was error, now works
|
|
|
|
class C5988b(T) { Templ5988!C5988b foo; }
|
|
Templ5988!C5988b foo5988b; // Uncomment version
|
|
void test5988b() { C5988b!int a; } // Works
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6404
|
|
|
|
// receive only rvalue
|
|
void rvalue(T)(auto ref T x) if (!__traits(isRef, x)) {}
|
|
void rvalueVargs(T...)(auto ref T x) if (!__traits(isRef, x[0])) {}
|
|
|
|
// receive only lvalue
|
|
void lvalue(T)(auto ref T x) if ( __traits(isRef, x)) {}
|
|
void lvalueVargs(T...)(auto ref T x) if ( __traits(isRef, x[0])) {}
|
|
|
|
void test6404()
|
|
{
|
|
int n;
|
|
|
|
static assert(!__traits(compiles, rvalue(n)));
|
|
static assert( __traits(compiles, rvalue(0)));
|
|
|
|
static assert( __traits(compiles, lvalue(n)));
|
|
static assert(!__traits(compiles, lvalue(0)));
|
|
|
|
static assert(!__traits(compiles, rvalueVargs(n)));
|
|
static assert( __traits(compiles, rvalueVargs(0)));
|
|
|
|
static assert( __traits(compiles, lvalueVargs(n)));
|
|
static assert(!__traits(compiles, lvalueVargs(0)));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2246
|
|
|
|
class A2246(T,d){
|
|
T p;
|
|
}
|
|
|
|
class B2246(int rk){
|
|
int[rk] p;
|
|
}
|
|
|
|
class C2246(T,int rk){
|
|
T[rk] p;
|
|
}
|
|
|
|
template f2246(T:A2246!(U,d),U,d){
|
|
void f2246(){ }
|
|
}
|
|
|
|
template f2246(T:B2246!(rank),int rank){
|
|
void f2246(){ }
|
|
}
|
|
|
|
template f2246(T:C2246!(U,rank),U,int rank){
|
|
void f2246(){ }
|
|
}
|
|
|
|
void test2246(){
|
|
A2246!(int,long) a;
|
|
B2246!(2) b;
|
|
C2246!(int,2) c;
|
|
f2246!(A2246!(int,long))();
|
|
f2246!(B2246!(2))();
|
|
f2246!(C2246!(int,2))();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2296
|
|
|
|
void foo2296(size_t D)(int[D] i...){}
|
|
void test2296()
|
|
{
|
|
foo2296(1, 2, 3);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=1684
|
|
|
|
template Test1684( uint memberOffset ){}
|
|
|
|
class MyClass1684 {
|
|
int flags2;
|
|
mixin Test1684!(cast(uint)flags2.offsetof) t1; // compiles ok
|
|
mixin Test1684!(cast(int)flags2.offsetof) t2; // compiles ok
|
|
mixin Test1684!(flags2.offsetof) t3; // Error: no property 'offsetof' for type 'int'
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
void bug4984a(int n)() if (n > 0 && is(typeof(bug4984a!(n-1) ()))) {
|
|
}
|
|
|
|
void bug4984a(int n : 0)() {
|
|
}
|
|
|
|
void bug4984b(U...)(U args) if ( is(typeof( bug4984b(args[1..$]) )) ) {
|
|
}
|
|
|
|
void bug4984b(U)(U u) {
|
|
}
|
|
|
|
void bug4984() {
|
|
// Note: compiling this overflows the stack if dmd is build with DEBUG
|
|
//bug4984a!400();
|
|
bug4984a!200();
|
|
bug4984b(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19);
|
|
}
|
|
|
|
/***************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2579
|
|
|
|
void foo2579(T)(T delegate(in Object) dlg)
|
|
{
|
|
}
|
|
|
|
void test2579()
|
|
{
|
|
foo2579( (in Object o) { return 15; } );
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2803
|
|
|
|
auto foo2803(T)(T t = 0) { return t; }
|
|
|
|
struct S2803 {}
|
|
S2803 s2803;
|
|
ref S2803 getS2803() { return s2803; }
|
|
auto fun2803(T, U)(T t, ref U u = getS2803)
|
|
{
|
|
static assert(is(U == S2803));
|
|
return &u;
|
|
}
|
|
|
|
// from the past version of std.conv
|
|
template to2803(T) { T to2803(S)(S src) { return T.init; } }
|
|
auto toImpl2803a(T, S)(S s, in T left, in T sep = ", ", in T right = "]") {}
|
|
auto toImpl2803b(T, S)(S s, in T left = to2803!T(S.stringof~"("), in T right = ")") {}
|
|
auto toImpl2803c(T, S)(S s, in T left = S.stringof~"(" , in T right = ")") {} // combination with enh 13944
|
|
|
|
// from std.range.package in 2.067a.
|
|
auto enumerate2803(En = size_t, R)(R r, En start = 0)
|
|
{
|
|
// The type of 'start' should be size_t, it's the defaultArg of En,
|
|
// rather than the deduced type from its defualtArg '0'.
|
|
static assert(is(typeof(start) == size_t));
|
|
return start;
|
|
}
|
|
|
|
// from std.numeric.
|
|
alias ElementType2803(R) = typeof(R.init[0].init);
|
|
void normalize2803(R)(R range, ElementType2803!R sum = 1)
|
|
{
|
|
// The type of 'sum' should be determined to ElementType!(double[]) == double
|
|
// before the type deduction from its defaultArg '1'.
|
|
static assert(is(typeof(sum) == double));
|
|
}
|
|
|
|
auto foo14468(T)(T[]...) { return 1; }
|
|
auto foo14468(bool flag, T)(T[]...) { return 2; }
|
|
|
|
void test2803()
|
|
{
|
|
assert(foo2803() == 0);
|
|
assert(foo2803(1) == 1);
|
|
|
|
S2803 s;
|
|
assert(fun2803(1) is &s2803);
|
|
assert(fun2803(1, s) is &s);
|
|
|
|
// regression cases
|
|
|
|
toImpl2803a!string(1, "[");
|
|
|
|
toImpl2803b! string(1);
|
|
toImpl2803b!wstring(1);
|
|
toImpl2803b!dstring(1);
|
|
|
|
toImpl2803c! string(1);
|
|
toImpl2803c!wstring(1); // requires enhancement 13944
|
|
toImpl2803c!dstring(1); // requires enhancement 13944
|
|
|
|
enumerate2803([1]);
|
|
|
|
double[] a = [];
|
|
normalize2803(a);
|
|
|
|
assert(foo14468!int() == 1);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6613
|
|
|
|
alias Tuple6613(T...) = T;
|
|
|
|
void f6613(T...)(int x = 0, T xs = Tuple6613!())
|
|
{
|
|
assert(x == 0);
|
|
static assert(T.length == 0);
|
|
}
|
|
|
|
void test6613()
|
|
{
|
|
f6613();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=4953
|
|
|
|
void bug4953(T = void)(short x) {}
|
|
static assert(is(typeof(bug4953(3))));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5886
|
|
// https://issues.dlang.org/show_bug.cgi?id=5393
|
|
|
|
mixin template Foo5886(T)
|
|
{
|
|
void foo(U : T, this X)() const { static assert(is(X == const K5886)); }
|
|
}
|
|
|
|
struct K5886
|
|
{
|
|
void get1(this T)() const
|
|
{
|
|
pragma(msg, T);
|
|
}
|
|
void get2(int N=4, this T)() const
|
|
{
|
|
pragma(msg, N, " ; ", T);
|
|
}
|
|
|
|
mixin Foo5886!double;
|
|
mixin Foo5886!string;
|
|
|
|
void test() const
|
|
{
|
|
get1; // OK
|
|
get2; // OK
|
|
get2!8; // NG
|
|
|
|
foo!(int);
|
|
foo!(typeof(null));
|
|
}
|
|
}
|
|
|
|
void test5886()
|
|
{
|
|
K5886 km;
|
|
const(K5886) kc;
|
|
immutable(K5886) ki;
|
|
|
|
km.get1; // OK
|
|
kc.get1; // OK
|
|
ki.get1; // OK
|
|
km.get2; // OK
|
|
kc.get2; // OK
|
|
ki.get2; // OK
|
|
km.get2!(1, K5886); // Ugly
|
|
kc.get2!(2, const(K5886)); // Ugly
|
|
ki.get2!(3, immutable(K5886)); // Ugly
|
|
km.get2!8; // Error
|
|
kc.get2!9; // Error
|
|
ki.get2!10; // Error
|
|
}
|
|
|
|
// --------
|
|
|
|
void test5393()
|
|
{
|
|
class A
|
|
{
|
|
void opDispatch (string name, this T) () { }
|
|
}
|
|
|
|
class B : A {}
|
|
|
|
auto b = new B;
|
|
b.foobar();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5896
|
|
|
|
struct X5896
|
|
{
|
|
T opCast(T)(){ return 1; }
|
|
const T opCast(T)(){ return 2; }
|
|
immutable T opCast(T)(){ return 3; }
|
|
shared T opCast(T)(){ return 4; }
|
|
const shared T opCast(T)(){ return 5; }
|
|
}
|
|
void test5896()
|
|
{
|
|
auto xm = X5896 ();
|
|
auto xc = const(X5896) ();
|
|
auto xi = immutable(X5896) ();
|
|
auto xs = shared(X5896) ();
|
|
auto xcs= const(shared(X5896))();
|
|
assert(cast(int)xm == 1);
|
|
assert(cast(int)xc == 2);
|
|
assert(cast(int)xi == 3);
|
|
assert(cast(int)xs == 4);
|
|
assert(cast(int)xcs== 5);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6312
|
|
|
|
void h6312() {}
|
|
|
|
class Bla6312
|
|
{
|
|
mixin wrap6312!h6312;
|
|
}
|
|
|
|
mixin template wrap6312(alias f)
|
|
{
|
|
void blub(alias g = f)()
|
|
{
|
|
g();
|
|
}
|
|
}
|
|
|
|
void test6312()
|
|
{
|
|
Bla6312 b = new Bla6312();
|
|
b.blub();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6825
|
|
|
|
void test6825()
|
|
{
|
|
struct File
|
|
{
|
|
void write(S...)(S args) {}
|
|
}
|
|
|
|
void dump(void delegate(string) d) {}
|
|
|
|
auto o = File();
|
|
dump(&o.write!string);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6789
|
|
|
|
template isStaticArray6789(T)
|
|
{
|
|
static if (is(T U : U[N], size_t N)) // doesn't match
|
|
{
|
|
pragma(msg, "> U = ", U, ", N:", typeof(N), " = ", N);
|
|
enum isStaticArray6789 = true;
|
|
}
|
|
else
|
|
enum isStaticArray6789 = false;
|
|
}
|
|
|
|
void test6789()
|
|
{
|
|
alias int[3] T;
|
|
static assert(isStaticArray6789!T);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2778
|
|
|
|
struct ArrayWrapper2778(T)
|
|
{
|
|
T[] data;
|
|
alias data this;
|
|
}
|
|
|
|
void doStuffFunc2778(int[] data) {}
|
|
|
|
void doStuffTempl2778(T)(T[] data) {}
|
|
|
|
int doStuffTemplOver2778(T)(void* data) { return 1; }
|
|
int doStuffTemplOver2778(T)(ArrayWrapper2778!T w) { return 2; }
|
|
|
|
void test2778()
|
|
{
|
|
ArrayWrapper2778!(int) foo;
|
|
|
|
doStuffFunc2778(foo); // Works.
|
|
|
|
doStuffTempl2778!(int)(foo); // Works.
|
|
|
|
doStuffTempl2778(foo); // Error
|
|
|
|
assert(doStuffTemplOver2778(foo) == 2);
|
|
}
|
|
|
|
// ----
|
|
|
|
void test2778aa()
|
|
{
|
|
void foo(K, V)(V[K] aa){ pragma(msg, "K=", K, ", V=", V); }
|
|
|
|
int[string] aa1;
|
|
foo(aa1); // OK
|
|
|
|
struct SubTypeOf(T)
|
|
{
|
|
T val;
|
|
alias val this;
|
|
}
|
|
SubTypeOf!(string[char]) aa2;
|
|
foo(aa2); // NG
|
|
}
|
|
|
|
// ----
|
|
|
|
void test2778get()
|
|
{
|
|
void foo(ubyte[]){}
|
|
|
|
static struct S
|
|
{
|
|
ubyte[] val = [1,2,3];
|
|
@property ref ubyte[] get() return { return val; }
|
|
alias get this;
|
|
}
|
|
S s;
|
|
foo(s);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6208
|
|
|
|
int getRefNonref(T)(ref T s){ return 1; }
|
|
int getRefNonref(T)( T s){ return 2; }
|
|
|
|
int getAutoRef(T)(auto ref T s){ return __traits(isRef, s) ? 1 : 2; }
|
|
|
|
void getOut(T)(out T s){ {} }
|
|
|
|
void getLazy1(T=int)(lazy void s){ s(), s(); }
|
|
void getLazy2(T)(lazy T s){ s(), s(); }
|
|
|
|
void test6208a()
|
|
{
|
|
int lvalue;
|
|
int rvalue(){ int t; return t; }
|
|
|
|
assert(getRefNonref(lvalue ) == 1);
|
|
assert(getRefNonref(rvalue()) == 2);
|
|
|
|
assert(getAutoRef(lvalue ) == 1);
|
|
assert(getAutoRef(rvalue()) == 2);
|
|
|
|
static assert( __traits(compiles, getOut(lvalue )));
|
|
static assert(!__traits(compiles, getOut(rvalue())));
|
|
|
|
int n1; getLazy1(++n1); assert(n1 == 2);
|
|
int n2; getLazy2(++n2); assert(n2 == 2);
|
|
|
|
struct X
|
|
{
|
|
int f(T)(auto ref T t){ return 1; }
|
|
int f(T)(auto ref T t, ...){ return -1; }
|
|
}
|
|
auto xm = X ();
|
|
auto xc = const(X)();
|
|
int n;
|
|
assert(xm.f!int(n) == 1); // resolved 'auto ref'
|
|
assert(xm.f!int(0) == 1); // ditto
|
|
}
|
|
|
|
void test6208b()
|
|
{
|
|
void foo(T)(const T value) if (!is(T == int)) {}
|
|
|
|
int mn;
|
|
const int cn;
|
|
static assert(!__traits(compiles, foo(mn))); // OK -> OK
|
|
static assert(!__traits(compiles, foo(cn))); // NG -> OK
|
|
}
|
|
|
|
void test6208c()
|
|
{
|
|
struct S
|
|
{
|
|
// Original test case.
|
|
int foo(V)(in V v) { return 1; }
|
|
int foo(Args...)(auto ref const Args args) { return 2; }
|
|
|
|
// Reduced test cases
|
|
|
|
int hoo(V)(const V v) { return 1; } // typeof(10) : const V -> MATCHconst
|
|
int hoo(Args...)(const Args args) { return 2; } // typeof(10) : const Args[0] -> MATCHconst
|
|
// If deduction matching level is same, tuple parameter is less specialized than others.
|
|
|
|
int bar(V)(V v) { return 1; } // typeof(10) : V -> MATCHexact
|
|
int bar(Args...)(const Args args) { return 2; } // typeof(10) : const Args[0] -> MATCHconst
|
|
|
|
int baz(V)(const V v) { return 1; } // typeof(10) : const V -> MATCHconst
|
|
int baz(Args...)(Args args) { return 2; } // typeof(10) : Args[0] -> MATCHexact
|
|
|
|
inout(int) war(V)(inout V v) { return 1; }
|
|
inout(int) war(Args...)(inout Args args){ return 2; }
|
|
|
|
inout(int) waz(Args...)(inout Args args){ return 0; } // wild deduction test
|
|
}
|
|
|
|
S s;
|
|
|
|
int nm = 10;
|
|
assert(s.foo(nm) == 1);
|
|
assert(s.hoo(nm) == 1);
|
|
assert(s.bar(nm) == 1);
|
|
assert(s.baz(nm) == 2);
|
|
assert(s.war(nm) == 1);
|
|
static assert(is(typeof(s.waz(nm)) == int));
|
|
|
|
const int nc = 10;
|
|
assert(s.foo(nc) == 1);
|
|
assert(s.hoo(nc) == 1);
|
|
assert(s.bar(nc) == 1);
|
|
assert(s.baz(nc) == 1);
|
|
assert(s.war(nc) == 1);
|
|
static assert(is(typeof(s.waz(nc)) == const(int)));
|
|
|
|
immutable int ni = 10;
|
|
assert(s.foo(ni) == 1);
|
|
assert(s.hoo(ni) == 1);
|
|
assert(s.bar(ni) == 1);
|
|
assert(s.baz(ni) == 2);
|
|
assert(s.war(ni) == 1);
|
|
static assert(is(typeof(s.waz(ni)) == immutable(int)));
|
|
|
|
static assert(is(typeof(s.waz(nm, nm)) == int));
|
|
static assert(is(typeof(s.waz(nm, nc)) == const(int)));
|
|
static assert(is(typeof(s.waz(nm, ni)) == const(int)));
|
|
static assert(is(typeof(s.waz(nc, nm)) == const(int)));
|
|
static assert(is(typeof(s.waz(nc, nc)) == const(int)));
|
|
static assert(is(typeof(s.waz(nc, ni)) == const(int)));
|
|
static assert(is(typeof(s.waz(ni, nm)) == const(int)));
|
|
static assert(is(typeof(s.waz(ni, nc)) == const(int)));
|
|
static assert(is(typeof(s.waz(ni, ni)) == immutable(int)));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6805
|
|
|
|
struct T6805
|
|
{
|
|
template opDispatch(string name)
|
|
{
|
|
alias int Type;
|
|
}
|
|
}
|
|
static assert(is(T6805.xxx.Type == int));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6738
|
|
|
|
struct Foo6738
|
|
{
|
|
int _val = 10;
|
|
|
|
@property int val()() { return _val; }
|
|
int get() { return val; } // fail
|
|
}
|
|
|
|
void test6738()
|
|
{
|
|
Foo6738 foo;
|
|
auto x = foo.val; // ok
|
|
assert(x == 10);
|
|
assert(foo.get() == 10);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7498
|
|
|
|
template IndexMixin(){
|
|
void insert(T)(T value){ }
|
|
}
|
|
|
|
class MultiIndexContainer{
|
|
mixin IndexMixin!() index0;
|
|
class Index0{
|
|
void baburk(){
|
|
this.outer.index0.insert(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6780
|
|
|
|
@property int foo6780()(){ return 10; }
|
|
|
|
int g6780;
|
|
@property void bar6780()(int n){ g6780 = n; }
|
|
|
|
void test6780()
|
|
{
|
|
auto n = foo6780;
|
|
assert(n == 10);
|
|
|
|
bar6780 = 10;
|
|
assert(g6780 == 10);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6810
|
|
|
|
int f6810(int n)(int) { return 1;}
|
|
int f6810(U...)(U) { assert(0); }
|
|
int f6810(U...)(U a) { assert(0); }
|
|
int f6810(U...)(U) if (true) { assert(0); }
|
|
int f6810(U...)(U a) if (true) { assert(0); }
|
|
|
|
void test6810()
|
|
{
|
|
assert(f6810!0(0) == 1);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6891
|
|
|
|
struct S6891(int N, T)
|
|
{
|
|
void f(U)(S6891!(N, U) u) { }
|
|
}
|
|
|
|
void test6891()
|
|
{
|
|
alias S6891!(1, void) A;
|
|
A().f(A());
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6994
|
|
|
|
struct Foo6994
|
|
{
|
|
T get(T)(){ return T.init; }
|
|
|
|
T func1(T)()
|
|
if (__traits(compiles, get!T()))
|
|
{ return get!T; }
|
|
|
|
T func2(T)()
|
|
if (__traits(compiles, this.get!T())) // add explicit 'this'
|
|
{ return get!T; }
|
|
}
|
|
void test6994()
|
|
{
|
|
Foo6994 foo;
|
|
foo.get!int(); // OK
|
|
foo.func1!int(); // OK
|
|
foo.func2!int(); // NG
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6764
|
|
|
|
enum N6764 = 1; //use const for D1
|
|
|
|
alias size_t[N6764] T6764; //workaround
|
|
void f6764()(T6764 arr...) { }
|
|
|
|
void g6764()(size_t[1] arr...) { }
|
|
|
|
void h6764()(size_t[N6764] arr...) { }
|
|
|
|
void test6764()
|
|
{
|
|
f6764(0); //good
|
|
g6764(0); //good
|
|
h6764!()(0); //good
|
|
h6764(0); //Error: template main.f() does not match any function template declaration
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=3467
|
|
// https://issues.dlang.org/show_bug.cgi?id=6806
|
|
|
|
struct Foo3467( uint n )
|
|
{
|
|
Foo3467!( n ) bar( ) {
|
|
typeof( return ) result;
|
|
return result;
|
|
}
|
|
}
|
|
struct Vec3467(size_t N)
|
|
{
|
|
void opBinary(string op:"~", size_t M)(Vec3467!M) {}
|
|
}
|
|
void test3467()
|
|
{
|
|
Foo3467!( 4 ) baz;
|
|
baz = baz.bar;// FAIL
|
|
|
|
Vec3467!2 a1;
|
|
Vec3467!3 a2;
|
|
a1 ~ a2; // line 7, Error
|
|
}
|
|
|
|
struct TS6806(uint n) { pragma(msg, typeof(n)); }
|
|
static assert(is(TS6806!(1u) == TS6806!(1)));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=4413
|
|
|
|
struct Foo4413
|
|
{
|
|
alias typeof(this) typeof_this;
|
|
void bar1(typeof_this other) {}
|
|
void bar2()(typeof_this other) {}
|
|
void bar3(typeof(this) other) {}
|
|
void bar4()(typeof(this) other) {}
|
|
}
|
|
|
|
void test4413()
|
|
{
|
|
Foo4413 f;
|
|
f.bar1(f); // OK
|
|
f.bar2(f); // OK
|
|
f.bar3(f); // OK
|
|
f.bar4(f); // ERR
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=4675
|
|
|
|
template isNumeric(T)
|
|
{
|
|
enum bool test1 = is(T : long); // should be hidden
|
|
enum bool test2 = is(T : real); // should be hidden
|
|
enum bool isNumeric = test1 || test2;
|
|
}
|
|
void test4675()
|
|
{
|
|
static assert( isNumeric!int);
|
|
static assert(!isNumeric!string);
|
|
static assert(!__traits(compiles, isNumeric!int.test1)); // should be an error
|
|
static assert(!__traits(compiles, isNumeric!int.test2)); // should be an error
|
|
static assert(!__traits(compiles, isNumeric!int.isNumeric));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5525
|
|
|
|
template foo5525(T)
|
|
{
|
|
T foo5525(T t) { return t; }
|
|
T foo5525(T t, T u) { return t + u; }
|
|
}
|
|
|
|
void test5525()
|
|
{
|
|
alias foo5525!int f;
|
|
assert(f(1) == 1);
|
|
assert(f(1, 2) == 3);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5801
|
|
|
|
int a5801;
|
|
void bar5801(T = double)(typeof(a5801) i) {}
|
|
void baz5801(T)(typeof(a5801) i, T t) {}
|
|
void test5801()
|
|
{
|
|
bar5801(2); // Does not compile.
|
|
baz5801(3, "baz"); // Does not compile.
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=5832
|
|
|
|
struct Bar5832(alias v) {}
|
|
|
|
template isBar5832a(T)
|
|
{
|
|
static if (is(T _ : Bar5832!(v), alias v))
|
|
enum isBar5832a = true;
|
|
else
|
|
enum isBar5832a = false;
|
|
}
|
|
template isBar5832b(T)
|
|
{
|
|
static if (is(T _ : Bar5832!(v), alias int v))
|
|
enum isBar5832b = true;
|
|
else
|
|
enum isBar5832b = false;
|
|
}
|
|
template isBar5832c(T)
|
|
{
|
|
static if (is(T _ : Bar5832!(v), alias string v))
|
|
enum isBar5832c = true;
|
|
else
|
|
enum isBar5832c = false;
|
|
}
|
|
static assert( isBar5832a!(Bar5832!1234));
|
|
static assert( isBar5832b!(Bar5832!1234));
|
|
static assert(!isBar5832c!(Bar5832!1234));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=2550
|
|
|
|
template pow10_2550(long n)
|
|
{
|
|
const long pow10_2550 = 0;
|
|
static if (n < 0)
|
|
const long pow10_2550 = 0;
|
|
else
|
|
const long pow10_2550 = 10 * pow10_2550!(n - 1);
|
|
}
|
|
template pow10_2550(long n:0)
|
|
{
|
|
const long pow10_2550 = 1;
|
|
}
|
|
static assert(pow10_2550!(0) == 1);
|
|
|
|
/**********************************/
|
|
// [2.057] Remove top const in IFTI, 9198
|
|
|
|
void foo10a(T )(T) { static assert(is(T == const(int)[])); }
|
|
void foo10b(T...)(T) { static assert(is(T[0] == const(int)[])); }
|
|
|
|
// ref parameter doesn't remove top const
|
|
void boo10a(T )(ref T) { static assert(is(T == const(int[]))); }
|
|
void boo10b(T...)(ref T) { static assert(is(T[0] == const(int[]))); }
|
|
|
|
// auto ref with lvalue doesn't
|
|
void goo10a(T )(auto ref T) { static assert(is(T == const(int[]))); }
|
|
void goo10b(T...)(auto ref T) { static assert(is(T[0] == const(int[]))); }
|
|
|
|
// auto ref with rvalue does
|
|
void hoo10a(T )(auto ref T) { static assert(is(T == const(int)[])); }
|
|
void hoo10b(T...)(auto ref T) { static assert(is(T[0] == const(int)[])); }
|
|
|
|
void bar10a(T )(T) { static assert(is(T == const(int)*)); }
|
|
void bar10b(T...)(T) { static assert(is(T[0] == const(int)*)); }
|
|
|
|
void test10()
|
|
{
|
|
const a = [1,2,3];
|
|
static assert(is(typeof(a) == const(int[])));
|
|
foo10a(a);
|
|
foo10b(a);
|
|
boo10a(a);
|
|
boo10b(a);
|
|
goo10a(a);
|
|
goo10b(a);
|
|
hoo10a(cast(const)[1,2,3]);
|
|
hoo10b(cast(const)[1,2,3]);
|
|
|
|
int n;
|
|
const p = &n;
|
|
static assert(is(typeof(p) == const(int*)));
|
|
bar10a(p);
|
|
bar10b(p);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=3092
|
|
|
|
template Foo3092(A...)
|
|
{
|
|
alias A[0] Foo3092;
|
|
}
|
|
static assert(is(Foo3092!(int, "foo") == int));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7037
|
|
|
|
struct Foo7037 {}
|
|
struct Bar7037 { Foo7037 f; alias f this; }
|
|
void works7037( T )( T value ) if ( is( T : Foo7037 ) ) {}
|
|
void doesnotwork7037( T : Foo7037 )( T value ) {}
|
|
|
|
void test7037()
|
|
{
|
|
Bar7037 b;
|
|
works7037( b );
|
|
doesnotwork7037( b );
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7110
|
|
|
|
struct S7110
|
|
{
|
|
int opSlice(int, int) const { return 0; }
|
|
int opSlice() const { return 0; }
|
|
int opIndex(int, int) const { return 0; }
|
|
int opIndex(int) const { return 0; }
|
|
}
|
|
|
|
enum e7110 = S7110();
|
|
|
|
template T7110(alias a) { } // or T7110(a...)
|
|
|
|
alias T7110!( S7110 ) T71100; // passes
|
|
alias T7110!((S7110)) T71101; // passes
|
|
|
|
alias T7110!( S7110()[0..0] ) A0; // passes
|
|
alias T7110!( (e7110[0..0]) ) A1; // passes
|
|
alias T7110!( e7110[0..0] ) A2; // passes
|
|
|
|
alias T7110!( S7110()[0, 0] ) B0; // passes
|
|
alias T7110!( (e7110[0, 0]) ) B1; // passes
|
|
alias T7110!( e7110[0, 0] ) B2; // passes
|
|
|
|
alias T7110!( S7110()[] ) C0; // passes
|
|
alias T7110!( (e7110[]) ) C1; // passes
|
|
alias T7110!( e7110[] ) C2; // fails: e7110 is used as a type
|
|
|
|
alias T7110!( S7110()[0] ) D0; // passes
|
|
alias T7110!( (e7110[0]) ) D1; // passes
|
|
alias T7110!( e7110[0] ) D2; // fails: e7110 must be an array or pointer type, not S7110
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7124
|
|
|
|
template StaticArrayOf(T : E[dim], E, size_t dim)
|
|
{
|
|
pragma(msg, "T = ", T, ", E = ", E, ", dim = ", dim);
|
|
alias E[dim] StaticArrayOf;
|
|
}
|
|
|
|
template DynamicArrayOf(T : E[], E)
|
|
{
|
|
pragma(msg, "T = ", T, ", E = ", E);
|
|
alias E[] DynamicArrayOf;
|
|
}
|
|
|
|
template AssocArrayOf(T : V[K], K, V)
|
|
{
|
|
pragma(msg, "T = ", T, ", K = ", K, ", V = ", V);
|
|
alias V[K] AssocArrayOf;
|
|
}
|
|
void test7124()
|
|
{
|
|
struct SA { int[5] sa; alias sa this; }
|
|
static assert(is(StaticArrayOf!SA == int[5]));
|
|
|
|
struct DA { int[] da; alias da this; }
|
|
static assert(is(DynamicArrayOf!DA == int[]));
|
|
|
|
struct AA { int[string] aa; alias aa this; }
|
|
static assert(is(AssocArrayOf!AA == int[string]));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7359
|
|
|
|
bool foo7359(T)(T[] a ...)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void test7359()
|
|
{
|
|
assert(foo7359(1,1,1,1,1,1)); // OK
|
|
assert(foo7359("abc","abc","abc","abc")); // NG
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7363
|
|
|
|
template t7363()
|
|
{
|
|
enum e = 0;
|
|
static if (true)
|
|
enum t7363 = 0;
|
|
}
|
|
static assert(!__traits(compiles, t7363!().t7363 == 0)); // Assertion fails
|
|
static assert(t7363!() == 0); // Error: void has no value
|
|
|
|
template u7363()
|
|
{
|
|
static if (true)
|
|
{
|
|
enum e = 0;
|
|
enum u73631 = 0;
|
|
}
|
|
alias u73631 u7363;
|
|
}
|
|
static assert(!__traits(compiles, u7363!().u7363 == 0)); // Assertion fails
|
|
static assert(u7363!() == 0); // Error: void has no value
|
|
|
|
/**********************************/
|
|
|
|
struct S4371(T ...) { }
|
|
|
|
alias S4371!("hi!") t;
|
|
|
|
static if (is(t U == S4371!(U))) { }
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7416
|
|
|
|
void t7416(alias a)() if(is(typeof(a())))
|
|
{}
|
|
|
|
void test7416() {
|
|
void f() {}
|
|
alias t7416!f x;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7563
|
|
|
|
class Test7563
|
|
{
|
|
void test(T, bool a = true)(T t)
|
|
{
|
|
|
|
}
|
|
}
|
|
|
|
void test7563()
|
|
{
|
|
auto test = new Test7563;
|
|
pragma(msg, typeof(test.test!(int, true)).stringof);
|
|
pragma(msg, typeof(test.test!(int)).stringof); // Error: expression (test.test!(int)) has no type
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7572
|
|
|
|
class F7572
|
|
{
|
|
Tr fn7572(Tr, T...)(T t) { return 1; }
|
|
}
|
|
Tr Fn7572(Tr, T...)(T t) { return 2; }
|
|
|
|
void test7572()
|
|
{
|
|
F7572 f = new F7572();
|
|
int delegate() dg = &f.fn7572!int;
|
|
assert(dg() == 1);
|
|
|
|
int function() fn = &Fn7572!int;
|
|
assert(fn() == 2);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7580
|
|
|
|
struct S7580(T)
|
|
{
|
|
void opAssign()(T value) {}
|
|
}
|
|
struct X7580(T)
|
|
{
|
|
private T val;
|
|
@property ref inout(T) get()() inout { return val; } // template
|
|
alias get this;
|
|
}
|
|
struct Y7580(T)
|
|
{
|
|
private T val;
|
|
@property ref auto get()() inout { return val; } // template + auto return
|
|
alias get this;
|
|
}
|
|
|
|
void test7580()
|
|
{
|
|
S7580!(int) s;
|
|
X7580!int x;
|
|
Y7580!int y;
|
|
s = x;
|
|
s = y;
|
|
|
|
shared(X7580!int) sx;
|
|
static assert(!__traits(compiles, s = sx));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7585
|
|
|
|
extern(C) alias void function() Callback;
|
|
|
|
template W7585a(alias dg)
|
|
{
|
|
//pragma(msg, typeof(dg));
|
|
extern(C) void W7585a() { dg(); }
|
|
}
|
|
|
|
void test7585()
|
|
{
|
|
static void f7585a(){}
|
|
Callback cb1 = &W7585a!(f7585a); // OK
|
|
static assert(!__traits(compiles,
|
|
{
|
|
void f7585b(){}
|
|
Callback cb2 = &W7585a!(f7585b); // NG
|
|
}));
|
|
|
|
Callback cb3 = &W7585a!((){}); // NG -> OK
|
|
Callback cb4 = &W7585a!(function(){}); // OK
|
|
static assert(!__traits(compiles,
|
|
{
|
|
Callback cb5 = &W7585a!(delegate(){}); // NG
|
|
}));
|
|
|
|
static int global; // global data
|
|
Callback cb6 = &W7585a!((){return global;}); // NG -> OK
|
|
static assert(!__traits(compiles,
|
|
{
|
|
int n;
|
|
Callback cb7 = &W7585a!((){return n;}); // NG
|
|
}));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7643
|
|
|
|
template T7643(A...){ alias A T7643; }
|
|
|
|
alias T7643!(long, "x", string, "y") Specs7643;
|
|
|
|
alias T7643!( Specs7643[] ) U7643; // Error: tuple A is used as a type
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7671
|
|
|
|
inout(int)[3] id7671n1 ( inout(int)[3] );
|
|
inout( U )[n] id7671x1(U, size_t n)( inout( U )[n] );
|
|
|
|
shared(inout int)[3] id7671n2 ( shared(inout int)[3] );
|
|
shared(inout U )[n] id7671x2(U, size_t n)( shared(inout U )[n] );
|
|
|
|
void test7671()
|
|
{
|
|
static assert(is( typeof( id7671n1( (immutable(int)[3]).init ) ) == immutable(int[3]) ));
|
|
static assert(is( typeof( id7671x1( (immutable(int)[3]).init ) ) == immutable(int[3]) ));
|
|
|
|
static assert(is( typeof( id7671n2( (immutable(int)[3]).init ) ) == immutable(int[3]) ));
|
|
static assert(is( typeof( id7671x2( (immutable(int)[3]).init ) ) == immutable(int[3]) ));
|
|
}
|
|
|
|
/************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7672
|
|
|
|
T foo7672(T)(T a){ return a; }
|
|
|
|
void test7672(inout(int[]) a = null, inout(int*) p = null)
|
|
{
|
|
static assert(is( typeof( a ) == inout(int[]) ));
|
|
static assert(is( typeof(foo7672(a)) == inout(int)[] ));
|
|
|
|
static assert(is( typeof( p ) == inout(int*) ));
|
|
static assert(is( typeof(foo7672(p)) == inout(int)* ));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7684
|
|
|
|
U[] id7684(U)( U[] );
|
|
shared(U[]) id7684(U)( shared(U[]) );
|
|
|
|
void test7684()
|
|
{
|
|
shared(int)[] x;
|
|
static assert(is( typeof(id7684(x)) == shared(int)[] ));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7694
|
|
|
|
void match7694(alias m)()
|
|
{
|
|
m.foo(); //removing this line suppresses ice in both cases
|
|
}
|
|
|
|
struct T7694
|
|
{
|
|
void foo(){}
|
|
void bootstrap()
|
|
{
|
|
//next line causes ice
|
|
match7694!(this)();
|
|
//while this works:
|
|
alias this p;
|
|
match7694!(p)();
|
|
}
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7755
|
|
|
|
template to7755(T)
|
|
{
|
|
T to7755(A...)(A args)
|
|
{
|
|
return toImpl7755!T(args);
|
|
}
|
|
}
|
|
|
|
T toImpl7755(T, S)(S value)
|
|
{
|
|
return T.init;
|
|
}
|
|
|
|
template Foo7755(T){}
|
|
|
|
struct Bar7755
|
|
{
|
|
void qux()
|
|
{
|
|
if (is(typeof(to7755!string(Foo7755!int)))){}
|
|
}
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
U[] id11a(U)( U[] );
|
|
inout(U)[] id11a(U)( inout(U)[] );
|
|
inout(U[]) id11a(U)( inout(U[]) );
|
|
inout(shared(U[])) id11a(U)( inout(shared(U[])) );
|
|
|
|
void test11a(inout int _ = 0)
|
|
{
|
|
shared(const(int))[] x;
|
|
static assert(is( typeof(id11a(x)) == shared(const(int))[] ));
|
|
|
|
shared(int)[] y;
|
|
static assert(is( typeof(id11a(y)) == shared(int)[] ));
|
|
|
|
inout(U)[n] idz(U, size_t n)( inout(U)[n] );
|
|
|
|
inout(shared(bool[1])) z;
|
|
static assert(is( typeof(idz(z)) == inout(shared(bool[1])) ));
|
|
}
|
|
|
|
inout(U[]) id11b(U)( inout(U[]) );
|
|
|
|
void test11b()
|
|
{
|
|
alias const(shared(int)[]) T;
|
|
static assert(is(typeof(id11b(T.init)) == const(shared(int)[])));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7769
|
|
|
|
void f7769(K)(inout(K) value){}
|
|
void test7769()
|
|
{
|
|
f7769("abc");
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7812
|
|
|
|
template A7812(T...) {}
|
|
|
|
template B7812(alias C) if (C) {}
|
|
|
|
template D7812()
|
|
{
|
|
alias B7812!(A7812!(NonExistent!())) D7812;
|
|
}
|
|
|
|
static assert(!__traits(compiles, D7812!()));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7873
|
|
|
|
inout(T)* foo(T)(inout(T)* t)
|
|
{
|
|
static assert(is(T == int*));
|
|
return t;
|
|
}
|
|
|
|
inout(T)* bar(T)(inout(T)* t)
|
|
{
|
|
return foo(t);
|
|
}
|
|
|
|
void test7873()
|
|
{
|
|
int *i;
|
|
bar(&i);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=7933
|
|
|
|
struct Boo7933(size_t dim){int a;}
|
|
struct Baa7933(size_t dim)
|
|
{
|
|
Boo7933!dim a;
|
|
//Boo7933!1 a; //(1) This version causes no errors
|
|
}
|
|
|
|
auto foo7933()(Boo7933!1 b){return b;}
|
|
//auto fuu7933(Boo7933!1 b){return b;} //(2) This line neutralizes the error
|
|
|
|
void test7933()
|
|
{
|
|
Baa7933!1 a; //(3) This line causes the error message
|
|
auto b = foo7933(Boo7933!1(1));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8094
|
|
|
|
struct Tuple8094(T...) {}
|
|
|
|
template getParameters8094(T, alias P)
|
|
{
|
|
static if (is(T t == P!U, U...))
|
|
alias U getParameters8094;
|
|
else
|
|
static assert(false);
|
|
}
|
|
|
|
void test8094()
|
|
{
|
|
alias getParameters8094!(Tuple8094!(int, string), Tuple8094) args;
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
struct Tuple12(T...)
|
|
{
|
|
void foo(alias P)()
|
|
{
|
|
alias Tuple12 X;
|
|
static if (is(typeof(this) t == X!U, U...))
|
|
alias U getParameters;
|
|
else
|
|
static assert(false);
|
|
}
|
|
}
|
|
|
|
void test12()
|
|
{
|
|
Tuple12!(int, string) t;
|
|
t.foo!Tuple12();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14290
|
|
|
|
struct Foo14290(int i) {}
|
|
alias Foo14290a = Foo14290!1;
|
|
static assert(!is(Foo14290!2 == Foo14290a!T, T...));
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8125
|
|
|
|
void foo8125(){}
|
|
|
|
struct X8125(alias a) {}
|
|
|
|
template Y8125a(T : A!f, alias A, alias f) {} //OK
|
|
template Y8125b(T : A!foo8125, alias A) {} //NG
|
|
|
|
void test8125()
|
|
{
|
|
alias Y8125a!(X8125!foo8125) y1;
|
|
alias Y8125b!(X8125!foo8125) y2;
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
struct A13() {}
|
|
struct B13(TT...) {}
|
|
struct C13(T1) {}
|
|
struct D13(T1, TT...) {}
|
|
struct E13(T1, T2) {}
|
|
struct F13(T1, T2, TT...) {}
|
|
|
|
template Test13(alias X)
|
|
{
|
|
static if (is(X x : P!U, alias P, U...))
|
|
enum Test13 = true;
|
|
else
|
|
enum Test13 = false;
|
|
}
|
|
|
|
void test13()
|
|
{
|
|
static assert(Test13!( A13!() ));
|
|
static assert(Test13!( B13!(int) ));
|
|
static assert(Test13!( B13!(int, double) ));
|
|
static assert(Test13!( B13!(int, double, string) ));
|
|
static assert(Test13!( C13!(int) ));
|
|
static assert(Test13!( D13!(int) ));
|
|
static assert(Test13!( D13!(int, double) ));
|
|
static assert(Test13!( D13!(int, double, string) ));
|
|
static assert(Test13!( E13!(int, double) ));
|
|
static assert(Test13!( F13!(int, double) ));
|
|
static assert(Test13!( F13!(int, double, string) ));
|
|
static assert(Test13!( F13!(int, double, string, bool) ));
|
|
}
|
|
|
|
/**********************************/
|
|
|
|
struct A14(T, U, int n = 1)
|
|
{
|
|
}
|
|
|
|
template Test14(alias X)
|
|
{
|
|
static if (is(X x : P!U, alias P, U...))
|
|
alias U Test14;
|
|
else
|
|
static assert(0);
|
|
}
|
|
|
|
void test14()
|
|
{
|
|
alias A14!(int, double) Type;
|
|
alias Test14!Type Params;
|
|
static assert(Params.length == 3);
|
|
static assert(is(Params[0] == int));
|
|
static assert(is(Params[1] == double));
|
|
static assert( Params[2] == 1);
|
|
}
|
|
|
|
/**********************************/
|
|
// test for evaluateConstraint assertion
|
|
|
|
bool canSearchInCodeUnits15(C)(dchar c)
|
|
if (is(C == char))
|
|
{
|
|
return true;
|
|
}
|
|
|
|
void test15()
|
|
{
|
|
int needle = 0;
|
|
auto b = canSearchInCodeUnits15!char(needle);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8129
|
|
|
|
class X8129 {}
|
|
class A8129 {}
|
|
class B8129 : A8129 {}
|
|
|
|
int foo8129(T : A8129)(X8129 x) { return 1; }
|
|
int foo8129(T : A8129)(X8129 x, void function (T) block) { return 2; }
|
|
|
|
int bar8129(T, R)(R range, T value) { return 1; }
|
|
|
|
int baz8129(T, R)(R range, T value) { return 1; }
|
|
int baz8129(T, R)(R range, Undefined value) { return 2; }
|
|
|
|
void test8129()
|
|
{
|
|
auto x = new X8129;
|
|
assert(x.foo8129!B8129() == 1);
|
|
assert(x.foo8129!B8129((a){}) == 2);
|
|
assert(foo8129!B8129(x) == 1);
|
|
assert(foo8129!B8129(x, (a){}) == 2);
|
|
assert(foo8129!B8129(x) == 1);
|
|
assert(foo8129!B8129(x, (B8129 b){}) == 2);
|
|
|
|
ubyte[] buffer = [0, 1, 2];
|
|
assert(bar8129!ushort(buffer, 915) == 1);
|
|
|
|
// While deduction, parameter type 'Undefined' shows semantic error.
|
|
static assert(!__traits(compiles, {
|
|
baz8129!ushort(buffer, 915);
|
|
}));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8238
|
|
|
|
void test8238()
|
|
{
|
|
static struct S { template t(){ int t; } }
|
|
|
|
S s1, s2;
|
|
assert(cast(void*)&s1 != cast(void*)&s2 );
|
|
assert(cast(void*)&s1 != cast(void*)&s1.t!());
|
|
assert(cast(void*)&s2 != cast(void*)&s2.t!());
|
|
assert(cast(void*)&s1.t!() == cast(void*)&s2.t!());
|
|
s1.t!() = 256;
|
|
assert(s2.t!() == 256);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8669
|
|
|
|
struct X8669
|
|
{
|
|
void mfoo(this T)()
|
|
{
|
|
static assert(is(typeof(this) == T));
|
|
}
|
|
void cfoo(this T)() const
|
|
{
|
|
static assert(is(typeof(this) == const(T)));
|
|
}
|
|
void sfoo(this T)() shared
|
|
{
|
|
static assert(is(typeof(this) == shared(T)));
|
|
}
|
|
void scfoo(this T)() shared const
|
|
{
|
|
static assert(is(typeof(this) == shared(const(T))));
|
|
}
|
|
void ifoo(this T)() immutable
|
|
{
|
|
static assert(is(typeof(this) == immutable(T)));
|
|
}
|
|
}
|
|
|
|
void test8669()
|
|
{
|
|
X8669 mx;
|
|
const X8669 cx;
|
|
immutable X8669 ix;
|
|
shared X8669 sx;
|
|
shared const X8669 scx;
|
|
|
|
mx.mfoo();
|
|
cx.mfoo();
|
|
ix.mfoo();
|
|
sx.mfoo();
|
|
scx.mfoo();
|
|
|
|
mx.cfoo();
|
|
cx.cfoo();
|
|
ix.cfoo();
|
|
sx.cfoo();
|
|
scx.cfoo();
|
|
|
|
static assert(!is(typeof( mx.sfoo() )));
|
|
static assert(!is(typeof( cx.sfoo() )));
|
|
ix.sfoo();
|
|
sx.sfoo();
|
|
scx.sfoo();
|
|
|
|
static assert(!is(typeof( mx.scfoo() )));
|
|
static assert(!is(typeof( cx.scfoo() )));
|
|
ix.scfoo();
|
|
sx.scfoo();
|
|
scx.scfoo();
|
|
|
|
static assert(!is(typeof( mx.ifoo() )));
|
|
static assert(!is(typeof( cx.ifoo() )));
|
|
ix.ifoo();
|
|
static assert(!is(typeof( sx.ifoo() )));
|
|
static assert(!is(typeof( scx.ifoo() )));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8833
|
|
|
|
template TypeTuple8833(T...) { alias TypeTuple = T; }
|
|
|
|
void func8833(alias arg)() { }
|
|
|
|
void test8833()
|
|
{
|
|
int x, y;
|
|
|
|
alias TypeTuple8833!(
|
|
func8833!(x),
|
|
func8833!(y),
|
|
) Map;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8976
|
|
|
|
void f8976(ref int) { }
|
|
|
|
void g8976()()
|
|
{
|
|
f8976(0); // line 5
|
|
}
|
|
|
|
|
|
void h8976()()
|
|
{
|
|
g8976!()();
|
|
}
|
|
|
|
static assert( __traits(compiles, h8976!()() ) ); // causes error
|
|
static assert(is(typeof( h8976!()() )));
|
|
|
|
void test8976()
|
|
{
|
|
static assert( __traits(compiles, h8976!()() ) );
|
|
static assert(is(typeof( h8976!()() )));
|
|
}
|
|
|
|
/****************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8940
|
|
|
|
const int n8940; // or `immutable`
|
|
shared static this() { n8940 = 3; }
|
|
|
|
void f8940(T)(ref int val)
|
|
{
|
|
assert(val == 3);
|
|
++val;
|
|
}
|
|
|
|
static assert(!__traits(compiles, f8940!void(n8940))); // fails
|
|
void test8940()
|
|
{
|
|
assert(n8940 == 3);
|
|
static assert(!__traits(compiles, f8940!void(n8940)));
|
|
//assert(n8940 == 3); // may pass as compiler caches comparison result
|
|
//assert(n8940 != 4); // may pass but likely will fail
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=6969
|
|
// https://issues.dlang.org/show_bug.cgi?id=8990
|
|
|
|
class A6969() { alias C6969!() C1; }
|
|
class B6969 { alias A6969!() A1; }
|
|
class C6969() : B6969 {}
|
|
|
|
struct A8990(T) { T t; }
|
|
struct B8990(T) { A8990!T* a; }
|
|
struct C8990 { B8990!C8990* b; }
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9018
|
|
|
|
template Inst9018(alias Template, T)
|
|
{
|
|
alias Template!T Inst;
|
|
}
|
|
|
|
template Template9018(T)
|
|
{
|
|
enum Template9018 = T;
|
|
}
|
|
|
|
static assert(!__traits(compiles, Inst9018!(Template9018, int))); // Assert passes
|
|
static assert(!__traits(compiles, Inst9018!(Template9018, int))); // Assert fails
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9022
|
|
|
|
class C9022
|
|
{
|
|
struct X {}
|
|
|
|
alias B = X;
|
|
}
|
|
class D9022
|
|
{
|
|
struct X {}
|
|
}
|
|
|
|
void test9022()
|
|
{
|
|
auto c = new C9022();
|
|
auto d = new D9022();
|
|
auto cx = C9022.X();
|
|
auto dx = D9022.X();
|
|
|
|
void foo1(T)(T, T.X) { static assert(is(T == C9022)); }
|
|
void foo2(T)(T.X, T) { static assert(is(T == C9022)); }
|
|
foo1(c, cx);
|
|
foo2(cx, c);
|
|
|
|
void hoo1(T)(T, T.B) { static assert(is(T == C9022)); }
|
|
void hoo2(T)(T.B, T) { static assert(is(T == C9022)); }
|
|
hoo1(c, cx);
|
|
hoo1(c, cx);
|
|
|
|
void bar1(alias A)(A.C9022, A.D9022) { static assert(A.stringof == "module breaker"); }
|
|
void bar2(alias A)(A.D9022, A.C9022) { static assert(A.stringof == "module breaker"); }
|
|
bar1(c, d);
|
|
bar2(d, c);
|
|
|
|
void var1(alias A)(A.C9022, A.D9022.X) { static assert(A.stringof == "module breaker"); }
|
|
void var2(alias A)(A.D9022.X, A.C9022) { static assert(A.stringof == "module breaker"); }
|
|
var1(c, dx);
|
|
var2(dx, c);
|
|
|
|
void baz(T)(T.X t, T.X u) { }
|
|
static assert(!__traits(compiles, baz(cx, dx)));
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9026
|
|
|
|
mixin template node9026()
|
|
{
|
|
static if (is(this == struct))
|
|
alias typeof(this)* E;
|
|
else
|
|
alias typeof(this) E;
|
|
E prev, next;
|
|
}
|
|
|
|
struct list9026(alias N)
|
|
{
|
|
N.E head;
|
|
N.E tail;
|
|
}
|
|
|
|
class A9026
|
|
{
|
|
mixin node9026 L1;
|
|
mixin node9026 L2;
|
|
}
|
|
|
|
list9026!(A9026.L1) g9026_l1;
|
|
list9026!(A9026.L2) g9026_l2;
|
|
|
|
void test9026()
|
|
{
|
|
list9026!(A9026.L1) l9026_l1;
|
|
list9026!(A9026.L2) l9026_l2;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9038
|
|
|
|
mixin template Foo9038()
|
|
{
|
|
string data = "default";
|
|
}
|
|
|
|
class Bar9038
|
|
{
|
|
string data;
|
|
mixin Foo9038 f;
|
|
}
|
|
|
|
void check_data9038(alias M, T)(T obj)
|
|
{
|
|
//writeln(M.stringof);
|
|
assert(obj.data == "Bar");
|
|
assert(obj.f.data == "F");
|
|
}
|
|
|
|
void test9038()
|
|
{
|
|
auto bar = new Bar9038;
|
|
bar.data = "Bar";
|
|
bar.f.data = "F";
|
|
|
|
assert(bar.data == "Bar");
|
|
assert(bar.f.data == "F");
|
|
|
|
check_data9038!(Bar9038)(bar);
|
|
check_data9038!(Bar9038.f)(bar);
|
|
check_data9038!(bar.f)(bar);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9050
|
|
|
|
struct A9050(T) {}
|
|
|
|
struct B9050(T)
|
|
{
|
|
void f() { foo9050(A9050!int()); }
|
|
}
|
|
|
|
auto foo9050()(A9050!int base) pure
|
|
{
|
|
return B9050!int();
|
|
}
|
|
|
|
auto s9050 = foo9050(A9050!int());
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10936 (dup of 9050)
|
|
|
|
struct Vec10936(string s)
|
|
{
|
|
auto foo(string v)()
|
|
{
|
|
return Vec10936!(v)();
|
|
}
|
|
|
|
static void bar()
|
|
{
|
|
Vec10936!"" v;
|
|
auto p = v.foo!"sup";
|
|
}
|
|
}
|
|
|
|
Vec10936!"" v;
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9076
|
|
|
|
template forward9076(args...)
|
|
{
|
|
@property forward9076()(){ return args[0]; }
|
|
}
|
|
|
|
void test9076()
|
|
{
|
|
int a = 1;
|
|
int b = 1;
|
|
assert(a == forward9076!b);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9083
|
|
|
|
template isFunction9083(X...) if (X.length == 1)
|
|
{
|
|
enum isFunction9083 = true;
|
|
}
|
|
|
|
struct S9083
|
|
{
|
|
static string func(alias Class)()
|
|
{
|
|
foreach (m; __traits(allMembers, Class))
|
|
{
|
|
pragma(msg, m); // prints "func"
|
|
enum x1 = isFunction9083!(mixin(m)); //NG
|
|
enum x2 = isFunction9083!(func); //OK
|
|
}
|
|
return "";
|
|
}
|
|
}
|
|
enum nothing9083 = S9083.func!S9083();
|
|
|
|
class C9083
|
|
{
|
|
int x; // some class members
|
|
|
|
void func()
|
|
{
|
|
void templateFunc(T)(const T obj)
|
|
{
|
|
enum x1 = isFunction9083!(mixin("x")); // NG
|
|
enum x2 = isFunction9083!(x); // NG
|
|
}
|
|
templateFunc(this);
|
|
}
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9100
|
|
|
|
template Id(alias A) { alias Id = A; }
|
|
template ErrId(alias A) { static assert(0); }
|
|
template TypeTuple9100(TL...) { alias TypeTuple9100 = TL; }
|
|
|
|
class C9100
|
|
{
|
|
int value;
|
|
|
|
int fun() { return value; }
|
|
int tfun(T)() { return value; }
|
|
TypeTuple9100!(int, long) field;
|
|
|
|
void test()
|
|
{
|
|
this.value = 1;
|
|
auto c = new C9100();
|
|
c.value = 2;
|
|
|
|
alias t1a = Id!(c.fun); // OK
|
|
alias t1b = Id!(this.fun); // Prints weird error, bad
|
|
// -> internally given TOKdotvar
|
|
assert(t1a() == this.value);
|
|
assert(t1b() == this.value);
|
|
|
|
alias t2a = Id!(c.tfun); // OK
|
|
static assert(!__traits(compiles, ErrId!(this.tfun)));
|
|
alias t2b = Id!(this.tfun); // No error occurs, why?
|
|
// -> internally given TOKdottd
|
|
assert(t2a!int() == this.value);
|
|
assert(t2b!int() == this.value);
|
|
|
|
alias t3a = Id!(foo9100); // OK
|
|
alias t3b = Id!(mixin("foo9100")); // Prints weird error, bad
|
|
// -> internally given TOKtemplate
|
|
assert(t3a() == 10);
|
|
assert(t3b() == 10);
|
|
|
|
assert(field[0] == 0);
|
|
alias t4a = TypeTuple9100!(field); // NG
|
|
alias t4b = TypeTuple9100!(GetField9100!()); // NG
|
|
t4a[0] = 1; assert(field[0] == 1);
|
|
t4b[0] = 2; assert(field[0] == 2);
|
|
}
|
|
}
|
|
|
|
int foo9100()() { return 10; }
|
|
template GetField9100() { alias GetField9100 = C9100.field[0]; }
|
|
|
|
void test9100()
|
|
{
|
|
(new C9100()).test();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9101
|
|
|
|
class Node9101
|
|
{
|
|
template ForwardCtorNoId()
|
|
{
|
|
this() {} // default constructor
|
|
void foo() { 0 = 1; } // wrong code
|
|
}
|
|
}
|
|
enum x9101 = __traits(compiles, Node9101.ForwardCtorNoId!());
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9124
|
|
|
|
struct Foo9124a(N...)
|
|
{
|
|
enum SIZE = N[0];
|
|
private int _val;
|
|
|
|
public void opAssign (T) (T other)
|
|
if (is(T unused == Foo9124a!(_N), _N...))
|
|
{
|
|
_val = other._val; // compile error
|
|
this._val = other._val; // explicit this make it work
|
|
}
|
|
|
|
public auto opUnary (string op) () if (op == "~") {
|
|
Foo9124a!(SIZE) result = this;
|
|
return result;
|
|
}
|
|
}
|
|
void test9124a()
|
|
{
|
|
Foo9124a!(28) a;
|
|
Foo9124a!(28) b = ~a;
|
|
}
|
|
|
|
// --------
|
|
|
|
template Foo9124b(T, U, string OP)
|
|
{
|
|
enum N = T.SIZE;
|
|
alias Foo9124b = Foo9124b!(false, true, N);
|
|
}
|
|
struct Foo9124b(bool S, bool L, N...)
|
|
{
|
|
enum SIZE = 5;
|
|
long[1] _a = 0;
|
|
void someFunction() const {
|
|
auto data1 = _a; // Does not compile
|
|
auto data2 = this._a; // <--- Compiles
|
|
}
|
|
auto opBinary(string op, T)(T) {
|
|
Foo9124b!(typeof(this), T, op) test;
|
|
}
|
|
}
|
|
void test9124b()
|
|
{
|
|
auto p = Foo9124b!(false, false, 5)();
|
|
auto q = Foo9124b!(false, false, 5)();
|
|
p|q;
|
|
p&q;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9143
|
|
|
|
struct Foo9143a(bool S, bool L)
|
|
{
|
|
auto noCall() {
|
|
Foo9143a!(S, false) x1; // compiles if this line commented
|
|
static if(S) Foo9143a!(true, false) x2;
|
|
else Foo9143a!(false, false) x2;
|
|
}
|
|
this(T)(T other) // constructor
|
|
if (is(T unused == Foo9143a!(P, Q), bool P, bool Q)) { }
|
|
}
|
|
|
|
struct Foo9143b(bool L, size_t N)
|
|
{
|
|
void baaz0() {
|
|
bar!(Foo9143b!(false, N))(); // line 7
|
|
// -> move to before the baaz semantic
|
|
}
|
|
void baaz() {
|
|
bar!(Foo9143b!(false, 2LU))(); // line 3
|
|
bar!(Foo9143b!(true, 2LU))(); // line 4
|
|
bar!(Foo9143b!(L, N))(); // line 5
|
|
bar!(Foo9143b!(true, N))(); // line 6
|
|
bar!(Foo9143b!(false, N))(); // line 7
|
|
}
|
|
void bar(T)()
|
|
if (is(T unused == Foo9143b!(_L, _N), bool _L, size_t _N))
|
|
{}
|
|
}
|
|
|
|
void test9143()
|
|
{
|
|
Foo9143a!(false, true) k = Foo9143a!(false, false)();
|
|
|
|
auto p = Foo9143b!(true, 2LU)();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9266
|
|
|
|
template Foo9266(T...)
|
|
{
|
|
T Foo9266;
|
|
}
|
|
struct Bar9266()
|
|
{
|
|
alias Foo9266!int f;
|
|
}
|
|
void test9266()
|
|
{
|
|
Bar9266!() a, b;
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9361
|
|
|
|
struct Unit9361(A)
|
|
{
|
|
void butPleaseDontUseMe()()
|
|
if (is(unitType9361!((this)))) // !
|
|
{}
|
|
|
|
}
|
|
template isUnit9361(alias T) if ( is(T)) {}
|
|
template isUnit9361(alias T) if (!is(T)) {}
|
|
|
|
template unitType9361(alias T) if (isUnit9361!T) {}
|
|
|
|
void test9361()
|
|
{
|
|
Unit9361!int u;
|
|
static assert(!__traits(compiles, u.butPleaseDontUseMe())); // crashes
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9536
|
|
|
|
struct S9536
|
|
{
|
|
static A foo(A)(A a)
|
|
{
|
|
return a * 2;
|
|
}
|
|
int bar() const
|
|
{
|
|
return foo(42);
|
|
}
|
|
}
|
|
|
|
void test9536()
|
|
{
|
|
S9536 s;
|
|
assert(s.bar() == 84);
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9578
|
|
|
|
template t9578(alias f) { void tf()() { f(); } }
|
|
|
|
void g9578a(alias f)() { f(); } // Error -> OK
|
|
void g9578b(alias ti)() { ti.tf(); } // Error -> OK
|
|
|
|
void test9578()
|
|
{
|
|
int i = 0;
|
|
int m() { return i; }
|
|
|
|
g9578a!(t9578!m.tf)();
|
|
g9578b!(t9578!m)();
|
|
}
|
|
|
|
/**********************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9596
|
|
|
|
int foo9596a(K, V)(inout( V [K])) { return 1; }
|
|
int foo9596a(K, V)(inout(shared(V) [K])) { return 2; }
|
|
|
|
int foo9596b(K, V)(inout( V [K])) { return 1; }
|
|
int foo9596b(K, V)(inout( const(V) [K])) { return 3; }
|
|
|
|
int foo9596c(K, V)(inout(shared(V) [K])) { return 2; }
|
|
int foo9596c(K, V)(inout( const(V) [K])) { return 3; }
|
|
|
|
int foo9596d(K, V)(inout( V [K])) { return 1; }
|
|
int foo9596d(K, V)(inout(shared(V) [K])) { return 2; }
|
|
int foo9596d(K, V)(inout( const(V) [K])) { return 3; }
|
|
|
|
int foo9596e(K, V)(inout(shared(V) [K])) { return 2; }
|
|
int foo9596e(K, V)(inout( V [K])) { return 1; }
|
|
int foo9596e(K, V)(inout( const(V) [K])) { return 3; }
|
|
|
|
void test9596()
|
|
{
|
|
shared(int)[int] aa;
|
|
static assert(!__traits(compiles, foo9596a(aa)));
|
|
|
|
assert(foo9596b(aa) == 1);
|
|
assert(foo9596c(aa) == 2);
|
|
|
|
static assert(!__traits(compiles, foo9596d(aa)));
|
|
static assert(!__traits(compiles, foo9596e(aa)));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9806
|
|
|
|
struct S9806a(alias x)
|
|
{
|
|
alias S9806a!0 N;
|
|
}
|
|
enum expr9806a = 0 * 0;
|
|
alias S9806a!expr9806a T9806a;
|
|
|
|
// --------
|
|
|
|
struct S9806b(alias x)
|
|
{
|
|
template Next()
|
|
{
|
|
enum expr = x + 1;
|
|
alias S9806b!expr Next;
|
|
}
|
|
}
|
|
alias S9806b!1 One9806b;
|
|
alias S9806b!0.Next!() OneAgain9806b;
|
|
|
|
// --------
|
|
|
|
struct S9806c(x...)
|
|
{
|
|
template Next()
|
|
{
|
|
enum expr = x[0] + 1;
|
|
alias S9806c!expr Next;
|
|
}
|
|
}
|
|
alias S9806c!1 One9806c;
|
|
alias S9806c!0.Next!() OneAgain9806c;
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9837
|
|
|
|
void test9837()
|
|
{
|
|
enum DA : int[] { a = [1,2,3] }
|
|
DA da;
|
|
int[] bda = da;
|
|
static assert(is(DA : int[]));
|
|
void fda1(int[] a) {}
|
|
void fda2(T)(T[] a) {}
|
|
fda1(da);
|
|
fda2(da);
|
|
|
|
enum SA : int[3] { a = [1,2,3] }
|
|
SA sa;
|
|
int[3] bsa = sa;
|
|
static assert(is(SA : int[3]));
|
|
void fsa1(int[3] a) {}
|
|
void fsa2(T)(T[3] a) {}
|
|
void fsa3(size_t d)(int[d] a) {}
|
|
void fsa4(T, size_t d)(T[d] a) {}
|
|
fsa1(sa);
|
|
fsa2(sa);
|
|
fsa3(sa);
|
|
fsa4(sa);
|
|
|
|
enum AA : int[int] { a = null }
|
|
AA aa;
|
|
int[int] baa = aa;
|
|
static assert(is(AA : int[int]));
|
|
void faa1(int[int] a) {}
|
|
void faa2(V)(V[int] a) {}
|
|
void faa3(K)(int[K] a) {}
|
|
void faa4(K, V)(V[K] a) {}
|
|
faa1(aa);
|
|
faa2(aa);
|
|
faa3(aa);
|
|
faa4(aa);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9874
|
|
|
|
bool foo9874() { return true; }
|
|
void bar9874(T)(T) if (foo9874()) {} // OK
|
|
void baz9874(T)(T) if (foo9874) {} // error
|
|
|
|
void test9874()
|
|
{
|
|
foo9874; // OK
|
|
bar9874(0);
|
|
baz9874(0);
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
void test9885()
|
|
{
|
|
void foo(int[1][]) {}
|
|
void boo()(int[1][]){}
|
|
struct X(T...) { static void xoo(T){} }
|
|
struct Y(T...) { static void yoo()(T){} }
|
|
struct Z(T...) { static void zoo(U...)(T, U){} }
|
|
|
|
struct V(T...) { static void voo()(T, ...){} }
|
|
struct W(T...) { static void woo()(T...){} }
|
|
|
|
struct R(T...) { static void roo(U...)(int, U, T){} }
|
|
|
|
// OK
|
|
foo([[10]]);
|
|
boo([[10]]);
|
|
|
|
// OK
|
|
X!(int[1][]).xoo([[10]]);
|
|
|
|
// NG!
|
|
Y!().yoo();
|
|
Y!(int).yoo(1);
|
|
Y!(int, int[]).yoo(1, [10]);
|
|
static assert(!__traits(compiles, Y!().yoo(1)));
|
|
static assert(!__traits(compiles, Y!(int).yoo("a")));
|
|
static assert(!__traits(compiles, Y!().yoo!(int)()));
|
|
|
|
// NG!
|
|
Z!().zoo();
|
|
Z!().zoo([1], [1:1]);
|
|
Z!(int, string).zoo(1, "a");
|
|
Z!(int, string).zoo(1, "a", [1], [1:1]);
|
|
Z!().zoo!()();
|
|
static assert(!__traits(compiles, Z!().zoo!()(1))); // (none) <- 1
|
|
static assert(!__traits(compiles, Z!(int).zoo!()())); // int <- (none)
|
|
static assert(!__traits(compiles, Z!(int).zoo!()(""))); // int <- ""
|
|
static assert(!__traits(compiles, Z!().zoo!(int)())); // int <- (none)
|
|
static assert(!__traits(compiles, Z!().zoo!(int)(""))); // int <- ""
|
|
|
|
V!().voo(1,2,3);
|
|
V!(int).voo(1,2,3);
|
|
V!(int, long).voo(1,2,3);
|
|
static assert(!__traits(compiles, V!(int).voo())); // int <- (none)
|
|
static assert(!__traits(compiles, V!(int, long).voo(1))); // long <- (none)
|
|
static assert(!__traits(compiles, V!(int, string).voo(1,2,3))); // string <- 2
|
|
|
|
W!().woo();
|
|
//W!().woo(1, 2, 3); // Access Violation
|
|
{ // this behavior is consistent with:
|
|
//alias TL = TypeTuple!();
|
|
//void foo(TL...) {}
|
|
//foo(1, 2, 3); // Access Violation
|
|
//pragma(msg, typeof(foo)); // void(...) -> D-style variadic function?
|
|
}
|
|
W!(int,int[]).woo(1,2,3);
|
|
W!(int,int[2]).woo(1,2,3);
|
|
static assert(!__traits(compiles, W!(int,int,int).woo(1,2,3))); // int... <- 2
|
|
static assert(!__traits(compiles, W!(int,int).woo(1,2))); // int... <- 2
|
|
static assert(!__traits(compiles, W!(int,int[2]).woo(1,2))); // int[2]... <- 2
|
|
|
|
R!().roo(1, "", []);
|
|
R!(int).roo(1, "", [], 1);
|
|
R!(int, string).roo(1, "", [], 1, "");
|
|
R!(int, string).roo(1, 2, "");
|
|
static assert(!__traits(compiles, R!(int).roo(1, "", []))); // int <- []
|
|
static assert(!__traits(compiles, R!(int, int).roo(1, "", []))); // int <- []
|
|
static assert(!__traits(compiles, R!(int, string).roo(1, 2, 3))); // string <- 3
|
|
|
|
// test case
|
|
struct Tuple(T...) { this()(T values) {} }
|
|
alias T = Tuple!(int[1][]);
|
|
auto t = T([[10]]);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9971
|
|
|
|
void goo9971()()
|
|
{
|
|
auto g = &goo9971;
|
|
}
|
|
|
|
struct S9971
|
|
{
|
|
void goo()()
|
|
{
|
|
auto g = &goo;
|
|
static assert(is(typeof(g) == delegate));
|
|
}
|
|
}
|
|
|
|
void test9971()
|
|
{
|
|
goo9971!()();
|
|
|
|
S9971.init.goo!()();
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9977
|
|
|
|
void test9977()
|
|
{
|
|
struct S1(T) { T value; }
|
|
auto func1(T)(T value) { return value; }
|
|
static assert(is(S1!int == struct));
|
|
assert(func1(10) == 10);
|
|
|
|
template S2(T) { struct S2 { T value; } }
|
|
template func2(T) { auto func2(T value) { return value; } }
|
|
static assert(is(S2!int == struct));
|
|
assert(func2(10) == 10);
|
|
|
|
template X(T) { alias X = T[3]; }
|
|
static assert(is(X!int == int[3]));
|
|
|
|
int a;
|
|
template Y(T) { alias Y = T[typeof(a)]; }
|
|
static assert(is(Y!double == double[int]));
|
|
|
|
int v = 10;
|
|
template Z() { alias Z = v; }
|
|
assert(v == 10);
|
|
Z!() = 20;
|
|
assert(v == 20);
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
enum T8848a(int[] a) = a;
|
|
enum T8848b(int[int] b) = b;
|
|
enum T8848c(void* c) = c;
|
|
|
|
static assert(T8848a!([1,2,3]) == [1,2,3]);
|
|
static assert(T8848b!([1:2,3:4]) == [1:2,3:4]);
|
|
static assert(T8848c!(null) == null);
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9990
|
|
|
|
auto initS9990() { return "hi"; }
|
|
|
|
class C9990(alias init) {}
|
|
|
|
alias SC9990 = C9990!(initS9990);
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10067
|
|
|
|
struct assumeSize10067(alias F) {}
|
|
|
|
template useItemAt10067(size_t idx, T)
|
|
{
|
|
void impl(){ }
|
|
|
|
alias useItemAt10067 = assumeSize10067!(impl);
|
|
}
|
|
|
|
useItemAt10067!(0, char) mapS10067;
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=4072
|
|
|
|
void bug4072(T)(T x)
|
|
if (is(typeof(bug4072(x))))
|
|
{}
|
|
|
|
static assert(!is(typeof(bug4072(7))));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10074
|
|
|
|
template foo10074(F)
|
|
{
|
|
enum foo10074 = false;
|
|
}
|
|
bool foo10074(F)(F f)
|
|
if (foo10074!F)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
static assert(!is(typeof(foo10074(1))));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10083
|
|
|
|
// [a-c] IFTI can find syntactic eponymous member
|
|
template foo10083a(T)
|
|
{
|
|
int foo10083a(double) { return 1; }
|
|
int foo10083a(T) { return 2; }
|
|
}
|
|
template foo10083b(T)
|
|
{
|
|
int foo10083b(T) { return 1; }
|
|
int foo10083b(T, T) { return 2; }
|
|
}
|
|
template foo10083c1(T)
|
|
{
|
|
int foo10083c1(T) { return 1; }
|
|
static if (true) { int x; }
|
|
}
|
|
template foo10083c2(T)
|
|
{
|
|
int foo10083c2(T) { return 1; }
|
|
static if (true) { int x; } else { int y; }
|
|
}
|
|
|
|
// [d-f] IFTI cannot find syntactic eponymous member
|
|
template foo10083d1(T)
|
|
{
|
|
static if (true)
|
|
{
|
|
int foo10083d1(T) { return 1; }
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
template foo10083d2(T)
|
|
{
|
|
static if (true)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
int foo10083d2(T) { return 1; }
|
|
}
|
|
}
|
|
template foo10083e(T)
|
|
{
|
|
static if (true)
|
|
{
|
|
int foo10083e(double arg) { return 1; }
|
|
}
|
|
int foo10083e(T arg) { return 2; }
|
|
}
|
|
template foo10083f(T)
|
|
{
|
|
static if (true)
|
|
{
|
|
int foo10083f(T) { return 1; }
|
|
}
|
|
else
|
|
{
|
|
int foo10083f(T) { return 2; }
|
|
}
|
|
}
|
|
|
|
void test10083()
|
|
{
|
|
assert(foo10083a(1) == 2);
|
|
assert(foo10083a!int(1) == 2);
|
|
assert(foo10083a!int(1.0) == 1);
|
|
static assert(!__traits(compiles, foo10083a!double(1)));
|
|
static assert(!__traits(compiles, foo10083a!double(1.0)));
|
|
static assert(!__traits(compiles, foo10083a!real(1)));
|
|
assert(foo10083a!real(1.0) == 1);
|
|
assert(foo10083a!real(1.0L) == 2);
|
|
|
|
assert(foo10083b(2) == 1);
|
|
assert(foo10083b(3, 4) == 2);
|
|
static assert(!__traits(compiles, foo10083b(2, "")));
|
|
|
|
assert(foo10083c1(1) == 1);
|
|
assert(foo10083c2(1) == 1);
|
|
|
|
static assert(!__traits(compiles, foo10083d1(2)));
|
|
static assert(!__traits(compiles, foo10083d2(2)));
|
|
static assert(!__traits(compiles, foo10083e(3)));
|
|
static assert(!__traits(compiles, foo10083f(3)));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10134
|
|
|
|
template ReturnType10134(alias func)
|
|
{
|
|
static if (is(typeof(func) R == return))
|
|
alias R ReturnType10134;
|
|
else
|
|
static assert(0);
|
|
}
|
|
|
|
struct Result10134(T) {}
|
|
|
|
template getResultType10134(alias func)
|
|
{
|
|
static if(is(ReturnType10134!(func.exec) _ == Result10134!(T), T))
|
|
{
|
|
alias getResultType10134 = T;
|
|
}
|
|
}
|
|
|
|
template f10134(alias func)
|
|
{
|
|
Result10134!(getResultType10134!(func)) exec(int i)
|
|
{
|
|
return typeof(return)();
|
|
}
|
|
}
|
|
|
|
template a10134()
|
|
{
|
|
Result10134!(double) exec(int i)
|
|
{
|
|
return b10134!().exec(i);
|
|
}
|
|
}
|
|
|
|
template b10134()
|
|
{
|
|
Result10134!(double) exec(int i)
|
|
{
|
|
return f10134!(a10134!()).exec(i);
|
|
}
|
|
}
|
|
|
|
pragma(msg, getResultType10134!(a10134!()));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10313
|
|
|
|
void test10313()
|
|
{
|
|
struct Nullable(T)
|
|
{
|
|
this()(inout T value) inout {}
|
|
}
|
|
|
|
struct S { S[] array; }
|
|
S s;
|
|
auto ns = Nullable!S(s);
|
|
|
|
class C { C[] array; }
|
|
C c;
|
|
auto nc = Nullable!C(c);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10498
|
|
|
|
template triggerIssue10498a()
|
|
{
|
|
enum triggerIssue10498a = __traits(compiles, { T10498a; });
|
|
}
|
|
|
|
template PackedGenericTuple10498a(Args...)
|
|
{
|
|
alias Args Tuple;
|
|
enum e = triggerIssue10498a!();
|
|
}
|
|
|
|
struct S10498a { }
|
|
|
|
template T10498a()
|
|
{
|
|
alias PackedGenericTuple10498a!S10498a T10498a;
|
|
}
|
|
|
|
void test10498a()
|
|
{
|
|
alias T10498a!() t;
|
|
static assert(is(t.Tuple[0])); // Fails -> OK
|
|
}
|
|
|
|
// --------
|
|
|
|
template triggerIssue10498b(A...)
|
|
{
|
|
enum triggerIssue10498b = __traits(compiles, { auto a = A[0]; });
|
|
}
|
|
|
|
template PackedGenericTuple10498b(Args...)
|
|
{
|
|
alias Args Tuple;
|
|
enum e = triggerIssue10498b!Args;
|
|
}
|
|
|
|
template T10498b()
|
|
{
|
|
struct S {} // The fact `S` is in `T` causes the problem
|
|
alias PackedGenericTuple10498b!S T10498b;
|
|
}
|
|
|
|
void test10498b()
|
|
{
|
|
alias T10498b!() t;
|
|
static assert(is(t.Tuple[0]));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10537
|
|
|
|
struct Iota10537
|
|
{
|
|
int s,e,i;
|
|
mixin Yield10537!q{ ; };
|
|
}
|
|
|
|
auto skipStrings10537(T)(T source)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
mixin template Yield10537(dstring code)
|
|
{
|
|
alias X = typeof({ enum x = rewriteCode10537(code); }());
|
|
}
|
|
|
|
dstring rewriteCode10537(dstring code)
|
|
{
|
|
skipStrings10537(code); // IFTI causes forward reference
|
|
return "";
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10558
|
|
|
|
template Template10558() {}
|
|
|
|
struct Struct10558(alias T){}
|
|
|
|
alias bar10558 = foo10558!(Template10558!());
|
|
|
|
template foo10558(alias T)
|
|
{
|
|
alias foobar = Struct10558!T;
|
|
|
|
void fun()
|
|
{
|
|
alias a = foo10558!T;
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10592
|
|
|
|
void test10592()
|
|
{
|
|
struct A(E)
|
|
{
|
|
int put()(const(E)[] data)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
int put()(const(dchar)[] data) if (!is(E == dchar))
|
|
{
|
|
return 2;
|
|
}
|
|
|
|
int put(C)(const(C)[] data) if (!is(C == dchar) && !is(E == C))
|
|
{
|
|
return 3;
|
|
}
|
|
}
|
|
|
|
A!char x;
|
|
assert(x.put("abcde"c) == 1); // OK: hit 1
|
|
assert(x.put("abcde"w) == 3); // NG: this should hit 3
|
|
assert(x.put("abcde"d) == 2); // OK: hit 2
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11242
|
|
|
|
inout(T[]) fromString11242(T)(inout(char[]) s, T[] dst)
|
|
{
|
|
return s;
|
|
}
|
|
|
|
void test11242()
|
|
{
|
|
char[] a;
|
|
fromString11242(a, a);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10811
|
|
|
|
void foo10811a(R1, R2)(R1, R2) {}
|
|
template foo10811a(alias pred) { void foo10811a(R1, R2)(R1, R2) {} }
|
|
|
|
template foo10811b(alias pred) { void foo10811b(R1, R2)(R1, R2) {} }
|
|
void foo10811b(R1, R2)(R1, R2) {}
|
|
|
|
void test10811()
|
|
{
|
|
foo10811a(1, 2);
|
|
foo10811a!(a => a)(1, 2);
|
|
|
|
foo10811b(1, 2);
|
|
foo10811b!(a => a)(1, 2);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=10969
|
|
|
|
template A10969(T, U...) { alias A10969 = T; }
|
|
void foo10969(T, U...)(A10969!(T, U) a) {}
|
|
|
|
template B10969(T, U) { alias B10969 = T; }
|
|
void bar10969(T, U...)(B10969!(T, U[0]) a) {}
|
|
|
|
void test10969()
|
|
{
|
|
foo10969!(int, float)(3);
|
|
bar10969!(int, float)(3);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11271
|
|
|
|
struct SmartPtr11271(T)
|
|
{
|
|
~this() {}
|
|
void opAssign(U)(auto ref U rh) {}
|
|
}
|
|
|
|
void test11271()
|
|
{
|
|
SmartPtr11271!Object a;
|
|
a = SmartPtr11271!Object();
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11533
|
|
|
|
version (none)
|
|
{
|
|
struct S11533
|
|
{
|
|
void put(alias fun)() { fun!int(); }
|
|
}
|
|
void test11533a()
|
|
{
|
|
static void foo(T)() {}
|
|
S11533 s;
|
|
s.put!foo();
|
|
}
|
|
|
|
void test11533b()
|
|
{
|
|
static void bar(alias fun)() { fun(); }
|
|
void nested() {}
|
|
bar!nested();
|
|
}
|
|
|
|
void test11533c()
|
|
{
|
|
static struct Foo(alias fun)
|
|
{
|
|
auto call() { return fun(); }
|
|
}
|
|
int var = 1;
|
|
auto getVar() { return var; }
|
|
Foo!getVar foo;
|
|
assert(foo.call() == var);
|
|
var += 1;
|
|
assert(foo.call() == var);
|
|
}
|
|
|
|
void test11533()
|
|
{
|
|
test11533a();
|
|
test11533b();
|
|
test11533c();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
void test11533()
|
|
{
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11553
|
|
|
|
struct Pack11553(T ...)
|
|
{
|
|
alias Unpack = T;
|
|
enum length = T.length;
|
|
}
|
|
|
|
template isPack11553(TList ...)
|
|
{
|
|
static if (TList.length == 1 && is(Pack11553!(TList[0].Unpack) == TList[0]))
|
|
{
|
|
enum isPack11553 = true;
|
|
}
|
|
else
|
|
{
|
|
enum isPack11553 = false;
|
|
}
|
|
}
|
|
|
|
template PartialApply11553(alias T, uint argLoc, Arg ...)
|
|
if (Arg.length == 1)
|
|
{
|
|
template PartialApply11553(L ...)
|
|
{
|
|
alias PartialApply11553 = T!(L[0 .. argLoc], Arg, L[argLoc .. $]);
|
|
}
|
|
}
|
|
|
|
template _hasLength11553(size_t len, T)
|
|
{
|
|
static if (T.length == len)
|
|
{
|
|
enum _hasLength11553 = true;
|
|
}
|
|
else
|
|
{
|
|
enum _hasLength11553 = false;
|
|
}
|
|
}
|
|
|
|
alias _hasLength11553(size_t len) = PartialApply11553!(._hasLength11553, 0, len);
|
|
|
|
|
|
alias hl11553 = _hasLength11553!1;
|
|
|
|
// this segfaults
|
|
static if (!isPack11553!hl11553) { pragma(msg, "All good 1"); }
|
|
|
|
// these are fine
|
|
static if ( hl11553!(Pack11553!(5))) { pragma(msg, "All good 2"); }
|
|
|
|
static if (!hl11553!(Pack11553!( ))) { pragma(msg, "All good 3"); }
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11818
|
|
|
|
enum E11818 { e0, e1 }
|
|
|
|
struct SortedRange11818
|
|
{
|
|
void fun(E11818 e = true ? E11818.e0 : E11818.e1)()
|
|
{
|
|
}
|
|
}
|
|
|
|
void test11818()
|
|
{
|
|
SortedRange11818 s;
|
|
s.fun();
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11843
|
|
|
|
void test11843()
|
|
{
|
|
struct Foo
|
|
{
|
|
int[string] x;
|
|
}
|
|
|
|
struct Bar(alias foo) {}
|
|
|
|
enum bar1 = Bar!(Foo(["a": 1]))();
|
|
enum bar2 = Bar!(Foo(["a": 1]))();
|
|
static assert(is(typeof(bar1) == typeof(bar2)));
|
|
|
|
enum foo1 = Foo(["a": 1]);
|
|
enum foo2 = Foo(["b": -1]);
|
|
static assert(!__traits(isSame, foo1, foo2));
|
|
enum bar3 = Bar!foo1();
|
|
enum bar4 = Bar!foo2();
|
|
static assert(!is(typeof(bar3) == typeof(bar4)));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=11872
|
|
|
|
class Foo11872
|
|
{
|
|
auto test(int v)() {}
|
|
auto test(int v)(string) {}
|
|
|
|
template Bar(T)
|
|
{
|
|
void test(T) {}
|
|
}
|
|
}
|
|
|
|
void test11872()
|
|
{
|
|
auto foo = new Foo11872();
|
|
|
|
with (foo)
|
|
{
|
|
// ScopeExp(ti) -> DotTemplateInstanceExp(wthis, ti)
|
|
foo.test!2(); // works
|
|
test!2(); // works <- fails
|
|
test!2; // works <- fails
|
|
|
|
// ScopeExp(ti) -> DotTemplateInstanceExp(wthis, ti) -> DotExp(wthis, ScopeExp)
|
|
foo.Bar!int.test(1); // works
|
|
Bar!int.test(1); // works <- fails
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12042
|
|
|
|
struct S12042
|
|
{
|
|
int[] t;
|
|
|
|
void m()()
|
|
{
|
|
t = null; // CTFE error -> OK
|
|
}
|
|
}
|
|
|
|
int test12042()
|
|
{
|
|
S12042 s;
|
|
|
|
with (s)
|
|
m!()();
|
|
|
|
return 1;
|
|
}
|
|
|
|
static assert(test12042());
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12077
|
|
|
|
struct S12077(A) {}
|
|
|
|
alias T12077(alias T : Base!Args, alias Base, Args...) = Base;
|
|
static assert(__traits(isSame, T12077!(S12077!int), S12077));
|
|
|
|
alias U12077(alias T : Base!Args, alias Base, Args...) = Base;
|
|
alias U12077( T : Base!Args, alias Base, Args...) = Base;
|
|
static assert(__traits(isSame, U12077!(S12077!int), S12077));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12262
|
|
|
|
template Inst12262(T) { int x; }
|
|
|
|
enum fqnSym12262(alias a) = 1;
|
|
enum fqnSym12262(alias a : B!A, alias B, A...) = 2;
|
|
|
|
static assert(fqnSym12262!(Inst12262!(Object)) == 2);
|
|
static assert(fqnSym12262!(Inst12262!(Object).x) == 1);
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12264
|
|
|
|
struct S12264(A) {}
|
|
|
|
template AX12264(alias A1) { enum AX12264 = 1; }
|
|
template AX12264(alias A2 : B!A, alias B, A...) { enum AX12264 = 2; }
|
|
template AY12264(alias A1) { enum AY12264 = 1; }
|
|
template AY12264(alias A2 : B!int, alias B) { enum AY12264 = 2; }
|
|
template AZ12264(alias A1) { enum AZ12264 = 1; }
|
|
template AZ12264(alias A2 : S12264!T, T) { enum AZ12264 = 2; }
|
|
static assert(AX12264!(S12264!int) == 2);
|
|
static assert(AY12264!(S12264!int) == 2);
|
|
static assert(AZ12264!(S12264!int) == 2);
|
|
|
|
template TX12264(T1) { enum TX12264 = 1; }
|
|
template TX12264(T2 : B!A, alias B, A...) { enum TX12264 = 2; }
|
|
template TY12264(T1) { enum TY12264 = 1; }
|
|
template TY12264(T2 : B!int, alias B) { enum TY12264 = 2; }
|
|
template TZ12264(T1) { enum TZ12264 = 1; }
|
|
template TZ12264(T2 : S12264!T, T) { enum TZ12264 = 2; }
|
|
static assert(TX12264!(S12264!int) == 2);
|
|
static assert(TY12264!(S12264!int) == 2);
|
|
static assert(TZ12264!(S12264!int) == 2);
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12122
|
|
|
|
enum N12122 = 1;
|
|
|
|
void foo12122(T)(T[N12122]) if(is(T == int)) {}
|
|
|
|
void test12122()
|
|
{
|
|
int[N12122] data;
|
|
foo12122(data);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12186
|
|
|
|
template map_front12186(fun...)
|
|
{
|
|
auto map_front12186(Range)(Range r)
|
|
{
|
|
return fun[0](r[0]);
|
|
}
|
|
}
|
|
|
|
void test12186()
|
|
{
|
|
immutable int[][] mat;
|
|
|
|
mat.map_front12186!((in r) => 0); // OK
|
|
mat.map_front12186!((const r) => 0); // OK
|
|
mat.map_front12186!((immutable int[] r) => 0); // OK
|
|
mat.map_front12186!((immutable r) => 0); // OK <- Error
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12207
|
|
|
|
void test12207()
|
|
{
|
|
static struct S
|
|
{
|
|
static void f(T)(T) {}
|
|
}
|
|
|
|
immutable S s;
|
|
|
|
s.f(1);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12263
|
|
|
|
template A12263(alias a) { int x; }
|
|
template B12263(alias a) { int x; }
|
|
|
|
template fqnSym12263(alias T : B12263!A, alias B12263, A...)
|
|
{
|
|
enum fqnSym12263 = true;
|
|
}
|
|
|
|
static assert(fqnSym12263!(A12263!(Object)));
|
|
static assert(fqnSym12263!(B12263!(Object)));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12290
|
|
|
|
void test12290()
|
|
{
|
|
short[] arrS;
|
|
float[] arrF;
|
|
double[] arrD;
|
|
real[] arrR;
|
|
string cstr;
|
|
wstring wstr;
|
|
dstring dstr;
|
|
short[short] aa;
|
|
|
|
auto func1a(E)(E[], E) { return E.init; }
|
|
auto func1b(E)(E, E[]) { return E.init; }
|
|
|
|
static assert(is(typeof(func1a(arrS, 1)) == short));
|
|
static assert(is(typeof(func1b(1, arrS)) == short));
|
|
static assert(is(typeof(func1a(arrF, 1.0)) == float));
|
|
static assert(is(typeof(func1b(1.0, arrF)) == float));
|
|
static assert(is(typeof(func1a(arrD, 1.0L)) == double));
|
|
static assert(is(typeof(func1b(1.0L, arrD)) == double));
|
|
static assert(is(typeof(func1a(arrR, 1)) == real));
|
|
static assert(is(typeof(func1b(1, arrR)) == real));
|
|
static assert(is(typeof(func1a("str" , 'a')) == immutable char));
|
|
static assert(is(typeof(func1b('a', "str" )) == immutable char));
|
|
static assert(is(typeof(func1a("str"c, 'a')) == immutable char));
|
|
static assert(is(typeof(func1b('a', "str"c)) == immutable char));
|
|
static assert(is(typeof(func1a("str"w, 'a')) == immutable wchar));
|
|
static assert(is(typeof(func1b('a', "str"w)) == immutable wchar));
|
|
static assert(is(typeof(func1a("str"d, 'a')) == immutable dchar));
|
|
static assert(is(typeof(func1b('a', "str"d)) == immutable dchar));
|
|
static assert(is(typeof(func1a([1,2,3], 1L)) == long));
|
|
static assert(is(typeof(func1b(1L, [1,2,3])) == long));
|
|
static assert(is(typeof(func1a([1,2,3], 1.5)) == double));
|
|
static assert(is(typeof(func1b(1.5, [1,2,3])) == double));
|
|
static assert(is(typeof(func1a(["a","b"], "s"c)) == string));
|
|
static assert(is(typeof(func1b("s"c, ["a","b"])) == string));
|
|
static assert(is(typeof(func1a(["a","b"], "s"w)) == wstring));
|
|
static assert(is(typeof(func1b("s"w, ["a","b"])) == wstring));
|
|
static assert(is(typeof(func1a(["a","b"], "s"d)) == dstring));
|
|
static assert(is(typeof(func1b("s"d, ["a","b"])) == dstring));
|
|
|
|
auto func2a(K, V)(V[K], K, V) { return V[K].init; }
|
|
auto func2b(K, V)(V, K, V[K]) { return V[K].init; }
|
|
|
|
static assert(is(typeof(func2a(aa, 1, 1)) == short[short]));
|
|
static assert(is(typeof(func2b(1, 1, aa)) == short[short]));
|
|
static assert(is(typeof(func2a([1:10,2:20,3:30], 1L, 10L)) == long[long]));
|
|
static assert(is(typeof(func2b(1L, 10L, [1:20,2:20,3:30])) == long[long]));
|
|
|
|
auto func3a(T)(T, T) { return T.init; }
|
|
auto func3b(T)(T, T) { return T.init; }
|
|
|
|
static assert(is(typeof(func3a(arrS, null)) == short[]));
|
|
static assert(is(typeof(func3b(null, arrS)) == short[]));
|
|
static assert(is(typeof(func3a(arrR, null)) == real[]));
|
|
static assert(is(typeof(func3b(null, arrR)) == real[]));
|
|
static assert(is(typeof(func3a(cstr, "str")) == string));
|
|
static assert(is(typeof(func3b("str", cstr)) == string));
|
|
static assert(is(typeof(func3a(wstr, "str")) == wstring));
|
|
static assert(is(typeof(func3b("str", wstr)) == wstring));
|
|
static assert(is(typeof(func3a(dstr, "str")) == dstring));
|
|
static assert(is(typeof(func3b("str", dstr)) == dstring));
|
|
static assert(is(typeof(func3a("str1" , "str2"c)) == string));
|
|
static assert(is(typeof(func3b("str1"c, "str2" )) == string));
|
|
static assert(is(typeof(func3a("str1" , "str2"w)) == wstring));
|
|
static assert(is(typeof(func3b("str1"w, "str2" )) == wstring));
|
|
static assert(is(typeof(func3a("str1" , "str2"d)) == dstring));
|
|
static assert(is(typeof(func3b("str1"d, "str2" )) == dstring));
|
|
|
|
inout(V) get(K, V)(inout(V[K]) aa, K key, lazy V defaultValue) { return V.init; }
|
|
|
|
short[short] hash12220;
|
|
short res12220 = get(hash12220, 1, 1);
|
|
|
|
short[short] hash12221;
|
|
enum Key12221 : short { a }
|
|
get(hash12221, Key12221.a, Key12221.a);
|
|
|
|
int[][string] mapping13026;
|
|
int[] v = get(mapping13026, "test", []);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12292
|
|
|
|
void test12292()
|
|
{
|
|
void fun(T : string)(T data) {}
|
|
|
|
ubyte[3] sa;
|
|
static assert(!__traits(compiles, fun(sa)));
|
|
static assert(!__traits(compiles, { alias f = fun!(ubyte[3]); }));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12376
|
|
|
|
static auto encode12376(size_t sz)(dchar ch) if (sz > 1)
|
|
{
|
|
undefined;
|
|
}
|
|
|
|
void test12376()
|
|
{
|
|
enum x = __traits(compiles, encode12376!2(x));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12447
|
|
|
|
enum test12447(string str) = str; // [1]
|
|
string test12447(T...)(T args) if (T.length) { return args[0]; } // [2]
|
|
|
|
// With [1]: The template parameter str cannot be be deduced -> no match
|
|
// With [2]: T is deduced to a type tuple (string), then match to the function call.
|
|
static assert(test12447("foo") == "foo");
|
|
|
|
// With [1]: template parameter str is deduced to "bar", then match.
|
|
// With [2]: T is deduced to an expression tuple ("bar"), but it will make invalid the function signature (T args).
|
|
// The failure should be masked silently and prefer the 1st version.
|
|
static assert(test12447!("bar") == "bar");
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12651
|
|
|
|
alias TemplateArgsOf12651(alias T : Base!Args, alias Base, Args...) = Args;
|
|
|
|
struct S12651(T) { }
|
|
|
|
static assert(!__traits(compiles, TemplateArgsOf12651!(S12651!int, S, float)));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12719
|
|
|
|
struct A12719
|
|
{
|
|
B12719!int b();
|
|
}
|
|
|
|
struct B12719(T)
|
|
{
|
|
A12719 a;
|
|
void m()
|
|
{
|
|
auto v = B12719!T.init;
|
|
}
|
|
}
|
|
|
|
// --------
|
|
|
|
enum canDoIt12719(R) = is(typeof(W12719!R));
|
|
|
|
struct W12719(R)
|
|
{
|
|
R r;
|
|
static if (canDoIt12719!R) {}
|
|
}
|
|
|
|
W12719!int a12719;
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12746
|
|
|
|
template foo12746()
|
|
{
|
|
void bar()
|
|
{
|
|
static assert(!__traits(compiles, bar(1)));
|
|
}
|
|
alias foo12746 = bar;
|
|
}
|
|
|
|
void foo12746(int)
|
|
{
|
|
assert(0);
|
|
}
|
|
|
|
void test12746()
|
|
{
|
|
foo12746(); // instantiate
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12748
|
|
|
|
void foo12748(S, C : typeof(S.init[0]))(S s, C c)
|
|
{
|
|
}
|
|
|
|
void test12748()
|
|
{
|
|
foo12748("abc", 'd');
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=9708
|
|
|
|
struct S9708
|
|
{
|
|
void f()(inout(Object)) inout {}
|
|
}
|
|
|
|
void test9708()
|
|
{
|
|
S9708 s;
|
|
s.f(new Object);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=12880
|
|
|
|
void f12880(T)(in T value) { static assert(is(T == string)); }
|
|
void test12880() { f12880(string.init); }
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13087
|
|
|
|
struct Vec13087
|
|
{
|
|
int x;
|
|
void m() { auto n = component13087!(this, 'x'); }
|
|
void c() const { auto n = component13087!(this, 'x'); }
|
|
void w() inout { auto n = component13087!(this, 'x'); }
|
|
void wc() inout const { auto n = component13087!(this, 'x'); }
|
|
void s() shared { auto n = component13087!(this, 'x'); }
|
|
void sc() shared const { auto n = component13087!(this, 'x'); }
|
|
void sw() shared inout { auto n = component13087!(this, 'x'); }
|
|
void swc() shared inout const { auto n = component13087!(this, 'x'); }
|
|
void i() immutable { auto n = component13087!(this, 'x'); }
|
|
}
|
|
|
|
template component13087(alias vec, char c)
|
|
{
|
|
alias component13087 = vec.x;
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13127
|
|
|
|
/+void test13127(inout int = 0)
|
|
{
|
|
int [] ma1;
|
|
const(int)[] ca1;
|
|
const(int[]) ca2;
|
|
inout( int)[] wma1;
|
|
inout( int[]) wma2;
|
|
inout(const int)[] wca1;
|
|
inout(const int[]) wca2;
|
|
immutable(int)[] ia1;
|
|
immutable(int[]) ia2;
|
|
shared( int)[] sma1;
|
|
shared( int[]) sma2;
|
|
shared( const int)[] sca1;
|
|
shared( const int[]) sca2;
|
|
shared(inout int)[] swma1;
|
|
shared(inout int[]) swma2;
|
|
shared(inout const int)[] swca1;
|
|
shared(inout const int[]) swca2;
|
|
|
|
/* In all cases, U should be deduced to top-unqualified type.
|
|
*/
|
|
|
|
/* Parameter is (shared) mutable
|
|
*/
|
|
U f_m(U)( U) { return null; }
|
|
U fsm(U)(shared U) { return null; }
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(f_m( ma1)) == int []));
|
|
static assert(is(typeof(f_m( ca1)) == const(int)[]));
|
|
static assert(is(typeof(f_m( ca2)) == const(int)[]));
|
|
static assert(is(typeof(f_m( wma1)) == inout( int)[]));
|
|
static assert(is(typeof(f_m( wma2)) == inout( int)[]));
|
|
static assert(is(typeof(f_m( wca1)) == inout(const int)[]));
|
|
static assert(is(typeof(f_m( wca2)) == inout(const int)[]));
|
|
static assert(is(typeof(f_m( ia1)) == immutable(int)[]));
|
|
static assert(is(typeof(f_m( ia2)) == immutable(int)[]));
|
|
static assert(is(typeof(f_m( sma1)) == shared( int)[]));
|
|
static assert(is(typeof(f_m( sma2)) == shared( int)[])); // <- shared(int[])
|
|
static assert(is(typeof(f_m( sca1)) == shared( const int)[]));
|
|
static assert(is(typeof(f_m( sca2)) == shared( const int)[])); // <- shared(const(int)[])
|
|
static assert(is(typeof(f_m(swma1)) == shared(inout int)[]));
|
|
static assert(is(typeof(f_m(swma2)) == shared(inout int)[])); // <- shared(inout(int[]))
|
|
static assert(is(typeof(f_m(swca1)) == shared(inout const int)[]));
|
|
static assert(is(typeof(f_m(swca2)) == shared(inout const int)[])); // <- shared(inout(const(int))[])
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(fsm( ma1))) == false);
|
|
static assert(is(typeof(fsm( ca1))) == false);
|
|
static assert(is(typeof(fsm( ca2))) == false);
|
|
static assert(is(typeof(fsm( wma1))) == false);
|
|
static assert(is(typeof(fsm( wma2))) == false);
|
|
static assert(is(typeof(fsm( wca1))) == false);
|
|
static assert(is(typeof(fsm( wca2))) == false);
|
|
static assert(is(typeof(fsm( ia1))) == false);
|
|
static assert(is(typeof(fsm( ia2))) == false);
|
|
static assert(is(typeof(fsm( sma1)) == shared( int)[])); // <- NG
|
|
static assert(is(typeof(fsm( sma2)) == shared( int)[]));
|
|
static assert(is(typeof(fsm( sca1)) == shared( const int)[])); // <- NG
|
|
static assert(is(typeof(fsm( sca2)) == shared( const int)[]));
|
|
static assert(is(typeof(fsm(swma1)) == shared(inout int)[])); // <- NG
|
|
static assert(is(typeof(fsm(swma2)) == shared(inout int)[]));
|
|
static assert(is(typeof(fsm(swca1)) == shared(inout const int)[])); // <- NG
|
|
static assert(is(typeof(fsm(swca2)) == shared(inout const int)[]));
|
|
|
|
/* Parameter is (shared) const
|
|
*/
|
|
U f_c(U)( const U) { return null; }
|
|
U fsc(U)(shared const U) { return null; }
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(f_c( ma1)) == int []));
|
|
static assert(is(typeof(f_c( ca1)) == const(int)[]));
|
|
static assert(is(typeof(f_c( ca2)) == const(int)[]));
|
|
static assert(is(typeof(f_c( wma1)) == inout( int)[]));
|
|
static assert(is(typeof(f_c( wma2)) == inout( int)[]));
|
|
static assert(is(typeof(f_c( wca1)) == inout(const int)[]));
|
|
static assert(is(typeof(f_c( wca2)) == inout(const int)[]));
|
|
static assert(is(typeof(f_c( ia1)) == immutable(int)[]));
|
|
static assert(is(typeof(f_c( ia2)) == immutable(int)[]));
|
|
static assert(is(typeof(f_c( sma1)) == shared( int)[]));
|
|
static assert(is(typeof(f_c( sma2)) == shared( int)[])); // <- shared(int[])
|
|
static assert(is(typeof(f_c( sca1)) == shared( const int)[]));
|
|
static assert(is(typeof(f_c( sca2)) == shared( const int)[])); // <- shared(const(int)[])
|
|
static assert(is(typeof(f_c(swma1)) == shared(inout int)[]));
|
|
static assert(is(typeof(f_c(swma2)) == shared(inout int)[])); // shared(inout(int)[])
|
|
static assert(is(typeof(f_c(swca1)) == shared(inout const int)[]));
|
|
static assert(is(typeof(f_c(swca2)) == shared(inout const int)[])); // shared(inout(const(int))[])
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(fsc( ma1))) == false);
|
|
static assert(is(typeof(fsc( ca1))) == false);
|
|
static assert(is(typeof(fsc( ca2))) == false);
|
|
static assert(is(typeof(fsc( wma1))) == false);
|
|
static assert(is(typeof(fsc( wma2))) == false);
|
|
static assert(is(typeof(fsc( wca1))) == false);
|
|
static assert(is(typeof(fsc( wca2))) == false);
|
|
static assert(is(typeof(fsc( ia1)) == immutable(int)[])); // <- NG
|
|
static assert(is(typeof(fsc( ia2)) == immutable(int)[])); // <- NG
|
|
static assert(is(typeof(fsc( sma1)) == shared( int)[])); // <- NG
|
|
static assert(is(typeof(fsc( sma2)) == shared( int)[]));
|
|
static assert(is(typeof(fsc( sca1)) == shared( const int)[])); // <- NG
|
|
static assert(is(typeof(fsc( sca2)) == shared( const int)[]));
|
|
static assert(is(typeof(fsc(swma1)) == shared(inout int)[])); // <- NG
|
|
static assert(is(typeof(fsc(swma2)) == shared(inout int)[]));
|
|
static assert(is(typeof(fsc(swca1)) == shared(inout const int)[])); // <- NG
|
|
static assert(is(typeof(fsc(swca2)) == shared(inout const int)[]));
|
|
|
|
/* Parameter is immutable
|
|
*/
|
|
U fi(U)(immutable U) { return null; }
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(fi( ma1))) == false);
|
|
static assert(is(typeof(fi( ca1))) == false);
|
|
static assert(is(typeof(fi( ca2))) == false);
|
|
static assert(is(typeof(fi( wma1))) == false);
|
|
static assert(is(typeof(fi( wma2))) == false);
|
|
static assert(is(typeof(fi( wca1))) == false);
|
|
static assert(is(typeof(fi( wca2))) == false);
|
|
static assert(is(typeof(fi( ia1)) == immutable(int)[])); // <- NG
|
|
static assert(is(typeof(fi( ia2)) == immutable(int)[])); // <- NG
|
|
static assert(is(typeof(fi( sma1))) == false);
|
|
static assert(is(typeof(fi( sma2))) == false);
|
|
static assert(is(typeof(fi( sca1))) == false);
|
|
static assert(is(typeof(fi( sca2))) == false);
|
|
static assert(is(typeof(fi(swma1))) == false);
|
|
static assert(is(typeof(fi(swma2))) == false);
|
|
static assert(is(typeof(fi(swca1))) == false);
|
|
static assert(is(typeof(fi(swca2))) == false);
|
|
|
|
/* Parameter is (shared) inout
|
|
*/
|
|
U f_w(U)( inout U) { return null; }
|
|
U fsw(U)(shared inout U) { return null; }
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(f_w( ma1)) == int []));
|
|
static assert(is(typeof(f_w( ca1)) == int [])); // <- const(int)[]
|
|
static assert(is(typeof(f_w( ca2)) == int [])); // <- const(int)[]
|
|
static assert(is(typeof(f_w( wma1)) == int [])); // <- inout(int)[]
|
|
static assert(is(typeof(f_w( wma2)) == int [])); // <- inout(int)[]
|
|
static assert(is(typeof(f_w( wca1)) == const(int)[])); // <- inout(const(int))[]
|
|
static assert(is(typeof(f_w( wca2)) == const(int)[])); // <- inout(const(int))[]
|
|
static assert(is(typeof(f_w( ia1)) == int [])); // <- immutable(int)[]
|
|
static assert(is(typeof(f_w( ia2)) == int [])); // <- immutable(int)[]
|
|
static assert(is(typeof(f_w( sma1)) == shared( int)[]));
|
|
static assert(is(typeof(f_w( sma2)) == shared( int)[])); // <- shared(int[])
|
|
static assert(is(typeof(f_w( sca1)) == shared( int)[])); // <- shared(const(int))[]
|
|
static assert(is(typeof(f_w( sca2)) == shared( int)[])); // <- shared(const(int)[])
|
|
static assert(is(typeof(f_w(swma1)) == shared( int)[])); // <- shared(inout(int))[]
|
|
static assert(is(typeof(f_w(swma2)) == shared( int)[])); // <- shared(inout(int)[])
|
|
static assert(is(typeof(f_w(swca1)) == shared(const int)[])); // <- shared(inout(const(int)))[]
|
|
static assert(is(typeof(f_w(swca2)) == shared(const int)[])); // <- shared(inout(const(int))[])
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(fsw( ma1))) == false);
|
|
static assert(is(typeof(fsw( ca1))) == false);
|
|
static assert(is(typeof(fsw( ca2))) == false);
|
|
static assert(is(typeof(fsw( wma1))) == false);
|
|
static assert(is(typeof(fsw( wma2))) == false);
|
|
static assert(is(typeof(fsw( wca1))) == false);
|
|
static assert(is(typeof(fsw( wca2))) == false);
|
|
static assert(is(typeof(fsw( ia1)) == int [])); // <- NG
|
|
static assert(is(typeof(fsw( ia2)) == int [])); // <- NG
|
|
static assert(is(typeof(fsw( sma1)) == int [])); // <- NG
|
|
static assert(is(typeof(fsw( sma2)) == int []));
|
|
static assert(is(typeof(fsw( sca1)) == int [])); // <- NG
|
|
static assert(is(typeof(fsw( sca2)) == int [])); // const(int)[]
|
|
static assert(is(typeof(fsw(swma1)) == int [])); // <- NG
|
|
static assert(is(typeof(fsw(swma2)) == int [])); // inout(int)[]
|
|
static assert(is(typeof(fsw(swca1)) == const(int)[])); // <- NG
|
|
static assert(is(typeof(fsw(swca2)) == const(int)[])); // <- inout(const(int))[]
|
|
|
|
/* Parameter is (shared) inout const
|
|
*/
|
|
U f_wc(U)( inout const U) { return null; }
|
|
U fswc(U)(shared inout const U) { return null; }
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(f_wc( ma1)) == int []));
|
|
static assert(is(typeof(f_wc( ca1)) == int [])); // <- const(int)[]
|
|
static assert(is(typeof(f_wc( ca2)) == int [])); // <- const(int)[]
|
|
static assert(is(typeof(f_wc( wma1)) == int [])); // <- inout(int)[]
|
|
static assert(is(typeof(f_wc( wma2)) == int [])); // <- inout(int)[]
|
|
static assert(is(typeof(f_wc( wca1)) == int [])); // <- inout(const(int))[]
|
|
static assert(is(typeof(f_wc( wca2)) == int [])); // <- inout(const(int))[]
|
|
static assert(is(typeof(f_wc( ia1)) == int [])); // <- immutable(int)[]
|
|
static assert(is(typeof(f_wc( ia2)) == int [])); // <- immutable(int)[]
|
|
static assert(is(typeof(f_wc( sma1)) == shared(int)[]));
|
|
static assert(is(typeof(f_wc( sma2)) == shared(int)[])); // <- shared(int[])
|
|
static assert(is(typeof(f_wc( sca1)) == shared(int)[])); // <- shared(const(int))[]
|
|
static assert(is(typeof(f_wc( sca2)) == shared(int)[])); // <- shared(const(int)[])
|
|
static assert(is(typeof(f_wc(swma1)) == shared(int)[])); // <- shared(inout(int))[]
|
|
static assert(is(typeof(f_wc(swma2)) == shared(int)[])); // <- shared(inout(int)[])
|
|
static assert(is(typeof(f_wc(swca1)) == shared(int)[])); // <- shared(inout(const(int)))[]
|
|
static assert(is(typeof(f_wc(swca2)) == shared(int)[])); // <- shared(inout(const(int))[])
|
|
// 9 * 2 - 1
|
|
static assert(is(typeof(fswc( ma1))) == false);
|
|
static assert(is(typeof(fswc( ca1))) == false);
|
|
static assert(is(typeof(fswc( ca2))) == false);
|
|
static assert(is(typeof(fswc( wma1))) == false);
|
|
static assert(is(typeof(fswc( wma2))) == false);
|
|
static assert(is(typeof(fswc( wca1))) == false);
|
|
static assert(is(typeof(fswc( wca2))) == false);
|
|
static assert(is(typeof(fswc( ia1)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc( ia2)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc( sma1)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc( sma2)) == int []));
|
|
static assert(is(typeof(fswc( sca1)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc( sca2)) == int [])); // <- const(int)[]
|
|
static assert(is(typeof(fswc(swma1)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc(swma2)) == int [])); // <- inout(int)[]
|
|
static assert(is(typeof(fswc(swca1)) == int [])); // <- NG
|
|
static assert(is(typeof(fswc(swca2)) == int [])); // <- inout(const(int))[]
|
|
}+/
|
|
|
|
void test13127a()
|
|
{
|
|
void foo(T)(in T[] src, T[] dst) { static assert(is(T == int[])); }
|
|
|
|
int[][] a;
|
|
foo(a, a);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13159
|
|
|
|
template maxSize13159(T...)
|
|
{
|
|
static if (T.length == 1)
|
|
{
|
|
enum size_t maxSize13159 = T[0].sizeof;
|
|
}
|
|
else
|
|
{
|
|
enum size_t maxSize13159 =
|
|
T[0].sizeof >= maxSize13159!(T[1 .. $])
|
|
? T[0].sizeof
|
|
: maxSize13159!(T[1 .. $]);
|
|
}
|
|
}
|
|
|
|
struct Node13159
|
|
{
|
|
struct Pair
|
|
{
|
|
Node13159 value;
|
|
}
|
|
|
|
//alias Algebraic!(Node[], int) Value;
|
|
enum n = maxSize13159!(Node13159[], int);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13180
|
|
|
|
void test13180()
|
|
{
|
|
inout(V) get1a(K, V)(inout(V[K]) aa, lazy inout(V) defaultValue)
|
|
{
|
|
static assert(is(V == string));
|
|
static assert(is(K == string));
|
|
return defaultValue;
|
|
}
|
|
inout(V) get1b(K, V)(lazy inout(V) defaultValue, inout(V[K]) aa)
|
|
{
|
|
static assert(is(V == string));
|
|
static assert(is(K == string));
|
|
return defaultValue;
|
|
}
|
|
|
|
inout(V) get2a(K, V)(inout(V)[K] aa, lazy inout(V) defaultValue)
|
|
{
|
|
static assert(is(V == string));
|
|
static assert(is(K == string));
|
|
return defaultValue;
|
|
}
|
|
inout(V) get2b(K, V)(lazy inout(V) defaultValue, inout(V)[K] aa)
|
|
{
|
|
static assert(is(V == string));
|
|
static assert(is(K == string));
|
|
return defaultValue;
|
|
}
|
|
string def;
|
|
string[string] aa;
|
|
string s1a = get1a(aa, def);
|
|
string s1b = get1b(def, aa);
|
|
string s2a = get2a(aa, def);
|
|
string s2b = get2b(def, aa);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13204
|
|
|
|
struct A13204(uint v)
|
|
{
|
|
alias whatever = A13204y;
|
|
static assert(is(whatever == A13204));
|
|
}
|
|
alias A13204x = A13204!1;
|
|
alias A13204y = A13204x;
|
|
|
|
struct B13204(uint v)
|
|
{
|
|
alias whatever = B13204z;
|
|
static assert(is(whatever == B13204));
|
|
}
|
|
alias B13204x = B13204!1;
|
|
alias B13204y = B13204x;
|
|
alias B13204z = B13204y;
|
|
|
|
void test13204()
|
|
{
|
|
static assert(is(A13204x == A13204!1));
|
|
static assert(is(A13204x == A13204!1.whatever));
|
|
static assert(is(A13204x == A13204y));
|
|
|
|
static assert(is(B13204x == B13204!1));
|
|
static assert(is(B13204x == B13204!1.whatever));
|
|
static assert(is(B13204x == B13204y));
|
|
static assert(is(B13204x == B13204z));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=8462 (dup of 13204)
|
|
|
|
alias FP8462 = void function(C8462.Type arg);
|
|
|
|
class C8462
|
|
{
|
|
enum Type { Foo }
|
|
alias funcPtrPtr = FP8462*;
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13218
|
|
|
|
template isCallable13218(T...)
|
|
if (T.length == 1)
|
|
{
|
|
static assert(0);
|
|
}
|
|
|
|
template ParameterTypeTuple13218(func...)
|
|
if (func.length == 1 && isCallable13218!func)
|
|
{
|
|
static assert(0);
|
|
}
|
|
|
|
struct R13218
|
|
{
|
|
private static string mangleFuncPtr(ArgTypes...)()
|
|
{
|
|
string result = "fnp_";
|
|
foreach (T; ArgTypes)
|
|
result ~= T.mangleof;
|
|
return result;
|
|
}
|
|
void function(int) fnp_i;
|
|
double delegate(double) fnp_d;
|
|
|
|
void opAssign(FnT)(FnT func)
|
|
{
|
|
mixin(mangleFuncPtr!( ParameterTypeTuple13218!FnT) ~ " = func;"); // parsed as TypeInstance
|
|
//mixin(mangleFuncPtr!(.ParameterTypeTuple13218!FnT) ~ " = func;"); // parsed as DotTemplateInstanceExp -> works
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13219
|
|
|
|
struct Map13219(V) {}
|
|
|
|
void test13219a(alias F, VA, VB)(Map13219!VA a, Map13219!VB b)
|
|
if (is(VA : typeof(F(VA.init, VB.init))))
|
|
{}
|
|
|
|
void test13219b(alias F)()
|
|
{
|
|
test13219a!((a, b) => b)(Map13219!int.init, Map13219!int.init);
|
|
}
|
|
|
|
void test13219()
|
|
{
|
|
int x;
|
|
test13219b!x();
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13223
|
|
|
|
void test13223()
|
|
{
|
|
T[] f1(T)(T[] a1, T[] a2)
|
|
{
|
|
static assert(is(T == int));
|
|
return a1 ~ a2;
|
|
}
|
|
T[] f2(T)(T[] a1, T[] a2)
|
|
{
|
|
static assert(is(T == int));
|
|
return a1 ~ a2;
|
|
}
|
|
int[] a = [1, 2];
|
|
static assert(is(typeof(f1(a, [])) == int[]));
|
|
static assert(is(typeof(f2([], a)) == int[]));
|
|
static assert(is(typeof(f1(a, null)) == int[]));
|
|
static assert(is(typeof(f2(null, a)) == int[]));
|
|
|
|
T[] f3(T)(T[] a) { return a; }
|
|
static assert(is(typeof(f3([])) == void[]));
|
|
static assert(is(typeof(f3(null)) == void[]));
|
|
|
|
T f4(T)(T a) { return a; }
|
|
static assert(is(typeof(f4([])) == void[]));
|
|
static assert(is(typeof(f4(null)) == typeof(null)));
|
|
|
|
T[][] f5(T)(T[][] a) { return a; }
|
|
static assert(is(typeof(f5([])) == void[][]));
|
|
static assert(is(typeof(f5(null)) == void[][]));
|
|
|
|
void translate(C = immutable char)(const(C)[] toRemove)
|
|
{
|
|
static assert(is(C == char));
|
|
}
|
|
translate(null);
|
|
}
|
|
|
|
void test13223a()
|
|
{
|
|
T f(T)(T, T) { return T.init; }
|
|
|
|
immutable i = 0;
|
|
const c = 0;
|
|
auto m = 0;
|
|
shared s = 0;
|
|
|
|
static assert(is(typeof(f(i, i)) == immutable int));
|
|
static assert(is(typeof(f(i, c)) == const int));
|
|
static assert(is(typeof(f(c, i)) == const int));
|
|
static assert(is(typeof(f(i, m)) == int));
|
|
static assert(is(typeof(f(m, i)) == int));
|
|
static assert(is(typeof(f(c, m)) == int));
|
|
static assert(is(typeof(f(m, c)) == int));
|
|
static assert(is(typeof(f(m, m)) == int));
|
|
static assert(is(typeof(f(i, s)) == shared int));
|
|
static assert(is(typeof(f(s, i)) == shared int));
|
|
static assert(is(typeof(f(c, s)) == shared int));
|
|
static assert(is(typeof(f(s, c)) == shared int));
|
|
static assert(is(typeof(f(s, s)) == shared int));
|
|
static assert(is(typeof(f(s, m)) == int));
|
|
static assert(is(typeof(f(m, s)) == int));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13235
|
|
|
|
struct Tuple13235(T...)
|
|
{
|
|
T expand;
|
|
alias expand field;
|
|
|
|
this(T values)
|
|
{
|
|
field = values;
|
|
}
|
|
}
|
|
struct Foo13235
|
|
{
|
|
Tuple13235!(int, Foo13235)* foo;
|
|
}
|
|
|
|
template Inst13235(T...)
|
|
{
|
|
struct Tuple
|
|
{
|
|
T expand;
|
|
alias expand field;
|
|
|
|
this(T values)
|
|
{
|
|
field = values;
|
|
}
|
|
}
|
|
alias Inst13235 = Tuple*;
|
|
}
|
|
struct Bar13235
|
|
{
|
|
Inst13235!(int, Bar13235) bar;
|
|
}
|
|
|
|
void test13235()
|
|
{
|
|
alias Tup1 = Tuple13235!(int, Foo13235);
|
|
assert(Tup1(1, Foo13235()).expand[0] == 1);
|
|
|
|
alias Tup2 = typeof(*Inst13235!(int, Bar13235).init);
|
|
assert(Tup2(1, Bar13235()).expand[0] == 1);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13252
|
|
|
|
alias TypeTuple13252(T...) = T;
|
|
|
|
static assert(is(typeof(TypeTuple13252!(cast(int )1)[0]) == int ));
|
|
static assert(is(typeof(TypeTuple13252!(cast(long)1)[0]) == long));
|
|
|
|
static assert(is(typeof(TypeTuple13252!(cast(float )3.14)[0]) == float ));
|
|
static assert(is(typeof(TypeTuple13252!(cast(double)3.14)[0]) == double));
|
|
|
|
static assert(is(typeof(TypeTuple13252!(cast(string )null)[0]) == string ));
|
|
static assert(is(typeof(TypeTuple13252!(cast(string[])null)[0]) == string[])); // OK <- NG
|
|
|
|
static assert(is(typeof(TypeTuple13252!(cast(wstring)"abc")[0]) == wstring));
|
|
static assert(is(typeof(TypeTuple13252!(cast(dstring)"abc")[0]) == dstring));
|
|
|
|
static assert(is(typeof(TypeTuple13252!(cast(int[] )[])[0]) == int[] ));
|
|
static assert(is(typeof(TypeTuple13252!(cast(long[])[])[0]) == long[])); // OK <- NG
|
|
|
|
struct S13252 { }
|
|
static assert(is(typeof(TypeTuple13252!(const S13252())[0]) == const(S13252)));
|
|
static assert(is(typeof(TypeTuple13252!(immutable S13252())[0]) == immutable(S13252))); // OK <- NG
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13294
|
|
|
|
void test13294()
|
|
{
|
|
void f(T)(const ref T src, ref T dst)
|
|
{
|
|
pragma(msg, "T = ", T);
|
|
static assert(!is(T == const));
|
|
}
|
|
{
|
|
const byte src;
|
|
byte dst;
|
|
f(src, dst);
|
|
}
|
|
{
|
|
const char src;
|
|
char dst;
|
|
f(src, dst);
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=13351
|
|
T add(T)(in T x, in T y)
|
|
{
|
|
T z;
|
|
z = x + y;
|
|
return z;
|
|
}
|
|
const double a = 1.0;
|
|
const double b = 2.0;
|
|
double c;
|
|
c = add(a,b);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13299
|
|
|
|
struct Foo13299
|
|
{
|
|
Foo13299 opDispatch(string name)(int a, int[] b...)
|
|
if (name == "bar")
|
|
{
|
|
return Foo13299();
|
|
}
|
|
|
|
Foo13299 opDispatch(string name)()
|
|
if (name != "bar")
|
|
{
|
|
return Foo13299();
|
|
}
|
|
}
|
|
|
|
void test13299()
|
|
{
|
|
Foo13299()
|
|
.bar(0)
|
|
.bar(1)
|
|
.bar(2);
|
|
|
|
Foo13299()
|
|
.opDispatch!"bar"(0)
|
|
.opDispatch!"bar"(1)
|
|
.opDispatch!"bar"(2);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13333
|
|
|
|
template AliasThisTypeOf13333(T)
|
|
{
|
|
static assert(0, T.stringof); // T.stringof is important
|
|
}
|
|
|
|
template StaticArrayTypeOf13333(T)
|
|
{
|
|
static if (is(AliasThisTypeOf13333!T AT))
|
|
alias X = StaticArrayTypeOf13333!AT;
|
|
else
|
|
alias X = T;
|
|
|
|
static if (is(X : E[n], E, size_t n))
|
|
alias StaticArrayTypeOf13333 = X;
|
|
else
|
|
static assert(0, T.stringof~" is not a static array type");
|
|
}
|
|
|
|
enum bool isStaticArray13333(T) = is(StaticArrayTypeOf13333!T);
|
|
|
|
struct VaraiantN13333(T)
|
|
{
|
|
static if (isStaticArray13333!T)
|
|
~this() { static assert(0); }
|
|
}
|
|
|
|
struct DummyScope13333
|
|
{
|
|
alias A = VaraiantN13333!C;
|
|
|
|
static class C
|
|
{
|
|
A entity;
|
|
}
|
|
}
|
|
|
|
void test13333()
|
|
{
|
|
struct DummyScope
|
|
{
|
|
alias A = VaraiantN13333!C;
|
|
|
|
static class C
|
|
{
|
|
A entity;
|
|
}
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13374
|
|
|
|
int f13374(alias a)() { return 1; }
|
|
int f13374(string s)() { return 2; }
|
|
|
|
void x13374(int i) {}
|
|
|
|
void test13374()
|
|
{
|
|
assert(f13374!x13374() == 1);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14109
|
|
|
|
string f14109() { return "a"; }
|
|
string g14109()() { return "a"; }
|
|
|
|
struct S14109(string s) { static assert(s == "a"); }
|
|
|
|
alias X14109 = S14109!(f14109);
|
|
alias Y14109 = S14109!(g14109!());
|
|
static assert(is(X14109 == Y14109));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13378
|
|
|
|
struct Vec13378(size_t n, T, string as)
|
|
{
|
|
T[n] data;
|
|
}
|
|
|
|
void doSome13378(size_t n, T, string as)(Vec13378!(n,T,as) v) {}
|
|
|
|
void test13378()
|
|
{
|
|
auto v = Vec13378!(3, float, "xyz")([1,2,3]);
|
|
doSome13378(v);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13379
|
|
|
|
void test13379()
|
|
{
|
|
match13379("");
|
|
}
|
|
|
|
auto match13379(RegEx )(RegEx re)
|
|
if (is(RegEx == Regex13379!char)) // #1 Regex!char (speculative && tinst == NULL)
|
|
{}
|
|
auto match13379(String)(String re)
|
|
{}
|
|
|
|
struct Regex13379(Char)
|
|
{
|
|
ShiftOr13379!Char kickstart; // #2 ShiftOr!char (speculative && tinst == Regex!char)
|
|
}
|
|
struct ShiftOr13379(Char)
|
|
{
|
|
this(ref Regex13379!Char re) // #3 Regex!Char (speculative && tinst == ShiftOr!char)
|
|
{
|
|
uint n_length;
|
|
uint idx;
|
|
n_length = min13379(idx, n_length);
|
|
}
|
|
}
|
|
|
|
template MinType13379(T...)
|
|
{
|
|
alias MinType13379 = T[0];
|
|
}
|
|
MinType13379!T min13379(T...)(T args) // #4 MinType!uint (speculative && thist == ShiftOr!char)
|
|
{
|
|
alias a = args[0];
|
|
alias b = args[$-1];
|
|
return cast(typeof(return)) (a < b ? a : b);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13417
|
|
|
|
struct V13417(size_t N, E, alias string AS)
|
|
{
|
|
}
|
|
|
|
auto f13417(E)(in V13417!(4, E, "ijka"))
|
|
{
|
|
return V13417!(3, E, "xyz")();
|
|
}
|
|
|
|
void test13417()
|
|
{
|
|
f13417(V13417!(4, float, "ijka")());
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13484
|
|
|
|
int foo13484()(void delegate() hi) { return 1; }
|
|
int foo13484(T)(void delegate(T) hi) { return 2; }
|
|
|
|
void test13484()
|
|
{
|
|
assert(foo13484({}) == 1); // works
|
|
assert(foo13484((float v){}) == 2); // works <- throws error
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13675
|
|
|
|
enum E13675;
|
|
|
|
bool foo13675(T : E13675)()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
void test13675()
|
|
{
|
|
if (foo13675!E13675)
|
|
{}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13694
|
|
|
|
auto foo13694(T)(string A, T[] G ...) { return 1; }
|
|
auto foo13694(T)(string A, long E, T[] G ...) { return 2; }
|
|
|
|
void test13694()
|
|
{
|
|
struct S {}
|
|
|
|
S v;
|
|
assert(foo13694("A", v) == 1); // <- OK
|
|
assert(foo13694("A", 0, v) == 2); // <- used to be OK but now fails
|
|
assert(foo13694!S("A", 0, v) == 2); // <- workaround solution
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13760
|
|
|
|
void test13760()
|
|
{
|
|
void func(K, V)(inout(V[K]) aa, inout(V) val) {}
|
|
|
|
class C {}
|
|
C[int] aa;
|
|
func(aa, new C);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13714
|
|
|
|
struct JSONValue13714
|
|
{
|
|
this(T)(T arg)
|
|
{
|
|
}
|
|
this(T : JSONValue13714)(inout T arg) inout
|
|
{
|
|
//store = arg.store;
|
|
}
|
|
|
|
void opAssign(T)(T arg)
|
|
{
|
|
}
|
|
}
|
|
|
|
void test13714()
|
|
{
|
|
enum DummyStringEnum
|
|
{
|
|
foo = "bar"
|
|
}
|
|
|
|
JSONValue13714[string] aa;
|
|
aa["A"] = DummyStringEnum.foo;
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=13807
|
|
|
|
T f13807(T)(inout(T)[] arr)
|
|
{
|
|
return T.init;
|
|
}
|
|
|
|
void test13807()
|
|
{
|
|
static assert(is(typeof(f13807([1, 2, 3])) == int)); // OK
|
|
static assert(is(typeof(f13807(["a", "b"])) == string)); // OK <- Error
|
|
static assert(is(typeof(f13807!string(["a", "b"])) == string)); // OK
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14174
|
|
import imports.testmangle;
|
|
|
|
struct Config14174(a, b) {}
|
|
|
|
struct N14174 {}
|
|
|
|
alias defConfig14174 = Config14174!(N14174, N14174);
|
|
|
|
@safe @nogc pure nothrow
|
|
void accepter14174a(Config : Config14174!(T) = defConfig14174, T...)()
|
|
{
|
|
static assert(equalDemangle(accepter14174a.mangleof,
|
|
"_D7breaker131__T14"~
|
|
"accepter14174a"~
|
|
"HTS7breaker51__T11Config14174TS7breaker6N14174TS7breaker6N14174Z11Config14174TS7breaker6N14174TS7breaker6N14174Z14"~
|
|
"accepter14174a"~
|
|
"FNaNbNiNfZv"));
|
|
}
|
|
|
|
@safe @nogc pure nothrow
|
|
void accepter14174b(Config : Config14174!(T) = defConfig14174, T...)()
|
|
{
|
|
static assert(equalDemangle(accepter14174b.mangleof,
|
|
"_D7breaker131__T14"~
|
|
"accepter14174b"~
|
|
"HTS7breaker51__T11Config14174TS7breaker6N14174TS7breaker6N14174Z11Config14174TS7breaker6N14174TS7breaker6N14174Z14"~
|
|
"accepter14174b"~
|
|
"FNaNbNiNfZv"));
|
|
}
|
|
|
|
void test14174()
|
|
{
|
|
accepter14174a!()();
|
|
|
|
accepter14174b!()();
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14836
|
|
|
|
template a14836x(alias B, C...)
|
|
{
|
|
int a14836x(D...)() if (D.length == 0) { return 1; }
|
|
int a14836x(D...)(D d) if (D.length > 0) { return 2; }
|
|
}
|
|
template a14836y(alias B, C...)
|
|
{
|
|
int a14836y(T, D...)(T t) if (D.length == 0) { return 1; }
|
|
int a14836y(T, D...)(T t, D d) if (D.length > 0) { return 2; }
|
|
}
|
|
|
|
void test14836()
|
|
{
|
|
int v;
|
|
assert(a14836x!(v)() == 1);
|
|
assert(a14836x!(v)(1) == 2);
|
|
assert(a14836y!(v)(1) == 1);
|
|
assert(a14836y!(v)(1, 2) == 2);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14357
|
|
|
|
template Qux14357(T : U*, U : V*, V)
|
|
{
|
|
pragma(msg, T); // no match <- float**
|
|
pragma(msg, U); // no match <- float*
|
|
pragma(msg, V); // no match <- int
|
|
enum Qux14357 = T.sizeof + V.sizeof;
|
|
}
|
|
static assert(!__traits(compiles, Qux14357!(float**, int*)));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14481
|
|
|
|
template someT14481(alias e)
|
|
{
|
|
alias someT14481 = e;
|
|
}
|
|
|
|
mixin template Mix14481(alias e)
|
|
{
|
|
alias SomeAlias = someT14481!e;
|
|
}
|
|
|
|
struct Hoge14481
|
|
{
|
|
mixin Mix14481!e;
|
|
enum e = 10;
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14520
|
|
|
|
template M14520(alias a) { enum M14520 = 1; }
|
|
template M14520(string s) { enum M14520 = 2; }
|
|
|
|
int f14520a();
|
|
string f14520b() { assert(0); }
|
|
string f14520c() { return "a"; }
|
|
|
|
static assert(M14520!f14520a == 1);
|
|
static assert(M14520!f14520b == 1);
|
|
static assert(M14520!f14520c == 1);
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14568
|
|
|
|
struct Interval14568()
|
|
{
|
|
auto left = INVALID;
|
|
|
|
auto opAssign()(Interval14568) { left; }
|
|
}
|
|
|
|
auto interval14568(T)(T point)
|
|
{
|
|
Interval14568!();
|
|
}
|
|
|
|
alias Instantiate14568(alias symbol, Args...) = symbol!Args;
|
|
|
|
template Match14568(patterns...)
|
|
{
|
|
static if (__traits(compiles, Instantiate14568!(patterns[0])))
|
|
{
|
|
alias Match14568 = patterns[0];
|
|
}
|
|
else static if (patterns.length == 1)
|
|
{}
|
|
}
|
|
|
|
template SubOps14568(Args...)
|
|
{
|
|
auto opIndex()
|
|
{
|
|
template IntervalType(T...)
|
|
{
|
|
alias Point() = typeof(T.interval14568);
|
|
|
|
alias IntervalType = Match14568!(Point);
|
|
}
|
|
alias Subspace = IntervalType!(Args);
|
|
}
|
|
}
|
|
|
|
struct Nat14568 { mixin SubOps14568!(null); }
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14603
|
|
// https://issues.dlang.org/show_bug.cgi?id=14604
|
|
|
|
struct S14603
|
|
{
|
|
template opDispatch(string name)
|
|
{
|
|
void opDispatch()() {}
|
|
}
|
|
}
|
|
alias a14603 = S14603.opDispatch!"go"; // OK
|
|
alias b14603 = S14603.go; // OK <- NG
|
|
|
|
struct S14604
|
|
{
|
|
template opDispatch(string name)
|
|
{
|
|
void opDispatch()() {}
|
|
}
|
|
}
|
|
alias Id14604(alias thing) = thing;
|
|
alias c14604 = Id14604!(S14604.opDispatch!"go"); // ok
|
|
// https://issues.dlang.org/show_bug.cgi?id=14604
|
|
alias d14604 = Id14604!(S14604.go); // 'Error: template instance opDispatch!"go" cannot resolve forward reference'
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14735
|
|
|
|
enum CS14735 { yes, no }
|
|
|
|
int indexOf14735a(Range )(Range s, in dchar c) { return 1; }
|
|
int indexOf14735a(T, size_t n)(ref T[n] s, in dchar c) { return 2; }
|
|
|
|
int indexOf14735b(Range )(Range s, in dchar c, in CS14735 cs = CS14735.yes) { return 1; }
|
|
int indexOf14735b(T, size_t n)(ref T[n] s, in dchar c, in CS14735 cs = CS14735.yes) { return 2; }
|
|
|
|
void test14735()
|
|
{
|
|
char[64] buf;
|
|
|
|
// Supported from 2.063: (https://dlang.org/changelog/2.063.html#implicitarraycast)
|
|
assert(indexOf14735a(buf[0..32], '\0') == 2);
|
|
assert(indexOf14735b(buf[0..32], '\0') == 2);
|
|
|
|
// Have to work as same as above.
|
|
assert(indexOf14735a(buf[], '\0') == 2);
|
|
assert(indexOf14735b(buf[], '\0') == 2);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14743
|
|
|
|
class A14743
|
|
{
|
|
auto func1 = (A14743 a) { a.func2!int(); };
|
|
auto func2(T)() {}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14802
|
|
|
|
void test14802()
|
|
{
|
|
auto func(T)(T x, T y) { return x; }
|
|
|
|
struct S1 { double x; alias x this; }
|
|
struct S2 { double x; alias x this; }
|
|
S1 s1;
|
|
S2 s2;
|
|
|
|
enum E1 : double { a = 1.0 }
|
|
enum E2 : double { a = 1.0 }
|
|
|
|
static assert(is(typeof( func(1 , 1 ) ) == int));
|
|
static assert(is(typeof( func(1u, 1u) ) == uint));
|
|
static assert(is(typeof( func(1u, 1 ) ) == uint));
|
|
static assert(is(typeof( func(1 , 1u) ) == uint));
|
|
|
|
static assert(is(typeof( func(1.0f, 1.0f) ) == float));
|
|
static assert(is(typeof( func(1.0 , 1.0 ) ) == double));
|
|
static assert(is(typeof( func(1.0 , 1.0f) ) == double));
|
|
static assert(is(typeof( func(1.0f, 1.0 ) ) == double));
|
|
|
|
static assert(is(typeof( func(s1, s1) ) == S1));
|
|
static assert(is(typeof( func(s2, s2) ) == S2));
|
|
static assert(is(typeof( func(s1, s2) ) == double));
|
|
static assert(is(typeof( func(s2, s1) ) == double));
|
|
|
|
static assert(is(typeof( func(E1.a, E1.a) ) == E1));
|
|
static assert(is(typeof( func(E2.a, E2.a) ) == E2));
|
|
static assert(is(typeof( func(E1.a, 1.0) ) == double));
|
|
static assert(is(typeof( func(E2.a, 1.0) ) == double));
|
|
static assert(is(typeof( func(1.0, E1.a) ) == double));
|
|
static assert(is(typeof( func(1.0, E2.a) ) == double));
|
|
static assert(is(typeof( func(E1.a, E2.a) ) == double));
|
|
static assert(is(typeof( func(E2.a, E1.a) ) == double));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=14886
|
|
|
|
void test14886()
|
|
{
|
|
alias R = int[100_000];
|
|
|
|
auto front(T)(T[] a) {}
|
|
front(R.init);
|
|
|
|
auto bar1(T)(T, T[] a) { return T.init; }
|
|
auto bar2(T)(T[] a, T) { return T.init; }
|
|
|
|
static assert(is(typeof(bar1(1L, R.init)) == long));
|
|
static assert(is(typeof(bar2(R.init, 1L)) == long));
|
|
// <-- T should be deduced to int because R.init is rvalue...?
|
|
|
|
ubyte x;
|
|
static assert(is(typeof(bar1(x, R.init)) == int));
|
|
static assert(is(typeof(bar2(R.init, x)) == int));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15156
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=15156
|
|
auto f15116a(T)(string s, string arg2) { return 1; }
|
|
auto f15116b(T)(int i, string arg2) { return 2; }
|
|
|
|
template bish15116(T)
|
|
{
|
|
alias bish15116 = f15116a!T;
|
|
alias bish15116 = f15116b!T;
|
|
}
|
|
|
|
void test15116()
|
|
{
|
|
alias func = bish15116!string;
|
|
assert(func("", "") == 1);
|
|
assert(func(12, "") == 2);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15152
|
|
|
|
void test15152()
|
|
{
|
|
void func(string M)() { }
|
|
|
|
struct S
|
|
{
|
|
enum name = "a";
|
|
}
|
|
|
|
enum s = S.init;
|
|
func!(s.name);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15352
|
|
|
|
struct S15352(T, T delegate(uint idx) supplier)
|
|
{
|
|
}
|
|
|
|
auto make15352a(T, T delegate(uint idx) supplier)()
|
|
{
|
|
enum local = supplier; // OK
|
|
S15352!(T, local) ret;
|
|
return ret;
|
|
}
|
|
|
|
auto make15352b(T, T delegate(uint idx) supplier)()
|
|
{
|
|
S15352!(T, supplier) ret; // OK <- Error
|
|
return ret;
|
|
}
|
|
|
|
void test15352()
|
|
{
|
|
enum dg = delegate(uint idx) => idx;
|
|
auto s1 = S15352!(uint, dg)();
|
|
auto s2 = make15352a!(uint, dg)();
|
|
auto s3 = make15352b!(uint, dg)();
|
|
assert(is(typeof(s1) == typeof(s2)));
|
|
assert(is(typeof(s1) == typeof(s3)));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15623
|
|
|
|
struct WithFoo15623a { void foo() {} }
|
|
struct WithFoo15623b { void foo() {} }
|
|
struct WithFoo15623c { void foo() {} }
|
|
struct WithFoo15623d { void foo() {} }
|
|
|
|
struct WithoutFoo15623a {}
|
|
struct WithoutFoo15623b {}
|
|
struct WithoutFoo15623c {}
|
|
struct WithoutFoo15623d {}
|
|
|
|
struct CallsFoo15623(T)
|
|
{
|
|
T t;
|
|
void bar() { t.foo(); } // error occurs during TemplateInstance.semantic3
|
|
}
|
|
|
|
// Instantiations outside of function bodies
|
|
static assert( is(CallsFoo15623!WithFoo15623a));
|
|
static assert(!is(CallsFoo15623!WithoutFoo15623a)); // OK <- NG
|
|
static assert( __traits(compiles, CallsFoo15623!WithFoo15623b));
|
|
static assert(!__traits(compiles, CallsFoo15623!WithoutFoo15623b)); // OK <- NG
|
|
|
|
// Instantiations inside function bodies (OK)
|
|
static assert( is(typeof({ alias Baz = CallsFoo15623!WithFoo15623c; return Baz.init; }())));
|
|
static assert(!is(typeof({ alias Baz = CallsFoo15623!WithoutFoo15623c; return Baz.init; }())));
|
|
static assert( __traits(compiles, { alias Baz = CallsFoo15623!WithFoo15623d; return Baz.init; }()));
|
|
static assert(!__traits(compiles, { alias Baz = CallsFoo15623!WithoutFoo15623d; return Baz.init; }()));
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15781
|
|
|
|
void test15781()
|
|
{
|
|
static struct S
|
|
{
|
|
int value;
|
|
}
|
|
|
|
T foo(T)(T a, T b)
|
|
{
|
|
return T();
|
|
}
|
|
|
|
const S cs;
|
|
S ms;
|
|
static assert(is(typeof(foo(ms, ms)) == S));
|
|
static assert(is(typeof(foo(ms, cs)) == const S));
|
|
static assert(is(typeof(foo(cs, ms)) == const S));
|
|
static assert(is(typeof(foo(cs, cs)) == const S));
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=16042
|
|
|
|
struct Foo16042 {}
|
|
|
|
auto map16042(alias func, T)(T t)
|
|
{
|
|
return func(t);
|
|
}
|
|
|
|
auto toChars16042(R)(R r) if (is(R == int[]))
|
|
{
|
|
Foo16042 f;
|
|
assert(toChars16042(f) == 1); // OK
|
|
assert(map16042!(toChars16042)(f) == 1); // OK <- NG
|
|
assert(map16042!((toChars16042))(f) == 1); // OK
|
|
}
|
|
|
|
auto toChars16042(Foo16042 f)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
void test16042()
|
|
{
|
|
[1].toChars16042();
|
|
}
|
|
|
|
// ---
|
|
|
|
auto fn16042(R)(R r) if (is(R == int[])) {}
|
|
auto fn16042(Foo16042 f) { return 1; }
|
|
|
|
struct Namespace16042
|
|
{
|
|
alias fn = fn16042!(int[]);
|
|
}
|
|
|
|
void test16042b()
|
|
{
|
|
Foo16042 f;
|
|
|
|
with (Namespace16042)
|
|
{
|
|
static assert(!__traits(compiles, fn(f))); // NG
|
|
static assert(!__traits(compiles, map16042!(fn)(f))); // should be NG -> actually NG
|
|
static assert(!__traits(compiles, map16042!((fn))(f))); // NG
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15243
|
|
|
|
struct S15243(Types...)
|
|
{
|
|
void apply1(U)(U delegate(Types[0]) f0) {}
|
|
|
|
void apply2(U)(U delegate(Types) f0) {}
|
|
|
|
void apply3(U)(U delegate(Types[1..$]) f0) {}
|
|
}
|
|
|
|
void test15243()
|
|
{
|
|
int f1(int) { return 0; }
|
|
int f2(int, long) { return 0; }
|
|
int f3(long, string) { return 0; }
|
|
|
|
S15243!(int) s1;
|
|
s1.apply1(&f1);
|
|
s1.apply2(&f1);
|
|
|
|
S15243!(int, long) s2;
|
|
s2.apply2(&f2);
|
|
|
|
S15243!(int, long, string) s3;
|
|
s3.apply3(&f3);
|
|
}
|
|
|
|
/******************************************/
|
|
// https://issues.dlang.org/show_bug.cgi?id=15653
|
|
|
|
alias TypeTuple15653(T...) = T;
|
|
|
|
void test15653()
|
|
{
|
|
void foo(U, T)(const T x) { static assert(is(T == U)); }
|
|
void bar(U, T)(immutable T x) { static assert(is(T == U)); }
|
|
|
|
struct X { int a; long[2] b; }
|
|
struct Y { int* a; long[] b; }
|
|
|
|
foreach (U; TypeTuple15653!( byte, short, int, long,
|
|
ubyte, ushort, uint, ulong,
|
|
float, double, real,
|
|
void delegate(),
|
|
int[2], X, X[2]))
|
|
{
|
|
foo!U(U.init); // OK
|
|
bar!U(U.init); // Was error, now OK
|
|
|
|
U u;
|
|
foo!U(u); // OK
|
|
bar!U(u); // Was error, now OK
|
|
}
|
|
|
|
foreach (U; TypeTuple15653!(void*, int**, long[], double*[2]))
|
|
{
|
|
foo!U(U.init); // OK
|
|
bar!U(U.init); // Was error, now OK
|
|
|
|
U u;
|
|
foo!U(u);
|
|
static assert(!__traits(compiles, bar!U(u)), U.stringof);
|
|
}
|
|
|
|
foreach (U; TypeTuple15653!(Object, Y, Y[2], int[int]))
|
|
{
|
|
foo!U(U.init); // OK
|
|
static assert(!__traits(compiles, bar!U(U.init)), U.stringof);
|
|
|
|
U u;
|
|
foo!U(u); // OK
|
|
static assert(!__traits(compiles, bar!U(u)), U.stringof);
|
|
}
|
|
}
|
|
|
|
/******************************************/
|
|
|
|
template foo23733(T, alias T a) {}
|
|
|
|
int n23733;
|
|
alias _ = foo23733!(int, n23733);
|
|
|
|
/******************************************/
|
|
|
|
int main()
|
|
{
|
|
test1();
|
|
test2();
|
|
test3();
|
|
test4();
|
|
test5();
|
|
test6();
|
|
test7();
|
|
test8();
|
|
test9();
|
|
test1780();
|
|
test3608();
|
|
test5893();
|
|
test6404();
|
|
test2246();
|
|
test2296();
|
|
bug4984();
|
|
test2579();
|
|
test2803();
|
|
test6613();
|
|
test5886();
|
|
test5393();
|
|
test5896();
|
|
test6825();
|
|
test6789();
|
|
test2778();
|
|
test2778aa();
|
|
test2778get();
|
|
test6208a();
|
|
test6208b();
|
|
test6208c();
|
|
test6738();
|
|
test6780();
|
|
test6810();
|
|
test6891();
|
|
test6994();
|
|
test6764();
|
|
test3467();
|
|
test4413();
|
|
test5525();
|
|
test5801();
|
|
test10();
|
|
test7037();
|
|
test7124();
|
|
test7359();
|
|
test7416();
|
|
test7563();
|
|
test7572();
|
|
test7580();
|
|
test7585();
|
|
test7671();
|
|
test7672();
|
|
test7684();
|
|
test11a();
|
|
test11b();
|
|
test7769();
|
|
test7873();
|
|
test7933();
|
|
test8094();
|
|
test12();
|
|
test8125();
|
|
test13();
|
|
test14();
|
|
test8129();
|
|
test8238();
|
|
test8669();
|
|
test8833();
|
|
test8976();
|
|
test8940();
|
|
test9022();
|
|
test9026();
|
|
test9038();
|
|
test9076();
|
|
test9100();
|
|
test9124a();
|
|
test9124b();
|
|
test9143();
|
|
test9266();
|
|
test9536();
|
|
test9578();
|
|
test9596();
|
|
test9837();
|
|
test9874();
|
|
test9885();
|
|
test9971();
|
|
test9977();
|
|
test10083();
|
|
test10592();
|
|
test11242();
|
|
test10811();
|
|
test10969();
|
|
test11271();
|
|
test11533();
|
|
test11818();
|
|
test11843();
|
|
test11872();
|
|
test12122();
|
|
test12207();
|
|
test12376();
|
|
test13235();
|
|
test13294();
|
|
test13299();
|
|
test13374();
|
|
test13378();
|
|
test13379();
|
|
test13484();
|
|
test13694();
|
|
test14836();
|
|
test14735();
|
|
test14802();
|
|
test15116();
|
|
test16042();
|
|
test16042b();
|
|
test15243();
|
|
test15653();
|
|
|
|
printf("Success\n");
|
|
return 0;
|
|
}
|