digitalmars.D.learn - Purity tree trace error?
- bearophile (27/27) Jul 18 2011 In DMD 2.054 if I have a wrong program like this, a function that's not ...
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.conv.to!(string, size_t), because of:
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
Jul 18 2011








bearophile <bearophileHUGS lycos.com>