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

Dennis dkorpel at gmail.com
Tue Jan 14 21:22:17 UTC 2020


On Tuesday, 14 January 2020 at 10:44:17 UTC, Mike Parker wrote:
> #DIP1029
> #throw

First of all thanks for adding the section with a grammar diff 
and adding it to FunctionAttribute. I forgot to mention during 
draft review it should probably be added to StorageClass as well:
https://dlang.org/spec/grammar.html#StorageClass

Otherwise it can't appear in an AutoFunctionDeclaration unlike 
nothrow.
```
void main() {
     nothrow foo() {} // currently allowed
     throw foo() {} // not allowed after this DIP because `throw` 
is no `StorageClass`
}
```

However, adding it to StorageClass adds an ambiguity:

```
void foo()() {
     nothrow bar(); // allowed according to grammar spec
     throw bar(); // throw statement or function declaration?
}
```

Now it should be noted that dmd doesn't actually parse that. I 
opened an issue for that:

https://issues.dlang.org/show_bug.cgi?id=20504

That could make the problem away in this case, but I think the 
DIP should consider possible ambiguities like that that might be 
introduced.

Further feedback:

- I still think that other attributes should be considered for 
this DIP. As I mentioned during draft review:

> pure isn't fortunate enough to have an opposite keyword for it. 
> If we end up going with e.g. pure(false) or !pure, then you'll 
> end up with either inconsistently not allowing nothrow(false) 
> or !nothrow, or multiple ways to specify a throw function.

It would be annoying to users if soon after the introduction of 
`throw` as a function attribute it would be phased out because a 
new consistent mechanism is introduced for all function 
attributes.

On the other hand, adding an option to negate the nothrow 
attribute in the short term is welcome, and it can still be kept 
around with little harm even if it gets superceded.

- I still think it should be stated how the new attribute 
interacts with __traits(getFunctionAttributes):
```
void t0() nothrow; // tuple("nothrow", "@system")
void t1() throw; // tuple("throw", "@system")
void t2(); // tuple("@system") or tuple("throw", "@system")?
```







More information about the Digitalmars-d mailing list