Skip to content

Wrong destructors injected for phantom types #24374

@darkestpigeon

Description

@darkestpigeon

Description

Destructors of wrong type are injected for phantom types (with generic parameters that don't appear in the type's fields).

Here is a toy example:

type Phantom[T] = object
  value: int
  # markerField: T

proc initPhantom[T](value: int): Phantom[T] =
  doAssert value >= 0
  echo "created " & $Phantom[T] & " with value " & $value
  result = Phantom[T](value: value)

proc `=wasMoved`[T](x: var Phantom[T]) =
  x.value = -1

proc `=destroy`[T](x: Phantom[T]) =
  if x.value >= 0:
    echo "destroyed " & $Phantom[T] & " with value " & $x.value


let
  x = initPhantom[float](1)
  y = initPhantom[string](2)
  z = initPhantom[byte](3)

Nim Version

Nim Compiler Version 2.2.0 [Linux: amd64]
Compiled at 2024-10-02
Copyright (c) 2006-2024 by Andreas Rumpf

git hash: 78983f1876726a49c69d65629ab433ea1310ece1
active boot switches: -d:release
Nim Compiler Version 2.2.1 [Linux: amd64]
Compiled at 2024-10-27
Copyright (c) 2006-2024 by Andreas Rumpf

git hash: 24aa92c14f2301d1ef63f59bc4ae2ec31a64f9c5
active boot switches: -d:release

Current Output

created Phantom[system.float] with value 1
created Phantom[system.string] with value 2
created Phantom[system.byte] with value 3
destroyed Phantom[system.float] with value 3
destroyed Phantom[system.float] with value 2
destroyed Phantom[system.float] with value 1

Expected Output

created Phantom[system.float] with value 1
created Phantom[system.string] with value 2
created Phantom[system.byte] with value 3
destroyed Phantom[system.byte] with value 3
destroyed Phantom[system.string] with value 2
destroyed Phantom[system.float] with value 1

Known Workarounds

The problem disappears if the field markerField: T is uncommented.

Additional Information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions