DIP 1029---Add throw as Function Attribute---Community Review Round 1

Dukc ajieskola at gmail.com
Wed Jan 15 12:29:43 UTC 2020

On Tuesday, 14 January 2020 at 22:30:40 UTC, Walter Bright wrote:
> On 1/14/2020 8:44 AM, Dukc wrote:
>> This would be a step forward, of course. But would not it be 
>> better to kill the one-way attribute problem in one go 
>> -meaning, making an antiattribute for `pure` and `@nogc` too?
> Because for the anti-nothrow we already have a trivial solution 
> staring us in the face, we just have to pick it up. I have no 
> explanation for not seeing the obvious before.


>> In addition, I suggest that there should be a way to use 
>> [`pure:`/`nothrow:`/`@nogc:`/`@safe:`/their antiattributes] so 
>> that they only apply when attributes are not inferred - not 
>> for templated functions. This would also remove a big obstacle 
>> from front of DIP1028, as one could just mark the whole module 
>> `@system` with one statement without killing template `@safe` 
>> or `@live` inference.
> It turns out that there's another "attribute" under the covers 
> - the default. Only when an attribute is the default does 
> inference come into play. Hence, when "nothrow" becomes the 
> default, there will be actually three states - throw, nothrow, 
> and default.

Yes, correct. But what is worth mentioning ew are actually 
discussing about FOUR attributes: `throw`, `nothrow`, present 
default and the `nothrow` default. If the latest someday becomes 
the default, we suddently lose our ability to use the current 

What I was saying that it would be worthwhile to make all those 
"default" attributes accessible so that is the scope already is, 
say `throw`, you can change it to the (current or likely-future) 
default behaviour. This will make the transition to 
nothrow-default much easier, as people can set their whole 
modules to the old default to keep legacy code running, or set 
the whole module to the new default so that the checks are done 
even before the transition.

> It works out rather nicely. It's in play for 
> safe/trusted/system already, and has been since the beginning.

Setting the default this way should also be possible for 
`@system/`@safe/`@live` too (in theory, for `@trusted` too, but 
why in the world would anyone want to default to it?). And for 
other inferred attributes, if they get their antiattributes.

More information about the Digitalmars-d mailing list