digitalmars.D.bugs - [Issue 19621] New: The specification is self-contradictory on
- d-bugmail puremagic.com (38/38) Jan 26 2019 https://issues.dlang.org/show_bug.cgi?id=19621
https://issues.dlang.org/show_bug.cgi?id=19621 Issue ID: 19621 Summary: The specification is self-contradictory on immutability Product: D Version: D2 Hardware: x86_64 OS: Linux Status: NEW Severity: enhancement Priority: P1 Component: dlang.org Assignee: nobody puremagic.com Reporter: porton narod.ru https://dlang.org/spec/const3.html says both of the following: --- The second way is to cast data to immutable. When doing so, it is up to the programmer to ensure that no other mutable references to the same data exist. char[] s = ...; immutable(char)[] p = cast(immutable)s; // undefined behavior immutable(char)[] p = cast(immutable)s.dup; // ok, unique reference --- and --- An immutable or const type qualifier can be removed with a cast: immutable int* p = ...; int* q = cast(int*)p; This does not mean, however, that one can change the data: *q = 3; // allowed by compiler, but result is undefined behavior --- The first says that the existence of mutable reference is enough for the undefined behavior but the second says that for wrong behavior one needs to actually change the data through a mutable reference. The second of the two should be accepted. Having a mutable reference to immutable data should be well-defined (and undefined only if one actually uses this reference to change the data), because otherwise it is too easy to make an error leading to undefined behavior what is bad for software reliability. --
Jan 26 2019