| |
| Posted by ag0aep6g in reply to Dennis | PermalinkReply |
|
ag0aep6g
Posted in reply to Dennis
| 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.
|