On Friday, 15 March 2019 at 18:46:25 UTC, bauss wrote:
On Friday, 15 March 2019 at 18:04:05 UTC, Bastiaan Veelo wrote:
In the code below (https://run.dlang.io/is/d0oTNi), ifThrown
is inferred as un@safe. If instead I write the implementation
of ifThrown out (after res2) then it is @safe. As far as I can
see, there is no real difference. So why doesn't ifThrown work
in this case, and can it be made to work?
Thanks!
void main() @safe
{
import std.process;
import std.exception;
const res1 = execute(["clang", "-v", "-xc++",
"/dev/null", "-fsyntax-only"], ["LANG": "C"])
.ifThrown((e) @safe {
import std.typecons : Tuple;
return Tuple!(int, "status", string, "output")(-1,
e.msg);
}); // Fails
const res2 = () {
try
{
return execute(["clang", "-v", "-xc++",
"/dev/null", "-fsyntax-only"], ["LANG": "C"]);
}
catch (Exception e)
{
import std.typecons : Tuple;
return Tuple!(int, "status", string, "output")(-1,
e.msg);
}
}();
}
Because the handlers may be unsafe.
But this handler is explicitly marked @safe, and ifThrown is a
template, which should infer its attributes, right?
There is no safe overload of ifThrown.
Could it be added?
However you can work around this using @trusted.
I know, but since everything really is safe, I'd rather not imply
that it might not be. Besides, I failed to use @trusted without
introducing a new scope, so I'd have to mark the whole block
where `res1` is used as @trusted. Maybe I did that wrong though.