On Monday, 1 September 2014 at 16:36:04 UTC, Daniel Murphy wrote:
I don't think this is a good idea. Each time @trusted is used, it should be on a function that is completely @safe to call. I think this is worth more than the cost in verbosity.

Lambdas and nested functions are special in that they can't be called from other code, so they only have to be @safe in the context of the enclosing function. They do still need to make sure they don't violate @safe, otherwise the entire enclosing function will need to be manually checked.

eg
void fun(int a) @safe
{
...
   p = @trusted () { return &a; }
...
}

This function is now essentially @trusted, because although the unsafe '&' operation was inside the trusted block, the @safe function now has a pointer it should not have been able to get.

I feels like you are missing the point of the @trusted lambda construct, in that is meant to be used in generic code, where you know a *piece* of a function is provably safe (eg: @trusted), but not all of it: The rest of the code depends on the inferred attributes of the parameter-dependent code.

If your function is not generic, then just mark it as @trusted, and then that's that.

Another alternative I had proposed was one of being able to simply create blocks with attributes. EG:

void foo(T)(T t)
{
    t.doSomething(); //May or may not be safe.

    nothrow
    {
        ... //Do "critical" code that can't throw here.
    }

    @trusted
    {
        ... //This slice of code is trusted.
    }

    @safe @nogc
    {
... //Have the compiler enforce only @safe and @ngc code goes here.
    }
    return t;
}

Reply via email to