import std.stdio : writeln;
template Template (uint n, T)
{
T[n] statArr()
{
T[n] arr;
return arr;
}
T[] dynArr()
{
T[] dynArr = new T[n];
return dynArr;
}
}
void main()
{
alias statArr9 = Template!(9, int).statArr;
alias statArr3 = Template!(3, int).statArr;
alias statArr2 = Template!(2, int).statArr;
alias statArr1 = Template!(1, int).statArr;
alias statArr0 = Template!(0, int).statArr;
// Fine
statArr9().writeln(); // Writes [0, 0, 0, 0, 0, 0, 0,
0, 0]
statArr3().writeln(); // Writes [0, 0, 0]
statArr2().writeln(); // Writes [0, 0]
statArr1().writeln(); // Writes [0]
statArr0().writeln(); // Writes []
// 2 bugs
statArr9()[0].writeln(); // OK : Writes 0
statArr3()[0].writeln(); // OK : Writes 0
//statArr2()[0].writeln(); // BUG: Internal error:
..\ztc\cgcs.c 344
//statArr1()[0].writeln(); // BUG: Internal error:
..\ztc\cgcs.c 344
//statArr0()[0].writeln(); // OK : Error: array index 0 is
out of bounds
// getArr0()[0 .. 0]
alias dynArr9 = Template!(9, int).dynArr;
alias dynArr3 = Template!(3, int).dynArr;
alias dynArr2 = Template!(2, int).dynArr;
alias dynArr1 = Template!(1, int).dynArr;
alias dynArr0 = Template!(0, int).dynArr;
dynArr9()[0].writeln(); // OK: Writes 0
dynArr3()[0].writeln(); // OK: Writes 0
dynArr2()[0].writeln(); // OK: Writes 0
dynArr1()[0].writeln(); // OK: Writes 0
//dynArr0()[0].writeln(); // OK:
core.exception.RangeError:
// Range violation
// Other types
//Template!(2, bool).statArr()[0].writeln(); // BUG
//Template!(2, byte).statArr()[0].writeln(); // BUG
//Template!(2, ubyte).statArr()[0].writeln(); // BUG
//Template!(2, short).statArr()[0].writeln(); // BUG
//Template!(2, ushort).statArr()[0].writeln(); // BUG
//Template!(2, int).statArr()[0].writeln(); // BUG
//Template!(2, uint).statArr()[0].writeln(); // BUG
//Template!(2, long).statArr()[0].writeln(); // BUG
//Template!(2, ulong).statArr()[0].writeln(); // BUG
//Template!(2, float).statArr()[0].writeln(); // BUG
//Template!(2, double).statArr()[0].writeln(); // BUG
Template!(2, real).statArr()[0].writeln(); // OK :
Writes nan
//Template!(2, ifloat).statArr()[0].writeln(); // BUG
//Template!(2, idouble).statArr()[0].writeln(); // BUG
Template!(2, ireal).statArr()[0].writeln(); // OK :
Writes inan
//Template!(2, cfloat).statArr()[0].writeln(); // BUG
Template!(2, cdouble).statArr()[0].writeln(); // OK :
Writes nan+nani
Template!(2, creal).statArr()[0].writeln(); // OK :
Writes nan+nani
//Template!(2, char).statArr()[0].writeln(); // BUG
//Template!(2, wchar).statArr()[0].writeln(); // BUG
//Template!(2, dchar).statArr()[0].writeln(); // BUG
struct Sint { int a; }
struct Sreal { real a; }
Template!(2, Sint).statArr()[0].writeln(); // OK :
Writes Sint(0)
Template!(2, Sreal).statArr()[0].writeln(); // OK :
Writes Sreal(nan)
}
Found in both dmd 2.061 and 2.062 for 32- and 64-bit. Other
types only tested with dmd 2.062.