__traits(compileError, {})
bitwise via Digitalmars-d
digitalmars-d at puremagic.com
Thu Sep 7 18:18:46 PDT 2017
Lately, I've been hit by several compilation errors when phobos
fails to construct an instance of a class or struct I've pass it.
Regardless of what the exact failure is, phobos usually gives you
some generic error that isn't helpful.
Example:
class Test {
@disable this();
}
int main(string[] argv) {
auto sz = __traits(classInstanceSize, Test);
auto mem = malloc(sz)[0..sz];
emplace!Test(mem);
return 0;
}
The above code fails with this error:
'Error: static assert "Don't know how to initialize an object of
type Test with arguments ()"'
@disable'd constructors are only one of the reasons I've hit this
snag.
Once though, I was having an extremely hard time figuring out
what was wrong, and the fix was simply to modify emplace(). I
removed the line below from emplace(), and forced the constructor
call, which led to a much more helpful error.
`// static if (is(typeof(result.__ctor(args1))))`
If you simply did that though, it may not be obvious to everyone
what happened, but if you had __traits(compilerError, {}) then
you could dress the error up as appropriate:
"Emplace failed with error:\n\t'" ~ __traits(compileError, {
result.__ctor(args1) }) ~ "."
The alternative would be to manually code redundant error checks
that the compiler already does into everything in phobos that
needs to construct objects, which seems much worse than
implementing something like __traits(compileError, {}).
Thoughts?
More information about the Digitalmars-d
mailing list