Can we just have struct inheritence already?

Timon Gehr timon.gehr at gmx.ch
Fri Jun 14 01:12:21 UTC 2019


On 14.06.19 02:23, Exil wrote:
> On Thursday, 13 June 2019 at 21:26:37 UTC, Tim wrote:
>> On Thursday, 13 June 2019 at 20:55:34 UTC, Exil wrote:
>>> This problem happens because you are used @trusted. If you used @safe 
>>> you wouldn't be able to increment pointers and modify the values the 
>>> way you did in @trusted.
>>
>> Here is a completly @safe version:
>>
>> import std.stdio;
>>
>> static int[2] data;
>> static int[253] data2;
>>
>> void test(bool b) @safe
>> {
>>     data[b]++;
>> }
>>
>> void main() @safe
>> {
>>     bool b = void;
>>     writeln(data, data2);
>>     test(b);
>>     writeln(data, data2);
>> }
>>
>> If b is valid only data can change. But for me data2 changes, even 
>> though it is never written to.
> 
> This is a bug.

Yes. And the bug is either
- that `void` initialization of `bool` is `@safe`.
- that `void` initialization of `bool` can produce a value that is both 
`true` and `false`.
- that boolean values are assumed to be either `true` or `false` in 
@safe code.

Which one seems most plausible to you?

> It seems it doesn't do bounds checking for the index 
> because it is a bool value and it is less than the static type. If you 
> change the array to a dynamically allocated one, an assert is hit as 
> expected.

That's not expected, this is just the compiler not being as smart as it 
could be given the available information.


More information about the Digitalmars-d mailing list