mirror of
https://github.com/dlang/dmd.git
synced 2025-04-27 05:30:13 +03:00
629 lines
10 KiB
D
629 lines
10 KiB
D
// REQUIRED_ARGS: -ignore
|
|
module foo.bar;
|
|
|
|
import core.vararg;
|
|
|
|
// Only compilable, declare inline
|
|
void writeln(T...)(T) {}
|
|
|
|
pragma(lib, "test");
|
|
pragma(msg, "Hello World");
|
|
pragma(linkerDirective, "/DEFAULTLIB:test2");
|
|
|
|
static assert(true, "message");
|
|
|
|
alias double mydbl;
|
|
|
|
alias fl1 = function ()
|
|
in {}
|
|
in (true)
|
|
out (; true)
|
|
out (r; true)
|
|
out
|
|
{
|
|
}
|
|
out (r)
|
|
{
|
|
}
|
|
do
|
|
{
|
|
return 2;
|
|
};
|
|
|
|
alias fl2 = function ()
|
|
in (true)
|
|
out(; true)
|
|
out(r; true)
|
|
{
|
|
return 2;
|
|
};
|
|
|
|
int testmain()
|
|
in
|
|
{
|
|
assert(1+(2+3) == -(1 - 2*3));
|
|
}
|
|
out (result)
|
|
{
|
|
assert(result == 0);
|
|
}
|
|
do
|
|
{
|
|
float f = float.infinity;
|
|
int i = cast(int) f;
|
|
writeln(i,1,2);
|
|
writeln(cast(int)float.max);
|
|
assert(i == cast(int)float.max);
|
|
assert(i == 0x80000000);
|
|
return 0;
|
|
}
|
|
|
|
struct S { int m, n; }
|
|
|
|
template Foo(T, int V)
|
|
{
|
|
void foo(...)
|
|
{
|
|
static if (is(Object _ : X!TL, alias X, TL...)) {} // https://issues.dlang.org/show_bug.cgi?id=10044
|
|
|
|
auto x = __traits(hasMember, Object, "noMember");
|
|
auto y = is(Object : X!TL, alias X, TL...);
|
|
assert(!x && !y, "message");
|
|
|
|
S s = { 1,2 };
|
|
auto a = [1, 2, 3];
|
|
auto aa = [1:1, 2:2, 3:3];
|
|
|
|
int n,m;
|
|
}
|
|
|
|
int bar(double d, int x)
|
|
{
|
|
if (d)
|
|
{ d++;
|
|
}
|
|
else
|
|
d--;
|
|
|
|
asm
|
|
{ naked ;
|
|
mov EAX, 3;
|
|
}
|
|
|
|
for (;;)
|
|
{
|
|
d = d + 1;
|
|
}
|
|
|
|
for (int i = 0; i < 10; i++)
|
|
{
|
|
d = i ? d + 1 : 5;
|
|
}
|
|
|
|
char[] s;
|
|
foreach (char c; s)
|
|
{
|
|
d *= 2;
|
|
if (d)
|
|
break;
|
|
else
|
|
continue;
|
|
}
|
|
|
|
switch (V)
|
|
{
|
|
case 1:
|
|
case 2: break;
|
|
case 3: goto case 1;
|
|
case 4: goto default;
|
|
default:
|
|
d /= 8;
|
|
break;
|
|
}
|
|
|
|
enum Label { A, B, C }
|
|
void fswitch(Label l)
|
|
{
|
|
final switch (l)
|
|
{
|
|
case A: break;
|
|
case B: break;
|
|
case C: break;
|
|
}
|
|
}
|
|
|
|
loop:
|
|
while (x)
|
|
{
|
|
x--;
|
|
if (x)
|
|
break loop;
|
|
else
|
|
continue loop;
|
|
}
|
|
|
|
do
|
|
{
|
|
x++;
|
|
} while (x < 10);
|
|
|
|
try
|
|
{
|
|
bar(1, 2);
|
|
}
|
|
catch (Object o)
|
|
{
|
|
x++;
|
|
}
|
|
finally
|
|
{
|
|
x--;
|
|
}
|
|
|
|
try
|
|
bar(1, 2);
|
|
catch(Object o)
|
|
x++;
|
|
finally
|
|
x--;
|
|
|
|
Object o;
|
|
synchronized (o)
|
|
{
|
|
x = ~x;
|
|
}
|
|
|
|
synchronized
|
|
{
|
|
x = x < 3;
|
|
}
|
|
|
|
with (o)
|
|
{
|
|
toString();
|
|
}
|
|
}
|
|
}
|
|
|
|
static this()
|
|
{
|
|
}
|
|
|
|
static ~this()
|
|
{
|
|
}
|
|
|
|
pure nothrow @safe @nogc static this() {}
|
|
pure nothrow @safe @nogc static ~this() {}
|
|
static this() pure nothrow @safe @nogc {}
|
|
static ~this() pure nothrow @safe @nogc {}
|
|
|
|
pure nothrow @safe @nogc shared static this() {}
|
|
pure nothrow @safe @nogc shared static ~this() {}
|
|
shared static this() pure nothrow @safe @nogc {}
|
|
shared static ~this() pure nothrow @safe @nogc {}
|
|
|
|
interface iFoo{}
|
|
class xFoo: iFoo{}
|
|
|
|
interface iFoo2{}
|
|
class xFoo2: iFoo, iFoo2{}
|
|
|
|
class Foo3
|
|
{
|
|
this(int a, ...){}
|
|
this(int* a){}
|
|
}
|
|
|
|
alias int myint;
|
|
|
|
static notquit = 1;
|
|
|
|
class Test
|
|
{
|
|
void a() {}
|
|
void b() {}
|
|
void c() {}
|
|
void d() {}
|
|
void e() {}
|
|
void f() {}
|
|
void g() {}
|
|
void h() {}
|
|
void i() {}
|
|
void j() {}
|
|
void k() {}
|
|
void l() {}
|
|
void m() {}
|
|
void n() {}
|
|
void o() {}
|
|
void p() {}
|
|
void q() {}
|
|
void r() {}
|
|
void s() {}
|
|
void t() {}
|
|
void u() {}
|
|
void v() {}
|
|
void w() {}
|
|
void x() {}
|
|
void y() {}
|
|
void z() {}
|
|
|
|
void aa() {}
|
|
void bb() {}
|
|
void cc() {}
|
|
void dd() {}
|
|
void ee() {} // Try adding or removing some functions here to see the effect.
|
|
|
|
template A(T) { }
|
|
|
|
alias A!(uint) getHUint;
|
|
alias A!(int) getHInt;
|
|
alias A!(float) getHFloat;
|
|
alias A!(ulong) getHUlong;
|
|
alias A!(long) getHLong;
|
|
alias A!(double) getHDouble;
|
|
alias A!(byte) getHByte;
|
|
alias A!(ubyte) getHUbyte;
|
|
alias A!(short) getHShort;
|
|
alias A!(ushort) getHUShort;
|
|
alias A!(real) getHReal;
|
|
|
|
alias void F();
|
|
|
|
pure nothrow @safe @nogc unittest {}
|
|
pure nothrow @safe @nogc invariant {}
|
|
pure nothrow @safe @nogc invariant (true);
|
|
}
|
|
|
|
template templ( T )
|
|
{
|
|
void templ( T val )
|
|
{
|
|
pragma( msg, "Invalid destination type." );
|
|
}
|
|
}
|
|
|
|
static char[] charArray = [ '\"', '\'' ];
|
|
|
|
class Point
|
|
{
|
|
auto x = 10;
|
|
uint y = 20;
|
|
}
|
|
|
|
template Foo2(bool bar)
|
|
{
|
|
void test()
|
|
{
|
|
static if(bar)
|
|
{
|
|
int i;
|
|
}
|
|
else
|
|
{
|
|
}
|
|
static if(!bar)
|
|
{
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
template Foo4()
|
|
{
|
|
void bar()
|
|
{
|
|
}
|
|
}
|
|
|
|
template Foo4x( T... ) {}
|
|
|
|
class Baz4
|
|
{
|
|
mixin Foo4 foo;
|
|
mixin Foo4x!(int, "str") foox;
|
|
|
|
alias foo.bar baz;
|
|
}
|
|
|
|
int test(T)(T t)
|
|
{
|
|
if (auto o = cast(Object)t) return 1;
|
|
return 0;
|
|
}
|
|
|
|
enum x6 = 1;
|
|
|
|
bool foo6(int a, int b, int c, int d)
|
|
{
|
|
return (a < b) != (c < d);
|
|
}
|
|
|
|
auto foo7(int x)
|
|
{
|
|
return 5;
|
|
}
|
|
|
|
class D8{}
|
|
void func8()
|
|
{
|
|
scope a= new D8();
|
|
}
|
|
|
|
T func9(T)() if (true)
|
|
{
|
|
T i;
|
|
scope(exit) i= 1;
|
|
scope(success) i = 2;
|
|
scope(failure) i = 3;
|
|
return i;
|
|
}
|
|
|
|
template V10(T)
|
|
{
|
|
void func()
|
|
{
|
|
for(int i,j=4; i<3;i++)
|
|
{
|
|
}
|
|
}
|
|
}
|
|
|
|
int foo11(int function() fn)
|
|
{
|
|
return fn();
|
|
}
|
|
|
|
int bar11(T)()
|
|
{
|
|
return foo11(function int (){ return 0; });
|
|
}
|
|
|
|
|
|
struct S6360
|
|
{
|
|
@property long weeks1() const pure nothrow { return 0; }
|
|
|
|
@property const pure nothrow long weeks2() { return 0; }
|
|
}
|
|
|
|
|
|
struct S12
|
|
{
|
|
/// postfix storage class and constructor
|
|
this(int n) nothrow{}
|
|
|
|
/// prefix storage class (==StorageClassDeclaration) and constructor
|
|
nothrow this(string s){}
|
|
}
|
|
|
|
/// dummy
|
|
struct T12
|
|
{
|
|
/// postfix storage class and template constructor
|
|
this()(int args) immutable { }
|
|
|
|
/// prefix storage class (==StorageClassDeclaration) and template constructor
|
|
immutable this(A...)(A args){ }
|
|
}
|
|
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=6591
|
|
import core.stdc.stdio : printf, F = FILE;
|
|
|
|
void foo6591()()
|
|
{
|
|
import core.stdc.stdio : printf, F = FILE;
|
|
}
|
|
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=8081
|
|
version(unittest) {
|
|
pure nothrow unittest {}
|
|
pure nothrow unittest {}
|
|
|
|
public unittest {}
|
|
extern(C) unittest {}
|
|
align unittest {}
|
|
}
|
|
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=10334
|
|
|
|
template Foo10334(T) if (Bar10334!()) {} ///
|
|
template Foo10334(T) if (Bar10334!100) {} ///
|
|
template Foo10334(T) if (Bar10334!3.14) {} ///
|
|
template Foo10334(T) if (Bar10334!"str") {} ///
|
|
template Foo10334(T) if (Bar10334!1.4i) {} ///
|
|
template Foo10334(T) if (Bar10334!null) {} ///
|
|
template Foo10334(T) if (Bar10334!true) {} ///
|
|
template Foo10334(T) if (Bar10334!false) {} ///
|
|
template Foo10334(T) if (Bar10334!'A') {} ///
|
|
template Foo10334(T) if (Bar10334!int) {} ///
|
|
template Foo10334(T) if (Bar10334!string) {} ///
|
|
template Foo10334(T) if (Bar10334!wstring) {} ///
|
|
template Foo10334(T) if (Bar10334!dstring) {} ///
|
|
template Foo10334(T) if (Bar10334!this) {} ///
|
|
template Foo10334(T) if (Bar10334!([1,2,3])) {} ///
|
|
template Foo10334(T) if (Bar10334!(Baz10334!())) {} ///
|
|
template Foo10334(T) if (Bar10334!(Baz10334!T)) {} ///
|
|
template Foo10334(T) if (Bar10334!(Baz10334!100)) {} ///
|
|
template Foo10334(T) if (Bar10334!(.foo)) {} ///
|
|
template Foo10334(T) if (Bar10334!(const int)) {} ///
|
|
template Foo10334(T) if (Bar10334!(shared T)) {} ///
|
|
|
|
template Test10334(T...) {} ///
|
|
mixin Test10334!int a; ///
|
|
mixin Test10334!(int,long) b; ///
|
|
mixin Test10334!"str" c; ///
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=12266
|
|
auto clamp12266a(T1, T2, T3)(T1 x, T2 min_val, T3 max_val)
|
|
{
|
|
return 0;
|
|
}
|
|
pure clamp12266b(T1, T2, T3)(T1 x, T2 min_val, T3 max_val)
|
|
{
|
|
return 0;
|
|
}
|
|
@disable pure clamp12266c(T1, T2, T3)(T1 x, T2 min_val, T3 max_val)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=13832
|
|
alias Dg13832 = ref int delegate();
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=16590
|
|
class TestClass {
|
|
int aa;
|
|
int b1, b2;
|
|
this(int b1, int b2)
|
|
{
|
|
this.b1 = b1;
|
|
this.b2 = b2;
|
|
}
|
|
|
|
ref foo() {
|
|
return aa;
|
|
}
|
|
|
|
ref retFunc() return {
|
|
return aa;
|
|
}
|
|
|
|
~this() @trusted @disable @nogc {
|
|
}
|
|
}
|
|
|
|
class FooA {
|
|
protected void method42() {
|
|
|
|
}
|
|
|
|
~this() @safe {
|
|
}
|
|
|
|
}
|
|
|
|
|
|
class Bar : FooA {
|
|
override void method42() {
|
|
|
|
}
|
|
}
|
|
|
|
double foo() @trusted {
|
|
int a = 5;
|
|
return a;
|
|
}
|
|
|
|
struct Foo1(size_t Size = 42 / magic()) {
|
|
|
|
}
|
|
|
|
|
|
size_t magic() {
|
|
return 42;
|
|
}
|
|
|
|
class Foo2A {
|
|
|
|
immutable(FooA) Dummy = new immutable(FooA);
|
|
private immutable pure nothrow @nogc @safe this() {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// https://issues.dlang.org/show_bug.cgi?id=15676
|
|
struct Foo3A(T)
|
|
{
|
|
@disable this(this);
|
|
@disable this();
|
|
}
|
|
|
|
// return ref, return scope, return ref scope
|
|
ref int foo(return ref int a) @safe
|
|
{
|
|
return a;
|
|
}
|
|
|
|
int* foo(return scope int* a) @safe
|
|
{
|
|
return a;
|
|
}
|
|
|
|
ref int* foo(scope return ref int* a) @safe
|
|
{
|
|
return a;
|
|
}
|
|
|
|
struct SafeS
|
|
{
|
|
this(int[1] x) scope {}
|
|
this(int[2] x) return scope {}
|
|
this(int[3] x) scope return {}
|
|
this(int[4] x) return {}
|
|
|
|
@safe:
|
|
ref SafeS foo() return
|
|
{
|
|
return this;
|
|
}
|
|
|
|
SafeS foo2() return scope
|
|
{
|
|
return this;
|
|
}
|
|
|
|
ref SafeS foo3() scope
|
|
{
|
|
static SafeS s;
|
|
return s;
|
|
}
|
|
|
|
ref SafeS foo4() scope return
|
|
{
|
|
return this;
|
|
}
|
|
|
|
int* p;
|
|
}
|
|
|
|
void test13x(@(10) int a, @(20) int, @(30) @(40) int[] arr...) {}
|
|
|
|
enum Test14UDA1;
|
|
struct Test14UDA2
|
|
{
|
|
string str;
|
|
}
|
|
|
|
Test14UDA2 test14uda3(string name)
|
|
{
|
|
return Test14UDA2(name);
|
|
}
|
|
struct Test14UDA4(string v){}
|
|
|
|
void test14x(@Test14UDA1 int, @Test14UDA2("1") int, @test14uda3("2") int, @Test14UDA4!"3" int) {}
|
|
|
|
void test15x(@(20) void delegate(int) @safe dg){}
|
|
|
|
T throwStuff(T)(T t)
|
|
{
|
|
if (false) test13x(1, throw new Exception(""), 2);
|
|
return t ? t : throw new Exception("Bad stuff happens!");
|
|
}
|
|
|
|
class C12344
|
|
{
|
|
abstract int c12344(int x) in(x > 0) out(result) {assert(result > 0);};
|
|
}
|
|
|
|
interface I12344
|
|
{
|
|
int i12344(int x) in(x > 0) out(result) {assert(result > 0);};
|
|
}
|