[dmd-internals] Test cases for D1-CTFE
Don Clugston
dclugston at googlemail.com
Fri Apr 8 22:07:56 PDT 2011
The D1 test suite still isn't on git. These are the D1 tests I added
to the bottom of interpret3.d. Only the last one is specific is D1.
--------------
char[] bug1330StringIndex()
{
char [] blah = "foo".dup;
assert(blah == "foo");
char [] s = blah[0..2];
blah[0] = 'h';
assert(s== "ho");
s[0] = 'm';
return blah;
}
static assert(bug1330StringIndex()=="moo");
static assert(bug1330StringIndex()=="moo"); // check we haven't
clobbered any string literals
int[] bug1330ArrayIndex()
{
int [] blah = [1,2,3];
int [] s = blah;
s = blah[0..2];
int z = blah[0] = 6;
assert(z==6);
assert(blah[0]==6);
assert(s[0]==6);
assert(s== [6, 2]);
s[1] = 4;
assert(z==6);
return blah;
}
static assert(bug1330ArrayIndex()==[6,4,3]);
static assert(bug1330ArrayIndex()==[6,4,3]); // check we haven't
clobbered any literals
char[] bug1330StringSliceAssign()
{
char [] blah = "food".dup;
assert(blah == "food");
char [] s = blah[1..4];
blah[0..2] = "hc";
assert(s== "cod");
s[0..2] = ['a', 'b']; // Mix string + array literal
assert(blah == "habd");
s[0..2] = "mq";
return blah;
}
static assert(bug1330StringSliceAssign()=="hmqd");
static assert(bug1330StringSliceAssign()=="hmqd");
int[] bug1330ArraySliceAssign()
{
int [] blah = [1,2,3,4];
int [] s = blah[1..4];
blah[0..2] = [7, 9];
assert(s == [9,3,4]);
s[0..2] = [8, 15];
return blah;
}
static assert(bug1330ArraySliceAssign()==[7, 8, 15, 4]);
int[] bug1330ArrayBlockAssign()
{
int [] blah = [1,2,3,4,5];
int [] s = blah[1..4];
blah[0..2] = 17;
assert(s == [17,3,4]);
s[0..2] = 9;
return blah;
}
static assert(bug1330ArrayBlockAssign()==[17, 9, 9, 4, 5]);
char[] bug1330StringBlockAssign()
{
char [] blah = "abcde".dup;
char [] s = blah[1..4];
blah[0..2] = 'x';
assert(s == "xcd");
s[0..2] = 'y';
return blah;
}
static assert(bug1330StringBlockAssign() == "xyyde");
int assignAA(int x) {
int[int] aa;
int[int] cc = aa;
assert(cc.values.length==0);
assert(cc.keys.length==0);
aa[1] = 2;
aa[x] = 6;
int[int] bb = aa;
assert(bb.keys.length==2);
assert(cc.keys.length==0); // cc is not affected to aa, because it is null
aa[500] = 65;
assert(bb.keys.length==3); // but bb is affected by changes to aa
return aa[1] + aa[x];
}
static assert(assignAA(12) == 8);
template Compileable(int z) { bool OK;}
int arraybounds(int j, int k)
{
int [] xxx = [1, 2, 3, 4, 5];
int [] s = xxx[1..$];
s = s[j..k]; // slice of slice
return s[$-1];
}
int arraybounds2(int j, int k)
{
int [] xxx = [1, 2, 3, 4, 5];
int [] s = xxx[j..k]; // direct slice
return 1;
}
static assert( !is(typeof(Compileable!(arraybounds(1, 14)))));
static assert( !is(typeof(Compileable!(arraybounds(15, 3)))));
static assert( arraybounds(2,4) == 5);
static assert( !is(typeof(Compileable!(arraybounds2(1, 14)))));
static assert( !is(typeof(Compileable!(arraybounds2(15, 3)))));
static assert( arraybounds2(2,4) == 1);
int bug5147a() {
int[1][2] a = 37;
return a[0][0];
}
static assert(bug5147a()==37);
int bug5147b() {
int[4][2][3][17] a = 37;
return a[0][0][0][0];
}
static assert(bug5147b()==37);
int setlen()
{
int[][] zzz;
zzz.length = 2;
zzz[0].length = 10;
assert(zzz.length == 2);
assert(zzz[0].length==10);
assert(zzz[1].length==0);
return 2;
}
static assert(setlen()==2);
int ZZfoo()
{
const int [] ZZ = [ 1,2,3];
int [] q = ZZ;
int [] w = ZZ;
if (q[1]!=2) return 27;
w[1] = 6;
return q[2];
}
static assert(ZZfoo()==3);
static assert(ZZfoo()==3);
More information about the dmd-internals
mailing list