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

Type with generic static value can't be used before value type declaration #21482

Open lchenut opened 1 year ago

lchenut commented 1 year ago

Description

type
  PBOption[defaultValue: static[auto]] = object
    some: bool
    value: typeof(defaultValue)

  Type1* = object
    a: PBOption[default(ref Type2)]

  Type2* = object
    a: PBOption[default(ref Type1)]

Nim Version

Nim Compiler Version 1.6.10 [Linux: amd64] Compiled at 2022-11-21 Copyright (c) 2006-2021 by Andreas Rumpf

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

Current Output

/tmp/test.nim(7, 24) template/generic instantiation of `default` from here
/home/lchenut/.choosenim/toolchains/nim-1.6.10/lib/system.nim(982, 17) Error: invalid type: 'Type2' in this context: 'proc (_: typedesc[ref Type2]): ref Type2{.noSideEffect, gcsafe, locks: 0.}' for proc

Expected Output

Compiles

Possible Solution

No response

Additional Information

No response

juancarlospaco commented 1 year ago

!nim c

type
  X[o: static[auto]] = object
    v: typeof(o)
  Y = object
    a: X[default(ref Z)]
  Z = object
    b: X[default(ref Y)]
github-actions[bot] commented 1 year ago

@juancarlospaco (contributor)

devel :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-#devel/lib/system.nim(922, 17) Error: invalid type: 'Z' in this context: 'proc (_: typedesc[ref Z]): ref Z{.noSideEffect, gcsafe.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:37:34
  • Finished 2023-07-07T02:37:35
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
stable :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-1.6.14/lib/system.nim(982, 17) Error: invalid type: 'Z' in this context: 'proc (_: typedesc[ref Z]): ref Z{.noSideEffect, gcsafe, locks: 0.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:37:35
  • Finished 2023-07-07T02:37:35
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
1.6.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-1.6.0/lib/system.nim(982, 17) Error: invalid type: 'Z' in this context: 'proc (_: typedesc[ref Z]): ref Z{.noSideEffect, gcsafe, locks: 0.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:37:38
  • Finished 2023-07-07T02:37:39
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
1.4.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-1.4.0/lib/system.nim(932, 16) Error: invalid type: 'Z' in this context: 'proc (T: type ref Z): ref Z{.noSideEffect.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:37:42
  • Finished 2023-07-07T02:37:42
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
1.2.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-1.2.0/lib/system.nim(914, 16) Error: invalid type: 'Z' in this context: 'proc (T: type ref Z): ref Z{.noSideEffect.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:37:58
  • Finished 2023-07-07T02:37:58
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
1.0.0 :-1: FAIL

Output

Error: Command failed: nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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, 17) template/generic instantiation of `default` from here
/home/runner/.choosenim/toolchains/nim-1.0.0/lib/system.nim(1818, 16) Error: invalid type: 'Z' in this context: 'proc (T: type ref Z): ref Z{.noSideEffect.}' for proc

Stats

  • Created 2023-07-07T02:37:01Z
  • Started 2023-07-07T02:38:11
  • Finished 2023-07-07T02:38:11
  • Duration now
  • Commands nim c --run -d:strip -d:ssl -d:nimDisableCertificateValidation --forceBuild:on --colors:off --threads: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

IR

```cpp ```

AST

```nim nnkStmtList.newTree( nnkTypeSection.newTree( nnkTypeDef.newTree( newIdentNode("X"), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("o"), nnkBracketExpr.newTree( newIdentNode("static"), newIdentNode("auto") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("v"), nnkCall.newTree( newIdentNode("typeof"), newIdentNode("o") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Y"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("a"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Z") ) ) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( newIdentNode("Z"), newEmptyNode(), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( newIdentNode("b"), nnkBracketExpr.newTree( newIdentNode("X"), nnkCall.newTree( newIdentNode("default"), nnkRefTy.newTree( newIdentNode("Y") ) ) ), newEmptyNode() ) ) ) ) ) ) ```
:robot: Bug found in 40 minutes bisecting 6 commits at 0 commits per second.