On 17.07.21 14:56, Dennis wrote:
On Saturday, 17 July 2021 at 12:05:44 UTC, ag0aep6g wrote:
Hm, as far as I understand, "strongly pure" doesn't require `immutable` parameters. `const` should be enough. The spec says: "A strongly pure function has no parameters with mutable indirections" [1].

I just took the description from the source code:
```D
enum PURE : ubyte
{
     impure      = 0,    // not pure at all
     fwdref      = 1,    // it's pure, but not known which level yet
     weak        = 2,    // no mutable globals are read or written
     const_      = 3,    // parameters are values or const
     strong      = 4,    // parameters are values or immutable
}
```

That looks off to me. Unless DMD has some secret knowledge about a shortcoming in the established definition of "strongly pure", I think those enum values are badly named.

At a glance, the only meaningful use of `PURE.strong` seems to be in dcast.d, introduced by the PR you linked. Changing that to `PURE.const_` doesn't break any tests for me. So I'm inclined to believe that `PURE.strong` is nonsense, and that `PURE.const_` already means "strongly pure".

However, changing that instance doesn't fix the issue. Apparently, DMD doesn't even recognize

    int[] array(const int[] input) pure { ... }

as `PURE.const_`.

I don't know whether the spec or code is correct.

When it comes to purity, another piece in the puzzle is David Nadlinger's article:

https://klickverbot.at/blog/2012/05/purity-in-d/

There, a function with a `const int[]` parameter is described as "strongly pure".

As far as I can remember, when DMD and that article disagreed in the past, DMD was wrong.

[...]
Yup, [remember this](https://github.com/dlang/dmd/pull/8035#discussion_r174771516)?

Hehe, I knew I had complained about it before.

It's doubly bad: (1) We're missing out on bug fixes, because they're hidden behind `-preview=dip1000` for no reason. (2) When `-preview=dip1000` ever becomes the default, code will break that doesn't even use the features of DIP 1000.

Reply via email to