Purity tree trace error?
bearophile
bearophileHUGS at lycos.com
Mon Jul 18 13:01:54 PDT 2011
In DMD 2.054 if I have a wrong program like this, a function that's not pure called from a pure function:
import std.conv;
void main() pure {
to!int("12");
}
DMD 2.054 prints:
test.d(3): Error: pure function 'main' cannot call impure function 'to'
Instead of that error message, do you like the idea of a kind of "stack trace" for purity errors? I think the compiler already has the information to show such "purity tree trace" because it is needed to verifity the transitive nature of the pure attribute.
Such tree-shaped error for purity is useful to better understand why a function is not pure, and eventually try to fix this.
The disadvantage is that error messages get longer.
The idea comes from part of an answer written by KennyTM~ (edited):
to!int("12") is not pure because of:
- std.array.front and popFront, because of:
- std.utf.decode (Phobos pull #80 was rejected), because of:
- std.exception.enforce (bug 5750 / DMD pull #227)
- std.conv.to!(string, size_t), because of:
- GC.malloc, or std.array.uninitializedArray if Phobos pull #144 was accepted
- std.conv.to!(string, const(ubyte)[]), because of:
- std.conv.to!(string, ubyte), because of std.conv.to!(string, uint)
- std.array.appender, because of:
- GC.extend
- GC.qalloc
- memcpy (just need a 'pure' annotation)
- ConvOverflowException.raise, just lacking a 'pure' annotation
- convError, because of std.conv.to!(string, uint).
Bye,
bearophile
More information about the Digitalmars-d-learn
mailing list