nim-lang / Nim

Nim is a statically typed compiled systems programming language. It combines successful concepts from mature languages like Python, Ada and Modula. Its design focuses on efficiency, expressiveness, and elegance (in that order of priority).
https://nim-lang.org
Other
16.55k stars 1.47k forks source link

Type missmatch when chaining distinct builtin types with generics #22569

Open Nmerryman opened 1 year ago

Nmerryman commented 1 year ago

Description

When builtin types have generics, chaining distincts causes improper proc resolution. This doesn't work

type
  MyType[T] = seq[T]
  A[T] = distinct MyType[T]
  B[T] = distinct A[T]

proc doThing[T](a: var A[T]) = discard
proc doThing[T](b: var B[T]) = A[T](b).doThing()

var a = B[int].default

doThing(a)

Nim Version

Nim Compiler Version 2.0.0 [Windows: amd64] Compiled at 2023-08-01 Copyright (c) 2006-2023 by Andreas Rumpf

active boot switches: -d:release

Current Output

d:\dump\Git\Finnese\src\isuse.nim(12, 8) template/generic instantiation of `doThing` from here
d:\dump\Git\Finnese\src\isuse.nim(8, 39) Error: type mismatch
Expression: doThing(A[T](b))
  [1] A[T](b): A[system.int]

Expected one of (first mismatch at [position]):
[1] proc doThing[T](a: var A[T])
[1] proc doThing[T](b: var B[T])

Expected Output

None

Possible Solution

No response

Additional Information

Changing the base type to an object works

type
  MyType[T] = object
    a: T
  A[T] = distinct MyType[T]
  B[T] = distinct A[T]

proc doThing[T](a: var A[T]) = discard
proc doThing[T](b: var B[T]) = A[T](b).doThing()

var a = B[int].default

doThing(a)

As does removing the generic parameters and hard coding a type instead.

ci4ic4 commented 1 year ago

I think the same problem demonstrates itself while running 'koch doc': ... ./bin/nim doc --errormax:3 --hint:Conf:off --hint:Path:off --hint:Processing:off --hint:XDeclaredButNotUsed:off --warning:UnusedImport:off -d:boot --putenv:nimversion=2.1.1 -d:nimExperimentalLinenoiseExtra --d:nimPreviewSlimSystem --doc.plausibleAnalytics:nim-lang.org --outdir:web/upload/2.1.1 --index:on pkgs/checksums/src/checksums/sha2.nim

/home/xci/src/Nim/pkgs/checksums/src/checksums/sha2.nim(389, 17) template/generic instantiation of shaUpdate from here /home/xci/src/Nim/pkgs/checksums/src/checksums/sha2.nim(338, 10) template/generic instantiation of shaTransform from here /home/xci/src/Nim/pkgs/checksums/src/checksums/sha2.nim(319, 3) Error: type mismatch Expression: inc ctx.state[0], a

[2] a: CompatUint64 .....

(I just shunt the 'inc' with manual addition in the entire file and the build completes).

juancarlospaco commented 1 year ago

!nim c

type
  MyType[T] = seq[T]
  A[T] = distinct MyType[T]
  B[T] = distinct A[T]
proc doThing[T](a: var A[T]) = discard
proc doThing[T](b: var B[T]) = A[T](b).doThing()
var a = B[int].default
doThing(a)
github-actions[bot] commented 1 year ago

@juancarlospaco (collaborator)

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(8, 8) template/generic instantiation of `doThing` from here
/home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch
Expression: doThing(A[T](b))
  [1] A[T](b): A[system.int]

Expected one of (first mismatch at [position]):
[1] proc doThing[T](a: var A[T])
[1] proc doThing[T](b: var B[T])

Stats

  • Started 2023-09-04T18:58:06
  • Finished 2023-09-04T18:58:06
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
stable :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch Expression: doThing(A[T](b)) [1] A[T](b): A[system.int] Expected one of (first mismatch at [position]): [1] proc doThing[T](a: var A[T]) [1] proc doThing[T](b: var B[T]) ```

Stats

  • Started 2023-09-04T18:58:07
  • Finished 2023-09-04T18:58:07
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
2.0.0 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch Expression: doThing(A[T](b)) [1] A[T](b): A[system.int] Expected one of (first mismatch at [position]): [1] proc doThing[T](a: var A[T]) [1] proc doThing[T](b: var B[T]) ```

