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.