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

`Error: internal error: proc has no result symbol` #21476

Open tersec opened 1 year ago

tersec commented 1 year ago

Description

proc y(n: ref int) = discard

proc w(n: ref int) =
  iterator a(): int = y(n)
  let x = a

w(nil)

Nim Version

Nim Compiler Version 1.6.10 [Linux: amd64]
Compiled at 2023-02-12
Copyright (c) 2006-2021 by Andreas Rumpf

active boot switches: -d:release
Nim Compiler Version 1.9.1 [Linux: amd64]
Compiled at 2023-03-05
Copyright (c) 2006-2023 by Andreas Rumpf

git hash: 7bde421e4dae1f078ad5940dda8199df00b725cc
active boot switches: -d:release

Current Output

Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details

### Expected Output

```text
No ICE

Possible Solution

No response

Additional Information

No response

ringabout commented 1 year ago

Workaround: explicitly mark the iterator "closure"

proc y(n: ref int) = discard

proc w(n: ref int) =
  iterator a(): int {.closure.} = y(n)
  let x = a

w(nil)

According to https://nim-lang.github.io/Nim/manual.html#iterators-and-the-for-statement-firstminusclass-iterators

Iterators that are neither marked {.closure.} nor {.inline.} explicitly default to being inline, but this may change in future versions of the implementation.

It causes problems without marking.

tersec commented 1 year ago

It causes problems without marking.

"Problems" should not be "ICEs".

juancarlospaco commented 1 year ago

!nim c

proc y(n: ref int) = discard
proc w(n: ref int) =
  iterator a(): int = y(n)
  let x = a
w(nil)
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:03:26
  • Finished 2023-07-07T11:03:26
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:03:27
  • Finished 2023-07-07T11:03:27
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:03:30
  • Finished 2023-07-07T11:03:30
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with './koch temp c <file>', see https://nim-lang.github.io/Nim/intern.html#debugging-the-compiler for details

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:03:32
  • Finished 2023-07-07T11:03:33
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with ./koch temp c <file>

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:03:48
  • Finished 2023-07-07T11:03:48
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
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(3, 12) Error: internal error: proc has no result symbol
No stack traceback available
To create a stacktrace, rerun compilation with ./koch temp c <file>

Stats

  • Created 2023-07-07T11:02:55Z
  • Started 2023-07-07T11:04:01
  • Finished 2023-07-07T11:04:01
  • 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( nnkProcDef.newTree( newIdentNode("y"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("w"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode(), nnkIdentDefs.newTree( newIdentNode("n"), nnkRefTy.newTree( newIdentNode("int") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkIteratorDef.newTree( newIdentNode("a"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int") ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkCall.newTree( newIdentNode("y"), newIdentNode("n") ) ) ), nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("x"), newEmptyNode(), newIdentNode("a") ) ) ) ), nnkCall.newTree( newIdentNode("w"), newNilLit() ) ) ```
:robot: Bug found in 39 minutes bisecting 6 commits at 0 commits per second.
haoyu234 commented 4 months ago

I'm having the same issue.

https://play.nim-lang.org/#pasty=wUGGuJiKqNEZ

type
  Style* = ref object

type
  WidthStyleProp* = distinct int

proc applyStyleProp*(self: WidthStyleProp, style: Style) =
  echo 111

type
  BaseStyleProp* = ref BaseStylePropObj
  BaseStylePropObj* = object of RootObj

  StyleProp*[T] = ref object of BaseStylePropObj
    styleCtx: T

  AsStyleProp* = concept
    proc applyStyleProp(self: Self, style: Style)

static:
  echo WidthStyleProp is AsStyleProp

# Error: internal error: proc has no result symbol
converter asStyleProp[T: AsStyleProp](styleCtx: T): BaseStyleProp =
  result = BaseStyleProp(StyleProp[T](
    styleCtx: styleCtx,
  ))

# to the common type
proc styles*(styleProps: varargs[BaseStyleProp]): seq[BaseStyleProp] =
  result.add(styleProps)

discard styles(WidthStyleProp(1))
shirleyquirk commented 3 months ago

related: https://forum.nim-lang.org/t/11514

borrowing an iterator causes the same error message

type A = distinct array[4, uint8]

let a: A = cast[A]([uint8 0, 0, 1, 1])

iterator items(a: A): uint8 {.borrow.}

for b in a:
  echo b