Dicebot on leaving D: It is anarchy driven development in all its glory.

Walter Bright newshound2 at digitalmars.com
Sun Aug 26 10:17:51 UTC 2018


On 8/25/2018 5:52 PM, David Nadlinger wrote:
> On Saturday, 25 August 2018 at 22:53:44 UTC, Walter Bright wrote:
>> On 8/25/2018 2:46 PM, David Nadlinger wrote:
>>> At least for the transition period, I'd have attributes only apply to the 
>>> user-specified code and infer them for the actual full constructor. (We can 
>>> still print a deprecation warning if they don't match.) —David
>>
>> Inferring is not good enough, for example:
>>
>> https://github.com/dlang/dmd/pull/6816#issuecomment-307972790
>>
>> There the @safe constructor is calling a destructor that calls free(). It 
>> can't be inferred as @safe.
> 
> How did you interpret "only apply to the user-specified code"? In this example, 
> the `@safe` in `this() @safe {}` would only apply to `{}`.

I'm not sure what you're referring to. I'm referring to the specified message, 
and the example:

struct Array
{
     int[] _payload;
     ~this() // (2)
     {
         import core.stdc.stdlib : free;
         free(_payload.ptr); // (3)
     }
}

class Scanner
{
     Array arr;
     this() @safe {}  // (1)
}

In order for (1) to be @safe, then the destructor it calls for arr (2) must also 
be @safe. But the destructor calls free() (3), which is not @safe. Therefore, 
the compilation fails. Inference does not solve this problem, because (2) is 
inferred as @system.


> can be supplemented with 
> deprecation warnings if the specified "inner" and inferred "outer" attributes 
> don't match.

Yes, and that's probably the only viable way forward with this. But Chris' ox 
will get gored, as 2009 code will not compile anymore without modification after 
the deprecation period expires.



More information about the Digitalmars-d mailing list