Skip to content

Commit

Permalink
fix #14585, fix #17589: access to static param now works (#17590)
Browse files Browse the repository at this point in the history
  • Loading branch information
timotheecour authored Mar 31, 2021
1 parent 8ee0eda commit 6d7d1e6
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 2 deletions.
2 changes: 1 addition & 1 deletion compiler/types.nim
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ const
tyAlias, tyInferred, tySink, tyOwned}
# see also ast.abstractVarRange
abstractInst* = {tyGenericInst, tyDistinct, tyOrdinal, tyTypeDesc, tyAlias,
tyInferred, tySink, tyOwned}
tyInferred, tySink, tyOwned} # xxx what about tyStatic?
abstractInstOwned* = abstractInst + {tyOwned}
skipPtrs* = {tyVar, tyPtr, tyRef, tyGenericInst, tyTypeDesc, tyAlias,
tyInferred, tySink, tyLent, tyOwned}
Expand Down
2 changes: 1 addition & 1 deletion compiler/vmgen.nim
Original file line number Diff line number Diff line change
Expand Up @@ -980,7 +980,7 @@ proc genBindSym(c: PCtx; n: PNode; dest: var TDest) =

proc fitsRegister*(t: PType): bool =
assert t != nil
t.skipTypes(abstractInst-{tyTypeDesc}).kind in {
t.skipTypes(abstractInst + {tyStatic} - {tyTypeDesc}).kind in {
tyRange, tyEnum, tyBool, tyInt..tyUInt64, tyChar}

proc ldNullOpcode(t: PType): TOpcode =
Expand Down
56 changes: 56 additions & 0 deletions tests/statictypes/tstatic.nim
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
discard """
targets: "c cpp js"
"""

template main() =
block: # bug #17589
#[
# all those gave some variation of the same bug:
'intVal' is not accessible using discriminant 'kind' of type 'TFullReg'
'floatVal' is not accessible using discriminant 'kind' of type 'TFullReg'
]#
block:
proc f(a: static uint64): uint64 =
a
const x = 3'u64
static: doAssert f(x) == 3'u64
doAssert f(x) == 3'u64

block:
proc f(a: static uint64): uint64 =
a
const x = 3'u64
static: doAssert f(x) == 3'u64
doAssert f(x) == 3'u64

block:
proc foo(x: uint8): uint8 = x
proc f(a: static uint8): auto = foo(a)
const x = 3'u8
static: doAssert f(x) == 3'u8
doAssert f(x) == 3'u8

block:
template foo2(x: float) =
let b = x == 0
proc foo(x: float) = foo2(x)
proc f(a: static float) = foo(a)
const x = 1.0
static: f(x)

block:
proc foo(x: int32) =
let b = x == 0
proc f(a: static int32) = foo(a)
static: f(32767) # was working
static: f(32768) # was failing because >= int16.high (see isInt16Lit)

block: # bug #14585
const foo_m0ninv = 0x1234'u64
proc foo(m0ninv: static uint64) =
let b = $m0ninv
static:
foo(foo_m0ninv)

static: main()
main()

0 comments on commit 6d7d1e6

Please sign in to comment.