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

Reply via email to