immutable bug?

anonymous anonymous at example.com
Sat Jan 11 11:08:49 PST 2014


On Saturday, 11 January 2014 at 18:29:36 UTC, Manu wrote:
> I just managed to assign a const(char)[] to a string... caused 
> crashes when
> the original memory disappeared.
>
> inout(char)[] todstr(inout(char)* cstr) pure nothrow
> {
> return cstr ? cstr[0 .. std.c.string.strlen(cstr)] : cstr[0 .. 
> 0];
> }
>
> struct Data
> {
> char buffer[256] = void;
> @property const(char)[] filename() const pure nothrow { return
> todstr(buffer.ptr); }
> }
>
> struct MyThing
> {
> private this(in Data* p)
> {
> filename = p.filename; // *** Uh oh! assigned a const(char)[] 
> @property to
> a string! ***
> }
>
> string filename;
> }
>
> Surely that assignment shouldn't be legal? Shouldn't I need to 
> idup?

Simplified:

const(char)[] slice(ref const char[1] c) pure nothrow
{
         return c[];
}

void main()
{
         char[1] m = ".";

         immutable i = slice(m); // should not compile
         assert(i == ".");

         m = "!"; // uh-oh
         assert(i == "."); // fails
}


More information about the Digitalmars-d mailing list