compile errors in attribute-inferred code
aliak
something at something.com
Thu Aug 1 23:12:36 UTC 2019
So this happened:
A library I use had an @safe test like this which was working
great:
auto result = [1, 2, 3]
.map!(a => Try!(() => throwIfOdd(a)))
.map!(tryResult => tryResult // <-- lambda
.match!(
(int _) => "even",
(Exception _) => "odd"
)
);
assert(result.equal(["odd", "even", "odd"]));
Then all of a sudden, started failing on the CI.
But the error message: Error: @safe function
ddash.utils.try_.__unittest_L10_C7 cannot call @system function
ddash.common.equal.equal!(null, MapResult!(__lambda3,
MapResult!(__lambda2, int[])), string[]).equal
And then it pointed me to equal in an implementation of equal
that I had. Marking that @safe then pointed me to
std.algorithm.all, marking that safe pointed me to
std.algorithm.find, marking that safe pointed me to "if
(predFun(haystack.front))" ... and it went on.
At the end, it turns out the CI was getting an updated version of
a library called sumtype, which had added some @safe inspections
(so that's a good thing) but guess where the error was:
The Try type contains a pointer to an Expect(T,
Unexpected!Exception) type, and that in turn contains a
SumType!(T, Unexpected!Exception). The Try type assigns the value
of executing it's lambda to the Expect type (which is alias
this'd to the SumType).
The error was actually that the lambda was not safe, because it
called .match on a try, which in turn calls resolve on a try,
which assigned the result of the resolution to the expect type -
that assignment was determined not safe because the sumtype
didn't allow it.
So I realize that drilling down all the way to what was actually
unsafe can be painful, but what if it was limited to inferred
code? Is that something feasible?
So equal -> all -> find -> predFun (this called front on a map)
-> lambda -> match -> try.resolve and it can stop there?
Basically the error "cannot call @system function equal" is
pretty useless, so I'm wondering if there's anything that can be
feasibly done about that?
Cheers,
- ali
More information about the Digitalmars-d
mailing list