why is ifThrown un at safe?
bauss
jj_1337 at live.dk
Fri Mar 15 18:46:25 UTC 2019
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 at 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.
There is no safe overload of ifThrown.
However you can work around this using @trusted.
More information about the Digitalmars-d-learn
mailing list