Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fixes #20681; add efSkipFieldVisibilityCheck to skip check #20639

Merged
merged 10 commits into from
Oct 28, 2022
2 changes: 2 additions & 0 deletions compiler/semobjconstr.nim
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,8 @@ proc defaultConstructionError(c: PContext, t: PType, info: TLineInfo) =
assert false, "Must not enter here."

proc semObjConstr(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType = nil): PNode =
if nfUseDefaultField in n.flags:
return n
ringabout marked this conversation as resolved.
Show resolved Hide resolved
var t = semTypeNode(c, n[0], nil)
result = newNodeIT(nkObjConstr, n.info, t)
result.add newNodeIT(nkType, n.info, t) #This will contain the default values to be added in transf
Expand Down
81 changes: 45 additions & 36 deletions tests/objects/tobject_default_value.nim
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ discard """
targets: "c cpp js"
"""

import times
import std/[times, tables]

type
Guess = object
Expand Down Expand Up @@ -206,21 +206,32 @@ template main {.dirty.} =
when nimvm:
discard "fixme"
else:
when defined(gcArc) or defined(gcOrc):
block: #seq
var x = newSeq[Object](10)
let y = x[0]
doAssert y.value == 12
doAssert y.time == 1.2
doAssert y.scale == 1

block:
var x: seq[Object]
setLen(x, 5)
let y = x[^1]
doAssert y.value == 12
doAssert y.time == 1.2
doAssert y.scale == 1
block: #seq
var x = newSeq[Object](10)
let y = x[0]
doAssert y.value == 12
doAssert y.time == 1.2
doAssert y.scale == 1

block:
var x: seq[Object]
setLen(x, 5)
let y = x[^1]
doAssert y.value == 12
doAssert y.time == 1.2
doAssert y.scale == 1

block:
var my = @[1, 2, 3, 4, 5]
my.setLen(0)
my.setLen(5)
doAssert my == @[0, 0, 0, 0, 0]

block:
var my = "hello"
my.setLen(0)
my.setLen(5)
doAssert $(@my) == """@['\x00', '\x00', '\x00', '\x00', '\x00']"""

block: # array
var x: array[10, Object] = arrayWith(default(Object), 10)
Expand Down Expand Up @@ -379,20 +390,19 @@ template main {.dirty.} =
doAssert x.id == 1
doAssert x.obj == default(ObjectBase)
doAssert x.name == ""

block:
var x = default(Class)
doAssert x.def == default(Default)
doAssert x.def.id == 1
doAssert x.def.obj == default(ObjectBase)
doAssert x.def.name == ""

when not defined(cpp):
block:
var x = default(Member)
doAssert x.def.id == 777
doAssert x.def.obj == default(ObjectBase)
doAssert x.def.name == "fine"
block:
var x = default(Member)
doAssert x.def.id == 777
doAssert x.def.obj == default(ObjectBase)
doAssert x.def.name == "fine"

block:
var x {.noinit.} = 12
Expand All @@ -409,21 +419,20 @@ template main {.dirty.} =
doAssert z.id == 77


proc main1 =
var my = @[1, 2, 3, 4, 5]
my.setLen(0)
my.setLen(5)
doAssert my == @[0, 0, 0, 0, 0]
block:
type TokenData = object
campaignMemberships = Table[string, string]()

let x = default(TokenData)
doAssert x.campaignMemberships.len == 0

block:
type TokenData = object
campaignMemberships = newTable[string, string]()

proc main2 =
var my = "hello"
my.setLen(0)
my.setLen(5)
doAssert $(@my) == """@['\x00', '\x00', '\x00', '\x00', '\x00']"""
let x = default(TokenData)
doAssert x.campaignMemberships.len == 0

when defined(gcArc) or defined(gcOrc):
main1()
main2()

static: main()
main()