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