const(int) cannot be sent as int message

Steven Schveighoffer via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Thu Mar 31 06:47:25 PDT 2016


On 3/30/16 8:01 PM, Ali Çehreli wrote:
> As expected, the following trivial case works:
>
> void main() {
>      auto func = delegate(int i) {};  // expects int
>
>      func(const(int)(42));            // passes const(int)
> }
>
>
> The following concurrency program fails at runtime:
>
> import core.thread;
> import std.concurrency;
>
> void foo() {
>      receiveOnly!int();            // expects int
> }
>
> void main() {
>      auto worker = spawn(&foo);
>
>      // Sends const(int)
>      worker.send(const(int)(42));  // sends const(int)
>
>      thread_joinAll;
> }
>
> std.concurrency.MessageMismatch at std/concurrency.d(224): Unexpected
> message type: expected 'int', got 'const(int)'
>
>
> Feature or bug? (receive() is worse because as it simply ignores the
> message.)

Bug, but probably of the enhancement variety I think (I don't think this 
is a small project). Receive should canonicalize the input and requested 
receive type. That is, receiveOnly!(const(int)) should really call 
receiveOnly!int, and send!(const(int)) should really call send!int.

Generous usage of Unqual should be done here.

-Steve


More information about the Digitalmars-d-learn mailing list