[Issue 19763] Cannot construct immutable struct from pure mutable struct

d-bugmail at puremagic.com d-bugmail at puremagic.com
Tue Mar 26 12:40:26 UTC 2019


https://issues.dlang.org/show_bug.cgi?id=19763

ag0aep6g <ag0aep6g at gmail.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ag0aep6g at gmail.com

--- Comment #1 from ag0aep6g <ag0aep6g at gmail.com> ---
(In reply to Jacob Carlborg from comment #0)
> The following example fails to compile:
> 
> struct Foo
> {
>     const(char)* filename;
>     this(const(char)*) pure { }
> }
> 
> void main()
> {
>     immutable a = Foo(null);
> }
> 
> Error:

I think it's correct that this is rejected.

The compiler could maybe realize that `null` poses no threat, or that the
constructor doesn't actually set `filename`, but it's obviously not that smart.

Generally, code like this must be rejected, because `main` still has access to
the pointer that's passed to the constructor:

----
struct Foo
{
    const(char)* filename;
    this(const(char)* f) pure { filename = f; }
}
void main()
{
    char* p = new char;
    immutable a = Foo(p);
    *p = '!'; /* would mutate a.filename which is supposed to be immutable */
}
----


> But this code compiles:
> 
> struct Foo
> {
>     const(char)* filename;
>     this(const(char)*) pure { }
> }
> 
> Foo newFoo() pure
> {
>     return Foo(null);
> }
> 
> void main()
> {
>     immutable a = newFoo();
> }

This is ok, because newFoo is `pure` and it immediately returns the constructed
Foo. So it's guaranteed that the only mutable reference to the data ceases to
exist right as the immutable one is created.


> Also if "const(char)* filename" is changed to "char* filename" the first
> example compiles.

The constructor cannot possibly use the const(char)* parameter to set the char*
field. So there is no way that the constructed Foo can refer to mutable data.

If you make the parameter mutable, too, then the code will be rejected again.

As far as I can tell, there's no bug here.

--


More information about the Digitalmars-d-bugs mailing list