DMD 1.033 (typeof() error instantiating in template)
David L. Davis
SpottedTiger at yahoo.com
Thu Jul 17 06:59:35 PDT 2008
Walter Bright Wrote:
> For Tango.
>
> http://www.digitalmars.com/d/1.0/changelog.html
> http://ftp.digitalmars.com/dmd.1.033.zip
>
Walter,
I've discovered a piece of my D 1.xxx source that's now broken since the dmd v1.033/v1.032 release...below is the test code to show the error(s).
// Test source typeofx.d to recreate the error
module typeofx;
private import sc = std.compiler;
private import std.stdio;
private import std.stdarg;
// Setup TypeoF const types
const uint TF_UINT;
const ulong TF_ULONG;
template isIntConvertableP(T1, T2)
{
private bool isIntConvertableP(in T1 v)
{
if (typeid(T1) !is typeid(int))
return false;
typeof(T2) v2;
writefln("T1.typid=%s, T1.v=", typeid(T1), v,
" T1.tsize=%d, ", T1.sizeof,
"T2.typid=%s, T2.tsize=%d", typeid(T2), T2.sizeof);
if (v >= v2.min && v <= v2.max)
return true;
else
return false;
}
}
bool isIntConvertable(...)
{
if (_arguments.length < 2)
return false;
TypeInfo ti1 = _arguments[0];
TypeInfo ti2 = _arguments[1];
int i = (va_arg!(int)(_argptr));
if (ti2 is typeid(ulong))
return isIntConvertableP!(int, ulong)(i);
if (ti2 is typeid(uint))
return isIntConvertableP!(int, uint)(i);
return false;
}
int main()
{
// works for dmd v1.031,
// doesn't work under v1.033/v1.032
assert(isIntConvertableP!(int, ulong)(123) == true);
// works for dmd v1.031,
//doesn't work under v1.033/v1.032
assert(isIntConvertable(123, TF_ULONG) == true);
writefln();
writefln("Compiled and tested with: \"%s v%d.%03d\"",
sc.name, sc.version_major, sc.version_minor);
return 0;
}
/+ compile and run with dmd v1.031
C:\dmd>dmd typeofx.d
C:\dmd>typeofx
T1.typid=int, T1.v=123 T1.tsize=4, T2.typid=ulong, T2.tsize=8
T1.typid=int, T1.v=123 T1.tsize=4, T2.typid=ulong, T2.tsize=8
Compiled and tested with: "Digital Mars D v1.031"
C:\dmd>
+/
/+ dmd v1.033/1.032 gotten with the 1st assert
C:\dmd>dmd typeofx.d
typeofx.d(18): Error: argument ulong to typeof is not an expression
typeofx.d(42): template instance typeofx.isIntConvertableP!(int,ulong) error instantiating
C:\dmd>
+/
/+ dmd v1.033/1.032 gotten with the 2nd assert...1st assert commented in
C:\dmd>dmd typeofx.d
typeofx.d(18): Error: argument ulong to typeof is not an expression
typeofx.d(42): template instance typeofx.isIntConvertableP!(int,ulong) error instantiating
C:\dmd>
+/
Thanks,
David L. Davis
More information about the Digitalmars-d-announce
mailing list