Open Pylgos opened 1 year ago
Tangentially related: https://github.com/nim-lang/Nim/issues/22445 The type system just does not see a generic body without generic parameters as a different type.
type Obj[T] = object
a: int
Has the same behaviour, but using the generic parameter chooses the right type.
type Obj[T] = object
a: T
!nim c
type Obj[T] = object
proc `=destroy`[T](self: var Obj[T]) =
echo T
block:
let intObj = Obj[int]()
block:
let floatObj = Obj[float]()
@ringabout (member)devel :+1: $\color{green}\textbf{\large OK}$
Output
int
int
2023-08-15T07:49:39
2023-08-15T07:49:40
1 minutes
int
int
2023-08-15T07:49:40
2023-08-15T07:49:41
int
int
2023-08-15T07:49:41
2023-08-15T07:49:42
int
int
2023-08-15T07:49:44
2023-08-15T07:49:45
int
int
2023-08-15T07:49:49
2023-08-15T07:49:49
Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim(5, 24) Error: unresolved generic parameter
2023-08-15T07:50:06
2023-08-15T07:50:06
92.31 Kb (94,528 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T07:50:20
2023-08-15T07:50:20
92.31 Kb (94,528 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T07:50:32
2023-08-15T07:50:32
92.31 Kb (94,528 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 11.4.0
2.35
3.18.1
17.0
5.15.0
2023-08-15T07:48:37Z
2
nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
22 minutes
bisecting 8
commits at 0
commits per second. !nim c
type Obj[T] = object
a: string
proc `=destroy`[T](self: var Obj[T]) =
assert $typeof(T) == self.a
block:
let intObj = Obj[int](a: "int")
block:
let floatObj = Obj[float](a: "float")
@haoyu234 (none)devel :-1: FAIL
Output
Error: Command failed: nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
/home/runner/work/Nim/Nim/temp.nim temp
/home/runner/work/Nim/Nim/temp.nim =destroy
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim failedAssertImpl
/home/runner/.choosenim/toolchains/nim-#devel/lib/std/assertions.nim raiseAssert
/home/runner/.choosenim/toolchains/nim-#devel/lib/system/fatal.nim sysFatal
Error: unhandled exception: /home/runner/work/Nim/Nim/temp.nim(4, 3) `$typeof(T) == self.a` [AssertionDefect]
Error: execution of an external program failed: '/home/runner/work/Nim/Nim/temp'
2023-08-15T08:12:15
2023-08-15T08:12:16
1 minutes
94.34 Kb (96,600 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:17
2023-08-15T08:12:17
92.16 Kb (94,376 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:18
2023-08-15T08:12:19
92.16 Kb (94,376 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:22
2023-08-15T08:12:23
104.09 Kb (106,592 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:27
2023-08-15T08:12:27
96.53 Kb (98,848 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:43
2023-08-15T08:12:43
96.53 Kb (98,848 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:12:57
2023-08-15T08:12:57
96.53 Kb (98,848 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 2023-08-15T08:13:08
2023-08-15T08:13:08
96.53 Kb (98,848 bytes)
```cpp
#define NIM_INTBITS 64
#include "nimbase.h"
#include 11.4.0
2.35
3.18.1
17.0
5.15.0
2023-08-15T08:11:31Z
4
nim c --run -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints:off --warnings:off --lineTrace:off --nimcache:/home/runner/work/Nim/Nim --out:/home/runner/work/Nim/Nim/temp /home/runner/work/Nim/Nim/temp.nim
57 minutes
bisecting 8
commits at 0
commits per second. Also related #21742
Tried fixing that one, but all ideas I've had so far were breaking.
Related: https://discord.com/channels/371759389889003530/768367394547957761/1181972678945550397
Goes away with
type
TMap*[K, V] {.importcpp .} = object
fake: K
Not a regression, it never worked. The bugfix is also WIP and very risky to do so close to a release.
Description
Nim Version
Nim Compiler Version 2.1.1 [Linux: amd64] Compiled at 2023-08-15 Copyright (c) 2006-2023 by Andreas Rumpf
git hash: a660c17d309e2b077c610fd8c8c697944cff676d active boot switches: -d:release
Current Output
Expected Output
Possible Solution
No response
Additional Information
https://github.com/nim-lang/Nim/blob/a660c17d309e2b077c610fd8c8c697944cff676d/compiler/liftdestructors.nim#L1243-L1247 Since the hash values of
Obj[int]
andObj[float]
are the same, it seems that the destructor of the first generatedObj[int]
is used forObj[float]
.This issue is the root cause of https://github.com/nim-lang/Nim/issues/22305.