On Tuesday, 30 January 2024 at 02:05:23 UTC, user1234 wrote:
I want to share a stupid program to show you that D safety is
more complex than you might think:
```d
module test;
void test() @safe
{
int i;
int b = (*&(*&++i))++;
}
void main() @safe
{
test();
}
```
I'm not showing a deficiency of D, that program is undeniably
safe ;)
I'm surprised `&++i` even compiles in the first place, but
looking at [the spec][1], it seems to be intentional:
The following expressions, and no others, are called lvalue
expressions or lvalues:
[...]
4. the result of the following expressions:
* built-in unary operators + (when applied to an lvalue), *,
++ (prefix only), -- (prefix only);
Testing it out, the address you get is the same as `&i`.
This definitely isn't allowed in C or C++. I wonder what the
rationale is for having this behavior in D?
[1]: https://dlang.org/spec/expression.html