People write stuff like :
mixin("alias Func = " ~ typeof(&impl).stringof ~ " pure nothrow;");
to set the attributes of a function. We could have something like
alias Func = cast(pure nothrow) typeof(&impl);
or even using the TypeCtor style
alias Func = pure(nothrow(typeof(&impl)));
This probably requires a DIP but I open an issue to keep track of the idea.
Comment #1 by qs.il.paperinik — 2024-06-05T13:16:27Z
I’d be in favor of the cast.
Grammar:
```diff
CastQual:
- cast ( TypeCtors? ) UnaryExpression
+ cast ( MemberFunctionAttributes? ) UnaryExpression
+ cast ( ... MemberFunctionAttributes ) UnaryExpression
+ cast ( ! ...[opt] MemberFunctionAttributes ) UnaryExpression
```
Note that `MemberFunctionAttributes` includes `TypeCtors`.
Semantics of `cast()` must remain so that it only removes `TypeCtor`s. To remove other things, either use e.g. `cast(@system)` or fix https://issues.dlang.org/show_bug.cgi?id=24587.
One issue I see, however, is with delegate types: `cast(immutable)` would produce `immutable(R delegate())` and there’s no way to go from `R delegate()` to `R delegate() immutable` with a cast. This is what the second rule does: It applies the member function attribute to the function type even if it’s a type qualifier.
`cast(pure)` is unambiguous, so it doesn’t require `cast(... pure)`, but `cast(... pure)` should be legal. The `...` essentially becomes `typeof(UnaryExpression)`.
As for Issue 24587 (negated forms), that’s the last rule: `cast(! ... const)` removes `const` as a member function attribute.
Comment #2 by robert.schadek — 2024-12-13T19:04:24Z