const(X) member of Y

Maxim Fomin maxim at maxim-fomin.ru
Wed Feb 6 12:30:38 PST 2013


On Wednesday, 6 February 2013 at 18:15:53 UTC, Dan wrote:
>
> This workaround succeeds, but, based on this thread 
> (http://forum.dlang.org/thread/ywispsasaylqscyuayae@forum.dlang.org) 
> I don't know if it is a bug or not. If it is not a bug, I would 
> doubt it is the prescribed approach for doing this?
>
> Thanks,
> Dan

Huh, ability to call non-const postblit from const __postblit is 
actually a general problem of a major type system breakage:

import std.stdio;

struct S
{
     int i;
     void bar()
     {
         ++i;
     }
     void foo() immutable
     {
         //#1
         //bar(); //error
         //(&bar)(); //works, lang hole

         //#2
         void delegate() dg1 = &bar; //works, lang hole
         //dg1(); //

         //#3
         void delegate() dg2;
         //dg.ptr = this; //error
         dg2.ptr = cast(void*)&this;
         //dg.funcptr = &S.bar; //error
         dg2.funcptr = cast(void function())&S.bar;
         dg2(); //works due to cast
     }
}

void main()
{
     immutable S s;
     writeln(s.i);
     s.foo();
     writeln(s.i);
}

The fact that bar() does not work and (&bar)() works is terrific. 
Also, if dg1 call is uncommented, dmd wrongly generates 
instruction which leads to segfault.


More information about the Digitalmars-d mailing list