On Friday, 11 August 2023 at 13:37:57 UTC, Mike Parker wrote:
__void initialing Booleans__

Dennis wasn't yet finished. The last item he had for us was [a PR he had submitted](https://github.com/dlang/dmd/pull/15362) that marks as `@system` the void initialization of a `bool`, or anything that contains a Boolean, under the system variables preview. The compiler likes to avoid bounds checks if you index with a bool because it knows it can only be zero or one, but when the bool is void initialized, it might be something bigger than that and can corrupt memory. (The PR is attempting [to fix an issue](https://issues.dlang.org/show_bug.cgi?id=20148) brought up in [our Gripes & Wishes campaign](https://github.com/dlang/vision-document/blob/main/gripes-wishes-feedback.md)).

He said there were a few different opinions on what should happen here. One is for every void initialization to be `@system`, but that's a bigger breaking change that he doesn't think is going to happen.

Would not be recommended anyway. It'd mean any union with `bool` would have to be `@system`.

It might be helpful to consider `bool` a type that has unsafe bit patterns. Walter said he would have to think about it, and thanked Dennis for bringing it up.

I think `bool` other than 0 or 1 should be allowed, but have implementation defined behaviour:

```D
if(*cast(bool) new byte(2)) // implementation defined whether executed
// true or false, implementation defined
auto x = *cast(bool) new byte(2) && *cast(bool) new byte(2)
// true or false, implementation defined
auto y = *cast(bool) new byte(2) == *cast(bool) new byte(2)
// same as bool z = void
auto z = *cast(bool) new byte(2) & *cast(bool) new byte(2)
// not implementation defined anymore
z = true;
```

This unfortunately means that dmd has to stop assuming bool bit pattern of bool.

Reply via email to