compile time output
Ary Borenszweig
ary at esperanto.org.ar
Tue Jan 20 09:12:43 PST 2009
Trass3r wrote:
> Is there any way to output information at compile time other than
> pragma(msg?
> pragma is driving me crazy, the following doesn't work:
>
> auto members = __traits(allMembers, typeof(this));
Kind of offtopic, but I tried this (with typeof(Foo) and Foo is defined
in the same module) in Descent and I get a NullPointerException. :-(
I thought the port to Java was wrong so I compared to dmd's code.
In traits.c I can see:
---
else if (ident == Id::allMembers || ident == Id::derivedMembers)
{
if (dim != 1)
goto Ldimerror;
Object *o = (Object *)args->data[0];
Dsymbol *s = getDsymbol(o);
---
and in template.c getDsymbol says:
---
Dsymbol *getDsymbol(Object *oarg)
{
Dsymbol *sa;
Expression *ea = isExpression(oarg);
if (ea)
{
// (snip)
}
else
{ // Try to convert Type to symbol
Type *ta = isType(oarg);
if (ta)
sa = ta->toDsymbol(NULL);
else
sa = isDsymbol(oarg); // if already a symbol
}
return sa;
}
---
and of course oarg is a type, it's a TypeTypeof, so
TypeTypeof::toDsymbol is invoked. Note that in this point sc is NULL.
---
Dsymbol *TypeTypeof::toDsymbol(Scope *sc)
{
Type *t;
t = semantic(0, sc);
if (t == this)
return NULL;
return t->toDsymbol(sc);
}
---
and finally...
---
Type *TypeTypeof::semantic(Loc loc, Scope *sc)
{ Expression *e;
Type *t;
sc->intypeof++; // sc is NULL!!
exp = exp->semantic(sc);
sc->intypeof--;
// (snip)
}
---
and that's why I get a NPE. But compiling with dmd works fine.
Unfortunately I don't have with me the necessary stuff to debug dmd...
does anyone know what's going on?
Thanks,
Ary
More information about the Digitalmars-d-learn
mailing list