Skip to content

Channels do not deep copy with gc:orc contrary to the docs #24856

Open
@yglukhov

Description

@yglukhov

Nim Version

Nim Compiler Version 2.3.1 [Linux: amd64]
Compiled at 2025-04-09
Copyright (c) 2006-2025 by Andreas Rumpf

git hash: 29a2e25
active boot switches: -d:release

Description

type
  Msg = object
    content: Content
  Content = ref object
    value: int

var chan: Channel[Msg]

var contentAddress: int

# This proc will be run in another thread using the threads module.
proc firstWorker() =
  let content = Content(value: 5)
  contentAddress = cast[int](content)
  echo "Sending content: ", contentAddress
  chan.send(Msg(content: content))

# Initialize the channel.
chan.open()

# Launch the worker.
var worker1: Thread[void]
createThread(worker1, firstWorker)

# Block until the message arrives, then print it out.
let c = chan.recv()
echo "Received content: ", cast[int](c.content)
doAssert(contentAddress != cast[int](c.content)) # FAILS HERE!!!

# Wait for the thread to exit
worker1.joinThread()

Current Output

Sending content: 139901182169160
Received content: 139901182169160
/home/y/proj/test/tests/test2.nim(160) test2
/home/y/proj/nim-devel/lib/std/assertions.nim(41) failedAssertImpl
/home/y/proj/nim-devel/lib/std/assertions.nim(36) raiseAssert
/home/y/proj/nim-devel/lib/system/fatal.nim(53) sysFatal
Error: unhandled exception: /home/y/proj/test/tests/test2.nim(160, 9) `contentAddress != cast[int](c.content)`  [AssertionDefect]

Expected Output

No assertsion failure

Known Workarounds

No response

Additional Information

Behaves correctly with --gc:refc

Metadata

Metadata

Assignees

No one assigned

    Labels

    DocumentationRelated to documentation content (not generation).

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions