Postblit bug

IgorStepanov via Digitalmars-d digitalmars-d at puremagic.com
Thu Oct 16 18:30:51 PDT 2014


On Friday, 17 October 2014 at 00:55:25 UTC, ketmar via 
Digitalmars-d wrote:
> On Fri, 17 Oct 2014 00:42:24 +0000
> IgorStepanov via Digitalmars-d <digitalmars-d at puremagic.com> 
> wrote:
>
>> Can someone comment this code? Should I think that it's a bug.
> it's just an anomaly. const postblit can do alot of things 
> besides
> adjusting struct fields, and it's logical that compiler cannot 
> call
> non-const methods for const objects.
>
> yet it's still on of those "unforseen consequences" that arises 
> from
> conjunction of different features.
>
> i don't think that it's a bug, but i think that this must be 
> discussed
> anyway, and then documented.

I think, this is unexpected behaviour:

Compiler generates "__fieldPostBlit" for all structs, and call it 
when postblit is needed.

In this example compiler generates something like the next code:

struct A
{
     this(this)
     {
     }
}

struct B
{
     A a;

     void __fieldPostBlit()
     {
         a.__postblit(); //a has an explicit postblit
     }
}


struct C
{
     const B b;
     void __fieldPostBlit()
     {
         b.__fieldPostBlit(); //Error: b is const
     }
}

void main()
{
     C c;
     C c2 = c; //=>
               //memcpy(&c2, &c, C.sizeof)
               //c2.__fieldPostBlit();

}


However, __postblit and __fieldPostBlit are always called for new 
object, thus it can neglect const guarantee and generate 
postblits like:
void __fieldPostBlit()
{
      (cast()b).__fieldPostBlit();
}


More information about the Digitalmars-d mailing list