-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Closed
Description
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
Labels
No labels