Stats

  • Started 2023-09-04T18:58:08
  • Finished 2023-09-04T18:58:08
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
1.6.0 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch: got but expected one of: proc doThing[T](a: var A[T]) first type mismatch at position: 1 required type for a: var A[doThing.T] but expression 'A[T](b)' is immutable, not 'var' proc doThing[T](b: var B[T]) first type mismatch at position: 1 required type for b: var B[doThing.T] but expression 'A[T](b)' is of type: A[system.int] expression: doThing(A[T](b)) ```

Stats

  • Started 2023-09-04T18:58:11
  • Finished 2023-09-04T18:58:11
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
1.4.0 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch: got but expected one of: proc doThing[T](a: var A[T]) first type mismatch at position: 1 required type for a: var A[doThing.T] but expression 'A[T](b)' is immutable, not 'var' proc doThing[T](b: var B[T]) first type mismatch at position: 1 required type for b: var B[doThing.T] but expression 'A[T](b)' is of type: A[system.int] expression: doThing(A[T](b)) ```

Stats

  • Started 2023-09-04T18:58:14
  • Finished 2023-09-04T18:58:15
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
1.2.0 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch: got but expected one of: proc doThing[T](a: var A[T]) first type mismatch at position: 1 required type for a: var A[doThing.T] but expression 'A[T](b)' is immutable, not 'var' proc doThing[T](b: var B[T]) first type mismatch at position: 1 required type for b: var B[doThing.T] but expression 'A[T](b)' is of type: A[system.int] expression: doThing(A[T](b)) ```

Stats

  • Started 2023-09-04T18:58:30
  • Finished 2023-09-04T18:58:30
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
1.0.0 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch: got but expected one of: proc doThing[T](a: var A[T]) first type mismatch at position: 1 required type for a: var A[doThing.T] but expression 'A[T](b)' is immutable, not 'var' proc doThing[T](b: var B[T]) first type mismatch at position: 1 required type for b: var B[doThing.T] but expression 'A[T](b)' is of type: A[system.int] expression: doThing(A[T](b)) ```

Stats

  • Started 2023-09-04T18:58:43
  • Finished 2023-09-04T18:58:43
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
0.20.2 :-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(8, 8) template/generic instantiation of `doThing` from here /home/runner/work/Nim/Nim/temp.nim(6, 39) Error: type mismatch: got but expected one of: proc doThing[T](a: var A[T]) for a 'var' type a variable needs to be passed, but 'A[T](b)' is immutable proc doThing[T](b: var B[T]) for a 'var' type a variable needs to be passed, but 'A[T](b)' is immutable expression: doThing(A[T](b)) ```

Stats

  • Started 2023-09-04T18:58:52
  • Finished 2023-09-04T18:58:52
  • Duration

IR

Compiled filesize 0 bytes (0 bytes) ```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("MyType"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkBracketExpr.newTree( newIdentNode("seq"), newIdentNode("T") ) ), nnkTypeDef.newTree( newIdentNode("A"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("MyType"), newIdentNode("T") ) ) ), nnkTypeDef.newTree( newIdentNode("B"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("a"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("doThing"), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("b"), nnkVarTy.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("T") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkBracketExpr.newTree( newIdentNode("A"), newIdentNode("T") ), newIdentNode("b") ), newIdentNode("doThing") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("B"), newIdentNode("int") ), newIdentNode("default") ) ) ), nnkCall.newTree( newIdentNode("doThing"), newIdentNode("a") ) ) ```
Stats
  • GCC 11.4.0
  • LibC 2.35
  • Valgrind 3.18.1
  • NodeJS 17.1
  • Linux 5.15.0
  • Created 2023-09-04T18:57:16Z
  • Comments 2
  • Commands 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
:robot: Bug found in 50 minutes bisecting 8 commits at 0 commits per second.
metagn commented 1 month ago

It thinks A[T](b) is immutable

Fixing this makes the compiler pick the same destructor for int as seq[int]?