On 05/12/11 17:51, Jacob Carlborg wrote:
On 2011-12-04 21:46, Andrew Wiley wrote:
On Sun, Dec 4, 2011 at 1:42 AM, Jonathan M Davis<jmdavisp...@gmx.com> wrote:
On Sunday, December 04, 2011 01:24:02 Andrew Wiley wrote:
This should work, right? I'm not just going crazy or something?

import std.concurrency;
import std.stdio;

class Bob {
}

void main() {
     auto tid = spawn(&b);
     tid.send(new immutable(Bob)());
}

void b() {
     receive(
         (immutable(Bob) b) {
             writeln("got it");
         }
     );
}


I'm getting this from both GDC (trunk) and DMD (2.056 and trunk - I
can't seem to get 2.055 to run):
core.exception.AssertError@/usr/include/d/std/variant.d(286): immutable(Bob)

Seems like some type conversion isn't working properly and variant is
flagging immutable types as not assignable?

Well, that particular assertion seems to be because of the immutability. It
seems that Variant can't handle it - the comment with it being

// type is not assignable

But I'd have to go digging to see why on earth this is failing (and that's assuming that it's not a compiler bug, since then it would be completely out
of my league). It _looks_ like it should work.

- Jonathan M Davis

Actually, it looks like I am going crazy. I went back to dmd 2.052
(and every version in between), and this doesn't seem to have ever
worked.
However, not allowing message passing with immutable messages
eliminates one of the main use cases for immutable. I'll see if I can
find a workaround.

The actual issue is that once Variant finds a matching type, it tries
to assign `immutable(Bob) = immutable(Bob)` , which is illegal.
However, all it needs to do is assign a *reference* to an immutable
object. Unfortunately, we don't support that.
Incidentally, this makes a compelling argument for something like
immutable(Object) ref.

Have message passing ever worked for other than primitive types (including strings) ?

I always use arrays or structs. Until the tail-const thing (or something like it) happens, classes don't seem to be viable in messages between threads.

--
Graham St Jack

Reply via email to