Nim icon indicating copy to clipboard operation
Nim copied to clipboard

Generic inheritance matching gives `type mismatch` when object has members

Open arnetheduck opened this issue 2 years ago • 2 comments

Description

type
  InternalFutureBase* = object of RootObj

  FutureBase* = ref object of InternalFutureBase

  Future[T] = ref object of FutureBase
    internalValue*: T # Comment to make it work

  B[T, E] = ref object of Future[T]

proc myproc[F: Future](futs: seq[F]) = discard

macro checkFutures*[F: Future](futs: seq[F]) =
  discard

var v: seq[B[void, void]]

myproc(v)
checkFutures(v)

Nim Version

1.6.16, devel

Current Output

/testit.nim(18, 7) Error: type mismatch
Expression: myproc(v)
  [1] v: seq[B[system.void, system.void]]

Expected one of (first mismatch at [position]):
[1] proc myproc[F: Future](futs: seq[F])

Expected Output

No response

Possible Solution

No response

Additional Information

No response

arnetheduck avatar Nov 14 '23 06:11 arnetheduck

!nim c

type
  InternalFutureBase* = object of RootObj

  FutureBase* = ref object of InternalFutureBase

  Future[T] = ref object of FutureBase
    internalValue*: T # Comment to make it work

  B[T, E] = ref object of Future[T]

proc myproc[F: Future](futs: seq[F]) = discard

macro checkFutures*[F: Future](futs: seq[F]) =
  discard

var v: seq[B[void, void]]

myproc(v)
checkFutures(v)

ringabout avatar Nov 16 '23 12:11 ringabout

:penguin: Linux bisect by @ringabout (member)
devel :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch
Expression: myproc(v)
  [1] v: seq[B[system.void, system.void]]

Expected one of (first mismatch at [position]):
[1] proc myproc[F: Future](futs: seq[F])

assertions.nim(34)       raiseAssert
Error: unhandled exception: errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:45
  • Finished 2023-11-16T12:28:45
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
stable :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch
Expression: myproc(v)
  [1] v: seq[B[system.void, system.void]]

Expected one of (first mismatch at [position]):
[1] proc myproc[F: Future](futs: seq[F])

assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:46
  • Finished 2023-11-16T12:28:46
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
2.0.0 :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch
Expression: myproc(v)
  [1] v: seq[B[system.void, system.void]]

Expected one of (first mismatch at [position]):
[1] proc myproc[F: Future](futs: seq[F])

assertions.nim(34)       raiseAssert
Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:46
  • Finished 2023-11-16T12:28:46
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
1.6.14 :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch: got <seq[B[system.void, system.void]]>
but expected one of:
proc myproc[F: Future](futs: seq[F])
  first type mismatch at position: 1
  required type for futs: seq[F: Future]
  but expression 'v' is of type: seq[B[system.void, system.void]]

expression: myproc(v)
fatal.nim(54)            sysFatal
Error: unhandled exception: options.nim(645, 14) `false` errGenerated [AssertionDefect]

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:50
  • Finished 2023-11-16T12:28:51
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
1.4.8 :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch: got <seq[B[system.void, system.void]]>
but expected one of: 
proc myproc[F: Future](futs: seq[F])
  first type mismatch at position: 1
  required type for futs: seq[F: Future]
  but expression 'v' is of type: seq[B[system.void, system.void]]

expression: myproc(v)

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:53
  • Finished 2023-11-16T12:28:53
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
1.2.18 :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch: got <seq[B[system.void, system.void]]>
but expected one of: 
proc myproc[F: Future](futs: seq[F])
  first type mismatch at position: 1
  required type for futs: seq[F: Future]
  but expression 'v' is of type: seq[B[system.void, system.void]]

expression: myproc(v)

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:56
  • Finished 2023-11-16T12:28:56
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
1.0.10 :-1: FAIL

Output

Error: Command failed: nim c --run  -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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(11, 7) Error: type mismatch: got <seq[B[system.void, system.void]]>
but expected one of: 
proc myproc[F: Future](futs: seq[F])
  first type mismatch at position: 1
  required type for futs: seq[F: Future]
  but expression 'v' is of type: seq[B[system.void, system.void]]

expression: myproc(v)

IR

Compiled filesize 0 bytes (0 bytes)

Stats

  • Started 2023-11-16T12:28:59
  • Finished 2023-11-16T12:28:59
  • Duration

AST

nnkStmtList.newTree(
  nnkTypeSection.newTree(
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("InternalFutureBase")
      ),
      newEmptyNode(),
      nnkObjectTy.newTree(
        newEmptyNode(),
        nnkOfInherit.newTree(
          newIdentNode("RootObj")
        ),
        newEmptyNode()
      )
    ),
    nnkTypeDef.newTree(
      nnkPostfix.newTree(
        newIdentNode("*"),
        newIdentNode("FutureBase")
      ),
      newEmptyNode(),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("InternalFutureBase")
          ),
          newEmptyNode()
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("Future"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            newIdentNode("FutureBase")
          ),
          nnkRecList.newTree(
            nnkIdentDefs.newTree(
              nnkPostfix.newTree(
                newIdentNode("*"),
                newIdentNode("internalValue")
              ),
              newIdentNode("T"),
              newEmptyNode()
            )
          )
        )
      )
    ),
    nnkTypeDef.newTree(
      newIdentNode("B"),
      nnkGenericParams.newTree(
        nnkIdentDefs.newTree(
          newIdentNode("T"),
          newIdentNode("E"),
          newEmptyNode(),
          newEmptyNode()
        )
      ),
      nnkRefTy.newTree(
        nnkObjectTy.newTree(
          newEmptyNode(),
          nnkOfInherit.newTree(
            nnkBracketExpr.newTree(
              newIdentNode("Future"),
              newIdentNode("T")
            )
          ),
          newEmptyNode()
        )
      )
    )
  ),
  nnkProcDef.newTree(
    newIdentNode("myproc"),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkMacroDef.newTree(
    nnkPostfix.newTree(
      newIdentNode("*"),
      newIdentNode("checkFutures")
    ),
    newEmptyNode(),
    nnkGenericParams.newTree(
      nnkIdentDefs.newTree(
        newIdentNode("F"),
        newIdentNode("Future"),
        newEmptyNode()
      )
    ),
    nnkFormalParams.newTree(
      newEmptyNode(),
      nnkIdentDefs.newTree(
        newIdentNode("futs"),
        nnkBracketExpr.newTree(
          newIdentNode("seq"),
          newIdentNode("F")
        ),
        newEmptyNode()
      )
    ),
    newEmptyNode(),
    newEmptyNode(),
    nnkStmtList.newTree(
      nnkDiscardStmt.newTree(
        newEmptyNode()
      )
    )
  ),
  nnkVarSection.newTree(
    nnkIdentDefs.newTree(
      newIdentNode("v"),
      nnkBracketExpr.newTree(
        newIdentNode("seq"),
        nnkBracketExpr.newTree(
          newIdentNode("B"),
          newIdentNode("void"),
          newIdentNode("void")
        )
      ),
      newEmptyNode()
    )
  ),
  nnkCall.newTree(
    newIdentNode("myproc"),
    newIdentNode("v")
  ),
  nnkCall.newTree(
    newIdentNode("checkFutures"),
    newIdentNode("v")
  )
)
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 18.2
  • Created 2023-11-16T12:28:10Z
  • Comments 1
  • Commands nim c --run -d:nimDebug -d:nimDebugDlOpen -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --verbosity:0 --hints: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 17 minutes bisecting 7 commits at 0 commits per second

github-actions[bot] avatar Nov 16 '23 12:11 github-actions[bot]