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.48k stars 1.47k forks source link

Parameterless Conversions and Upcasting Are Broken #23648

Open Luyten-Orion opened 4 months ago

Luyten-Orion commented 4 months ago

Description

Heya, just making an issue here since it seems like Nim's parameterless conversions for type definitions is broken, as shown in this minimal reproduction from Beef:

type
  Base[T] = object
    val: T
  MyObject[T] = distinct Base[T]

var a = Base MyObject[int].default()

However the following code does work:

type MyObject[T] = distinct seq[T]
var a = MyObject @[10, 20, 30]

Upcasting also seems to be broken as shown by this snippet here:

type MyObject[T] = distinct seq[T]
var a = seq MyObject[int].default()

Nim Version

Nim Compiler Version 2.0.4 [Linux: amd64] Compiled at 2024-04-22 Copyright (c) 2006-2023 by Andreas Rumpf

git hash: 57ad8911c74829ba9f33f66f3ad29283cf45b3b7 active boot switches: -d:release

Current Output

/home/chronos/Projects/Napkins/a/test.nim(28, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass'
/home/chronos/Projects/Napkins/a/test.nim(24, 26) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'seq'

Expected Output

No response

Possible Solution

Unfortunately I don't know enough about the internals in order to be able to propose a solution.

Additional Information

No response

juancarlospaco commented 4 months ago

!nim c

type
  Base[T] = object
    val: T
  MyObject[T] = distinct Base[T]

var a = Base MyObject[int].default()
github-actions[bot] commented 4 months ago
:penguin: Linux bisect by @juancarlospaco (collaborator)
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(5, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass' assertions.nim(34) raiseAssert Error: unhandled exception: errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-05-30T13:42:35
  • Finished 2024-05-30T13:42:35
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
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(5, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass' assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-05-30T13:42:35
  • Finished 2024-05-30T13:42:36
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
2.0.4 :-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(5, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass' assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(681, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-05-30T13:42:36
  • Finished 2024-05-30T13:42:36
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
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(5, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass' assertions.nim(34) raiseAssert Error: unhandled exception: options.nim(664, 5) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-05-30T13:42:39
  • Finished 2024-05-30T13:42:39
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
1.6.20 :-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(5, 27) Error: type mismatch: got 'MyObject[system.int]' for 'default(MyObject[int])' but expected 'Base = CompositeTypeClass' fatal.nim(54) sysFatal Error: unhandled exception: options.nim(662, 14) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-05-30T13:42:43
  • Finished 2024-05-30T13:42:43
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
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(5, 27) Error: type mismatch: got but expected 'Base = CompositeTypeClass' ```

IR

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

Stats

  • Started 2024-05-30T13:42:45
  • Finished 2024-05-30T13:42:45
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
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(5, 27) Error: type mismatch: got but expected 'Base = CompositeTypeClass' ```

IR

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

Stats

  • Started 2024-05-30T13:42:48
  • Finished 2024-05-30T13:42:48
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
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(5, 27) Error: type mismatch: got but expected 'Base = CompositeTypeClass' ```

IR

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

Stats

  • Started 2024-05-30T13:42:50
  • Finished 2024-05-30T13:42:50
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("Base"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("val"), newIdentNode("T"), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("MyObject"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("T"), newEmptyNode(), newEmptyNode() ) ), nnkDistinctTy.newTree( nnkBracketExpr.newTree( newIdentNode("Base"), newIdentNode("T") ) ) ) ), nnkVarSection.newTree( nnkIdentDefs.newTree( newIdentNode("a"), newEmptyNode(), nnkCommand.newTree( newIdentNode("Base"), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("MyObject"), newIdentNode("int") ), newIdentNode("default") ) ) ) ) ) ) ```
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.3
  • Created 2024-05-30T13:42:07Z
  • 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 19 minutes bisecting 8 commits at 0 commits per second

juancarlospaco commented 4 months ago

Same error from 1.0 to devel.