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

Segmentation fault upon compilation with recursive typeclass definitions #23910

Open tersec opened 1 month ago

tersec commented 1 month ago

Description

Simple version:

type
  A = A | B
  B = A | B
discard 0 is A

But it scales to where it's nontrivial to spot the cycles on observation, even with all the typeclasses right there:

type
  A = K | C
  B = J | A
  C = H | R
  D = T | S
  E = W | O
  F = M | S
  G = X | B
  H = P | Q
  I = W | G
  J = I | E
  K = U | O
  L = X | D
  M = B | N
  N = R | L
  O = L | Q
  P = V | F
  Q = A | N
  R = H | E
  S = J | M
  T = I | P
  U = F | T
  V = D | C
  W = K | G
  X = V | U
discard 0 is M

Adding concrete terminal types doesn't work around it:

type
  S = A | C
  N = W | F
  L = object
  C = object
  E = V | K
  X = Y | M
  W = object
  P = object
  V = B | H
  F = object
  B = U | E
  D = S | J
  M = object
  A = object
  H = object
  U = X | D
  Y = L | T
  J = object
  T = object
  K = N | P
discard 0 is E

Nim Version

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

git hash: 92e505577e8b6b9214b6fcdd7fe1b0e9a244023b
active boot switches: -d:release
Nim Compiler Version 2.1.9 [Linux: amd64]
Compiled at 2024-08-01
Copyright (c) 2006-2024 by Andreas Rumpf

git hash: cb156648d69fd0c21ee5d041a98ddc69294eaa96
active boot switches: -d:release

Current Output

.....................................................................Segmentation fault

Expected Output

No Segmentation fault

Possible Solution

No response

Additional Information

No response

juancarlospaco commented 1 month ago

!nim c

type
  A = A | B
  B = A | B
discard 0 is A
github-actions[bot] commented 1 month 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 ```

IR

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

Stats

  • Started 2024-08-01T10:28:50
  • Finished 2024-08-01T10:28:51
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:28:54
  • Finished 2024-08-01T10:28:55
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:28:57
  • Finished 2024-08-01T10:28:58
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:29:01
  • Finished 2024-08-01T10:29:01
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:29:04
  • Finished 2024-08-01T10:29:04
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:29:07
  • Finished 2024-08-01T10:29:07
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:29:09
  • Finished 2024-08-01T10:29:09
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
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 ```

IR

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

Stats

  • Started 2024-08-01T10:29:12
  • Finished 2024-08-01T10:29:12
  • Duration

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("A"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ), nnkTypeDef.newTree( newIdentNode("B"), newEmptyNode(), nnkInfix.newTree( newIdentNode("|"), newIdentNode("A"), newIdentNode("B") ) ) ), nnkDiscardStmt.newTree( nnkInfix.newTree( newIdentNode("is"), newLit(0), newIdentNode("A") ) ) ) ```
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.4
  • Created 2024-08-01T10:28:24Z
  • 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 25 minutes bisecting 8 commits at 0 commits per second