fixes object default fields bugs and add tests (#20839)

* fixes object default fields bugs and add tests

* Update compiler/semmagic.nim

* Update compiler/sem.nim

* Update compiler/sem.nim

Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
ringabout
2022-11-15 00:31:06 +08:00
committed by GitHub
parent 1daf43fb14
commit 7f2ff909d9
4 changed files with 66 additions and 20 deletions

View File

@@ -3,7 +3,7 @@ discard """
targets: "c cpp js"
"""
import std/[times, tables, macros]
import std/[times, macros]
type
Guess = object
@@ -27,6 +27,10 @@ import mobject_default_value
block:
let x = Default()
doAssert x.se == 0'i32
block:
let x = default(Default)
doAssert x.se == 0'i32
# echo Default(poi: 12)
# echo Default(poi: 17)
@@ -120,6 +124,19 @@ template main {.dirty.} =
doAssert rVal == 0 # it should be 1
doAssert objVal.r == 1
block: # bug #16744
type
R = range[1..10]
Obj = object
r: R
var
rVal: R = default(R) # Works fine
objVal = Obj()
doAssert rVal == 0 # it should be 1
doAssert objVal.r == 1
block: # bug #3608
type
abc = ref object
@@ -148,6 +165,9 @@ template main {.dirty.} =
let y = ObjectBaseDistinct(default(ObjectBase))
doAssert ObjectBase(y).value == 12
let m = ObjectBaseDistinct(ObjectBase())
doAssert ObjectBase(m).value == 12
proc hello(): ObjectBaseDistinct =
result = ObjectBaseDistinct(default(ObjectBase))
@@ -192,13 +212,25 @@ template main {.dirty.} =
doAssert x.name.time == 1.2
doAssert x.name.scale == 1
block:
let x = Object2()
doAssert x.name.value == 12
doAssert x.name.time == 1.2
doAssert x.name.scale == 1
block:
var x: ref Object2
new x
doAssert x[] == default(Object2)
block:
var x = default(Object3) # todo Object3() ?
var x = default(Object3)
doAssert x.obj.name.value == 12
doAssert x.obj.name.time == 1.2
doAssert x.obj.name.scale == 1
block:
var x = Object3()
doAssert x.obj.name.value == 12
doAssert x.obj.name.time == 1.2
doAssert x.obj.name.scale == 1
@@ -275,7 +307,6 @@ template main {.dirty.} =
doAssert y.time == 1.2
doAssert y.scale == 1
block:
var x: PrellDeque[int]
doAssert x.pendingTasks == 0