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