Broken TLS?

ag0aep6g via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Wed Jul 27 13:54:00 PDT 2016


On 07/27/2016 09:19 PM, Dechcaudron wrote:
> struct Foo
> {
[...]
>
>     void ping() shared
>     {
[...]
>     }
>
>     void fire()
>     {
>         spawn(&explode);
>     }
>
>     void explode() shared
>     {
>         ping();
>     }
> }
>
> void main()
> {
>     auto a = Foo(1, 2);
>     a.fire();
>
>     thread_joinAll();
> }
>
[...]
>
> Is there anything I'm doing wrong? I won't lie, data sharing is the only
> thing about D I don't find quite usable yet. Can anybody help me out on
> this?

I think the program should not compile. You can't call a shared method 
on an unshared struct/class, so you shouldn't be able to take make a 
delegate of it and call that.

Reduced code:

----
struct Foo
{
     void ping() shared {}
}

void main()
{
     Foo a;
     // a.ping(); // rejected
     (&a.ping)(); // accepted
}
----

We can also break immutable/const with this:

----
struct Foo
{
     int x = 0;
     void ping() { x = 1; }
}

void main()
{
     immutable Foo a;
     // a.ping(); // rejected
     (&a.ping)(); // accepted
     assert(a.x == 0); // fails
}
----

Looks pretty bad. There's an open issue on this: 
https://issues.dlang.org/show_bug.cgi?id=16095


More information about the Digitalmars-d-learn mailing list