Bug 20010 – allow cast of type, not only expressions

Status
NEW
Severity
enhancement
Priority
P4
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2019-06-29T10:14:30Z
Last change time
2024-12-13T19:04:24Z
Assigned to
No Owner
Creator
basile-z
Moved to GitHub: dmd#19596 →

Comments

Comment #0 by b2.temp — 2019-06-29T10:14:30Z
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
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/19596 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB