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

Identifier expected or compiler segfault with templates over generic type in type section #23854

Closed mratsim closed 2 weeks ago

mratsim commented 1 month ago

A slight modification to #23853, depending if we use method call syntax or function call syntax we get either identifier expected or a compiler segfault on uninitialized value

import std/bitops

const WordBitWidth = sizeof(pointer) * 8

func wordsRequired*(bits: int): int {.inline.} =
  const divShiftor = fastLog2(uint32(WordBitWidth))
  result = (bits + WordBitWidth - 1) shr divShiftor

type
  Algebra* = enum
    BLS12_381

  BigInt*[bits: static int] = object
    limbs*: array[wordsRequired(bits), uint]

  Fr*[Name: static Algebra] = object
    residue_form*: BigInt[255]

  Fp*[Name: static Algebra] = object
    residue_form*: BigInt[381]

  FF*[Name: static Algebra] = Fp[Name] or Fr[Name]

type
  EC_ShortW_Aff*[F] = object
    ## Elliptic curve point for a curve in Short Weierstrass form
    ##   y² = x³ + a x + b
    ##
    ## over a field F
    x*, y*: F

type FieldKind* = enum
  kBaseField
  kScalarField

template getBigInt*[Name: static Algebra](T: type FF[Name]): untyped =
  ## Get the underlying BigInt type.
  typeof(default(T).mres)

func bits*[Name: static Algebra](T: type FF[Name]): static int =
  T.getBigInt().bits

template getScalarField*(EC: type EC_ShortW_Aff): untyped =
  Fr[EC.F.Name]

# ------------------------------------------------------------------------------

type
  ECFFT_Descriptor*[EC] = object
    ## Metadata for FFT on Elliptic Curve
    order*: int
    # rootsOfUnity*: ptr UncheckedArray[BigInt[EC.getScalarField().bits()]]  # Error: in expression 'EC.getScalarField()': identifier expected, but found 'EC.getScalarField'
    rootsOfUnity*: ptr UncheckedArray[BigInt[getScalarField(EC).bits()]] # Compiler SIGSEGV: Illegal Storage Access

func new*(T: type ECFFT_Descriptor): T =
  discard

# ------------------------------------------------------------------------------

proc main() =
  let ctx = ECFFT_Descriptor[EC_ShortW_Aff[Fp[BLS12_381]]].new()

main()
mratsim commented 1 month ago

Notice that if not in an UncheckedArray or a seq, the following compiles

import std/bitops

const WordBitWidth = sizeof(pointer) * 8

func wordsRequired*(bits: int): int {.inline.} =
  const divShiftor = fastLog2(uint32(WordBitWidth))
  result = (bits + WordBitWidth - 1) shr divShiftor

type
  Algebra* = enum
    BLS12_381

  BigInt*[bits: static int] = object
    limbs*: array[wordsRequired(bits), uint]

  Fr*[Name: static Algebra] = object
    residue_form*: BigInt[255]

  Fp*[Name: static Algebra] = object
    residue_form*: BigInt[381]

  FF*[Name: static Algebra] = Fp[Name] or Fr[Name]

type
  EC_ShortW_Aff*[F] = object
    ## Elliptic curve point for a curve in Short Weierstrass form
    ##   y² = x³ + a x + b
    ##
    ## over a field F
    x*, y*: F

template getScalarField*(EC: type EC_ShortW_Aff): untyped =
  Fr[EC.F.Name]

# ------------------------------------------------------------------------------

type IpaProof*[logN: static int, EC] = object
  L*{.align: 64.}: array[logN, EC]
  R*{.align: 64.}: array[logN, EC]
  a0*: getScalarField(EC)          # compiles
  # a0*: EC.getScalarField()        #  Error: in expression 'EC.getScalarField()': identifier expected, but found 'EC.getScalarField'

func new*(T: type IpaProof): T =
  discard

# ------------------------------------------------------------------------------

proc main() =
  let proof = IpaProof[8, EC_ShortW_Aff[Fp[BLS12_381]]].new()

main()
juancarlospaco commented 1 month ago

!nim c

import std/bitops

const WordBitWidth = sizeof(pointer) * 8

func wordsRequired*(bits: int): int {.inline.} =
  const divShiftor = fastLog2(uint32(WordBitWidth))
  result = (bits + WordBitWidth - 1) shr divShiftor

type
  Algebra* = enum
    BLS12_381

  BigInt*[bits: static int] = object
    limbs*: array[wordsRequired(bits), uint]

  Fr*[Name: static Algebra] = object
    residue_form*: BigInt[255]

  Fp*[Name: static Algebra] = object
    residue_form*: BigInt[381]

  FF*[Name: static Algebra] = Fp[Name] or Fr[Name]

type
  EC_ShortW_Aff*[F] = object
    ## Elliptic curve point for a curve in Short Weierstrass form
    ##   y² = x³ + a x + b
    ##
    ## over a field F
    x*, y*: F

type FieldKind* = enum
  kBaseField
  kScalarField

template getBigInt*[Name: static Algebra](T: type FF[Name]): untyped =
  ## Get the underlying BigInt type.
  typeof(default(T).mres)

func bits*[Name: static Algebra](T: type FF[Name]): static int =
  T.getBigInt().bits

template getScalarField*(EC: type EC_ShortW_Aff): untyped =
  Fr[EC.F.Name]

# ------------------------------------------------------------------------------

type
  ECFFT_Descriptor*[EC] = object
    ## Metadata for FFT on Elliptic Curve
    order*: int
    # rootsOfUnity*: ptr UncheckedArray[BigInt[EC.getScalarField().bits()]]  # Error: in expression 'EC.getScalarField()': identifier expected, but found 'EC.getScalarField'
    rootsOfUnity*: ptr UncheckedArray[BigInt[getScalarField(EC).bits()]] # Compiler SIGSEGV: Illegal Storage Access

func new*(T: type ECFFT_Descriptor): T =
  discard

# ------------------------------------------------------------------------------

proc main() =
  let ctx = ECFFT_Descriptor[EC_ShortW_Aff[Fp[BLS12_381]]].new()

main()
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 SIGSEGV: Illegal storage access. (Attempt to read from nil?) ```

IR

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

Stats

  • Started 2024-07-18T13:01:38
  • Finished 2024-07-18T13:01:38
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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 SIGSEGV: Illegal storage access. (Attempt to read from nil?) ```

IR

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

Stats

  • Started 2024-07-18T13:01:42
  • Finished 2024-07-18T13:01:42
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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 SIGSEGV: Illegal storage access. (Attempt to read from nil?) ```

IR

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

Stats

  • Started 2024-07-18T13:01:45
  • Finished 2024-07-18T13:01:45
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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 SIGSEGV: Illegal storage access. (Attempt to read from nil?) ```

IR

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

Stats

  • Started 2024-07-18T13:01:48
  • Finished 2024-07-18T13:01:49
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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(39, 60) Error: type mismatch: got but expected one of: template getScalarField(EC: type EC_ShortW_Aff): untyped first type mismatch at position: 1 required type for EC: typedesc[EC_ShortW_Aff] but expression 'EC' is of type: typedesc[EC] expression: getScalarField(EC) fatal.nim(54) sysFatal Error: unhandled exception: options.nim(662, 14) `false` errGenerated [AssertionDefect] ```

IR

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

Stats

  • Started 2024-07-18T13:01:52
  • Finished 2024-07-18T13:01:52
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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(39, 60) Error: type mismatch: got but expected one of: template getScalarField(EC: type EC_ShortW_Aff): untyped first type mismatch at position: 1 required type for EC: type EC_ShortW_Aff but expression 'EC' is of type: type EC expression: getScalarField(EC) ```

IR

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

Stats

  • Started 2024-07-18T13:01:55
  • Finished 2024-07-18T13:01:55
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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(39, 60) Error: type mismatch: got but expected one of: template getScalarField(EC: type EC_ShortW_Aff): untyped first type mismatch at position: 1 required type for EC: type EC_ShortW_Aff but expression 'EC' is of type: type EC expression: getScalarField(EC) ```

IR

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

Stats

  • Started 2024-07-18T13:01:57
  • Finished 2024-07-18T13:01:57
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
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(39, 60) Error: type mismatch: got but expected one of: template getScalarField(EC: type EC_ShortW_Aff): untyped first type mismatch at position: 1 required type for EC: type EC_ShortW_Aff but expression 'EC' is of type: type EC expression: getScalarField(EC) ```

IR

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

Stats

  • Started 2024-07-18T13:01:59
  • Finished 2024-07-18T13:02:00
  • Duration

AST

```nim nnkStmtList.newTree( nnkImportStmt.newTree( nnkInfix.newTree( newIdentNode("/"), newIdentNode("std"), newIdentNode("bitops") ) ), nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("WordBitWidth"), newEmptyNode(), nnkInfix.newTree( newIdentNode("*"), nnkCall.newTree( newIdentNode("sizeof"), newIdentNode("pointer") ), newLit(8) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("wordsRequired") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("int"), nnkIdentDefs.newTree( newIdentNode("bits"), newIdentNode("int"), newEmptyNode() ) ), nnkPragma.newTree( newIdentNode("inline") ), newEmptyNode(), nnkStmtList.newTree( nnkConstSection.newTree( nnkConstDef.newTree( newIdentNode("divShiftor"), newEmptyNode(), nnkCall.newTree( newIdentNode("fastLog2"), nnkCall.newTree( newIdentNode("uint32"), newIdentNode("WordBitWidth") ) ) ) ), nnkAsgn.newTree( newIdentNode("result"), nnkInfix.newTree( newIdentNode("shr"), nnkPar.newTree( nnkInfix.newTree( newIdentNode("-"), nnkInfix.newTree( newIdentNode("+"), newIdentNode("bits"), newIdentNode("WordBitWidth") ), newLit(1) ) ), newIdentNode("divShiftor") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Algebra") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("BLS12_381") ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("BigInt") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("bits"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("limbs") ), nnkBracketExpr.newTree( newIdentNode("array"), nnkCall.newTree( newIdentNode("wordsRequired"), newIdentNode("bits") ), newIdentNode("uint") ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fr") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(255) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("Fp") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("residue_form") ), nnkBracketExpr.newTree( newIdentNode("BigInt"), newLit(381) ), newEmptyNode() ) ) ) ), nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FF") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkInfix.newTree( newIdentNode("or"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("Name") ), nnkBracketExpr.newTree( newIdentNode("Fr"), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("EC_ShortW_Aff") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("F"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("x") ), nnkPostfix.newTree( newIdentNode("*"), newIdentNode("y") ), newIdentNode("F"), newEmptyNode() ) ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("FieldKind") ), newEmptyNode(), nnkEnumTy.newTree( newEmptyNode(), newIdentNode("kBaseField"), newIdentNode("kScalarField") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getBigInt") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( newCommentStmtNode("Get the underlying BigInt type."), nnkCall.newTree( newIdentNode("typeof"), nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("default"), newIdentNode("T") ), newIdentNode("mres") ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("bits") ), newEmptyNode(), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("Name"), nnkCommand.newTree( newIdentNode("static"), newIdentNode("Algebra") ), newEmptyNode() ) ), nnkFormalParams.newTree( nnkCommand.newTree( newIdentNode("static"), newIdentNode("int") ), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), nnkBracketExpr.newTree( newIdentNode("FF"), newIdentNode("Name") ) ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDotExpr.newTree( nnkCall.newTree( nnkDotExpr.newTree( newIdentNode("T"), newIdentNode("getBigInt") ) ), newIdentNode("bits") ) ) ), nnkTemplateDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("getScalarField") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("untyped"), nnkIdentDefs.newTree( newIdentNode("EC"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("EC_ShortW_Aff") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkBracketExpr.newTree( newIdentNode("Fr"), nnkDotExpr.newTree( nnkDotExpr.newTree( newIdentNode("EC"), newIdentNode("F") ), newIdentNode("Name") ) ) ) ), nnkTypeSection.newTree( nnkTypeDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("ECFFT_Descriptor") ), nnkGenericParams.newTree( nnkIdentDefs.newTree( newIdentNode("EC"), newEmptyNode(), newEmptyNode() ) ), nnkObjectTy.newTree( newEmptyNode(), newEmptyNode(), nnkRecList.newTree( nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("order") ), newIdentNode("int"), newEmptyNode() ), nnkIdentDefs.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("rootsOfUnity") ), nnkPtrTy.newTree( nnkBracketExpr.newTree( newIdentNode("UncheckedArray"), nnkBracketExpr.newTree( newIdentNode("BigInt"), nnkCall.newTree( nnkDotExpr.newTree( nnkCall.newTree( newIdentNode("getScalarField"), newIdentNode("EC") ), newIdentNode("bits") ) ) ) ) ), newEmptyNode() ) ) ) ) ), nnkFuncDef.newTree( nnkPostfix.newTree( newIdentNode("*"), newIdentNode("new") ), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newIdentNode("T"), nnkIdentDefs.newTree( newIdentNode("T"), nnkCommand.newTree( newIdentNode("type"), newIdentNode("ECFFT_Descriptor") ), newEmptyNode() ) ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkDiscardStmt.newTree( newEmptyNode() ) ) ), nnkProcDef.newTree( newIdentNode("main"), newEmptyNode(), newEmptyNode(), nnkFormalParams.newTree( newEmptyNode() ), newEmptyNode(), newEmptyNode(), nnkStmtList.newTree( nnkLetSection.newTree( nnkIdentDefs.newTree( newIdentNode("ctx"), newEmptyNode(), nnkCall.newTree( nnkDotExpr.newTree( nnkBracketExpr.newTree( newIdentNode("ECFFT_Descriptor"), nnkBracketExpr.newTree( newIdentNode("EC_ShortW_Aff"), nnkBracketExpr.newTree( newIdentNode("Fp"), newIdentNode("BLS12_381") ) ) ), newIdentNode("new") ) ) ) ) ) ), nnkCall.newTree( newIdentNode("main") ) ) ```
Stats
  • GCC 11.4.0
  • Clang 14.0.0
  • NodeJS 20.4
  • Created 2024-07-18T13:01:11Z
  • Comments 2
  • 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 24 minutes bisecting 8 commits at 0 commits per second

metagn commented 2 weeks ago

I have both this and #23855 working in a complicated PR (#23411) but in the test code of both issues I have defined getBigInt as:

template getBigInt*[Name: static Algebra](T: type FF[Name]): untyped =
  ## Get the underlying BigInt type.
  typeof(default(T).residue_form)

since in #23855 it's not defined and in this one it uses a .mres field which is actually undeclared.

Unfortunately only the code in the issues compile + the length of the bigint arrays are computed correctly, but the complex node in ECFFT_Descriptor doesn't get instantiated properly yet and breaks sigmatch when trying to match the ECFFT_Descriptor type against generic procs. Maybe that'll be sorted out as well but just a heads up that a new issue might be needed if things still don't work

mratsim commented 2 weeks ago

Wow, thanks, that seems like a very involved debugging session full of footguns.

metagn commented 2 weeks ago

Yeah it took a while lol, I ended up needing to debug the compiler on constantine itself because the workaround for this issue broke too. I couldn't figure out that it was the niche interaction with sigmatch that couldn't instantiate it so I couldn't come up with simpler test code, and I didn't think the required change in semgnrc would even work because it completely breaks a lot of code if enabled in generic procs and not generic types.

Good news is I know why the remaining instantiation issue happens and have a fix for it in #23194, the compiler converts any expressions matching a static parameter (in this case a call with tyFromExpr matches bits: static int) into an nkStaticExpr with a tyStatic type, and static types for some reason completely avoid instantiation. We can get away with just avoiding this conversion if the type is tyFromExpr for this issue to work, but actually instantiating tyStatic fixes 1 issue completely rather than partially so I'll include it as well since it doesn't seem to break anything.