Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Wrong destructors injected for phantom types #24374

Open
darkestpigeon opened this issue Oct 28, 2024 · 1 comment · May be fixed by #24425 or #24411
Open

Wrong destructors injected for phantom types #24374

darkestpigeon opened this issue Oct 28, 2024 · 1 comment · May be fixed by #24425 or #24411

Comments

@darkestpigeon
Copy link

darkestpigeon commented Oct 28, 2024

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

@darkestpigeon darkestpigeon changed the title Incorrect type inference on destructor injection Wrong destructors injected for phantom types Oct 30, 2024
@metagn
Copy link
Collaborator

metagn commented Oct 30, 2024

Related/same #22479

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
2 participants