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

remove implicit let/var default initialization #20508

Merged
merged 1 commit into from
Oct 7, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 0 additions & 11 deletions compiler/semstmts.nim
Original file line number Diff line number Diff line change
Expand Up @@ -612,11 +612,6 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
var typFlags: TTypeAllowedFlags

var def: PNode = c.graph.emptyNode
if a[^1].kind == nkEmpty and symkind == skVar and a[^2].typ != nil:
let field = defaultNodeField(c, a[^2])
if field != nil:
a[^1] = field
field.flags.incl nfUseDefaultField
if a[^1].kind != nkEmpty:
def = semExprWithType(c, a[^1], {}, typ)

Expand Down Expand Up @@ -685,12 +680,6 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
addToVarSection(c, result, n, a)
continue
var v = semIdentDef(c, a[j], symkind, false)
if a[^1].kind != nkEmpty:
if {sfThread, sfNoInit} * v.flags != {} and
nfUseDefaultField in a[^1].flags:
a[^1] = c.graph.emptyNode
def = c.graph.emptyNode
a[^1].flags.excl nfUseDefaultField
styleCheckDef(c, v)
onDef(a[j].info, v)
if sfGenSym notin v.flags:
Expand Down
32 changes: 16 additions & 16 deletions tests/objects/tobject_default_value.nim
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ template main {.dirty.} =
r: R

var
rVal: R # Works fine
objVal: Obj
rVal: R = default(R) # Works fine
objVal = default(Obj)

doAssert rVal == 0 # it should be 1
doAssert objVal.r == 1
Expand All @@ -142,7 +142,7 @@ template main {.dirty.} =
doAssert z.value == 12

block:
var base: ObjectBase
var base = ObjectBase()
var x: ObjectBaseDistinct = ObjectBaseDistinct(base)
doAssert ObjectBase(x).value == 12
let y = ObjectBaseDistinct(default(ObjectBase))
Expand All @@ -161,7 +161,7 @@ template main {.dirty.} =
doAssert ObjectBase(x.data).value == 12

block:
var x: Object
var x = Object()
doAssert x.value == 12
doAssert x.time == 1.2
doAssert x.scale == 1
Expand All @@ -171,7 +171,7 @@ template main {.dirty.} =
doAssert y.time == 1.2
doAssert y.scale == 1

var x1, x2, x3: Object
var x1, x2, x3 = default(Object)
doAssert x1.value == 12
doAssert x1.time == 1.2
doAssert x1.scale == 1
Expand All @@ -187,7 +187,7 @@ template main {.dirty.} =
doAssert x[] == default(Object)

block:
var x: Object2
var x = default(Object2)
doAssert x.name.value == 12
doAssert x.name.time == 1.2
doAssert x.name.scale == 1
Expand All @@ -198,7 +198,7 @@ template main {.dirty.} =
doAssert x[] == default(Object2)

block:
var x: Object3
var x = default(Object3) # todo Object3() ?
doAssert x.obj.name.value == 12
doAssert x.obj.name.time == 1.2
doAssert x.obj.name.scale == 1
Expand All @@ -223,7 +223,7 @@ template main {.dirty.} =
doAssert y.scale == 1

block: # array
var x: array[10, Object]
var x: array[10, Object] = arrayWith(default(Object), 10)
let y = x[0]
doAssert y.value == 12
doAssert y.time == 1.2
Expand All @@ -234,7 +234,7 @@ template main {.dirty.} =
discard x

block: # tuple
var x: ObjectTuple
var x = default(ObjectTuple)
doAssert x.base.value == 12
doAssert x.typ == 0
doAssert x.obj.time == 1.2
Expand All @@ -243,7 +243,7 @@ template main {.dirty.} =
doAssert x.obj.value == 12

block: # tuple in object
var x: TupleInObject
var x = default(TupleInObject)
doAssert x.data.base.value == 12
doAssert x.data.typ == 0
doAssert x.data.obj.time == 1.2
Expand All @@ -257,7 +257,7 @@ template main {.dirty.} =
data: array[10, Object]

block:
var x: ObjectArray
var x = default(ObjectArray)
let y = x.data[0]
doAssert y.value == 12
doAssert y.time == 1.2
Expand Down Expand Up @@ -308,7 +308,7 @@ template main {.dirty.} =
doAssert typeof(x.time) is float32

block:
var x: ObjectVarint1
var x = default(ObjectVarint1)
doAssert x.kind == Blue
doAssert x.fill2 == "123"
x.cry = 326
Expand Down Expand Up @@ -350,7 +350,7 @@ template main {.dirty.} =
him: int

block:
var x: ObjectVarint3
var x = default(ObjectVarint3)
doAssert x.kind == Blue
doAssert x.name == Blue
doAssert x.go == 12
Expand All @@ -375,21 +375,21 @@ template main {.dirty.} =
def: Default = (id: 777, obj: ObjectBase(), name: "fine")

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

block:
var x: Class
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: Member
var x = default(Member)
doAssert x.def.id == 777
doAssert x.def.obj == default(ObjectBase)
doAssert x.def.name == "fine"
Expand Down