remove implicit let/var default initialization (#20508)

This commit is contained in:
ringabout 2022-10-07 13:49:27 +08:00 • committed by GitHub
commit 079363bfc3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 27 deletions

View file

@ -612,11 +612,6 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
var typFlags: TTypeAllowedFlags var typFlags: TTypeAllowedFlags
var def: PNode = c.graph.emptyNode 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: if a[^1].kind != nkEmpty:
def = semExprWithType(c, a[^1], {}, typ) def = semExprWithType(c, a[^1], {}, typ)
@ -685,12 +680,6 @@ proc semVarOrLet(c: PContext, n: PNode, symkind: TSymKind): PNode =
addToVarSection(c, result, n, a) addToVarSection(c, result, n, a)
continue continue
var v = semIdentDef(c, a[j], symkind, false) 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) styleCheckDef(c, v)
onDef(a[j].info, v) onDef(a[j].info, v)
if sfGenSym notin v.flags: if sfGenSym notin v.flags:

View file

@ -114,8 +114,8 @@ template main {.dirty.} =
r: R r: R
var var
rVal: R # Works fine rVal: R = default(R) # Works fine
objVal: Obj objVal = default(Obj)
doAssert rVal == 0 # it should be 1 doAssert rVal == 0 # it should be 1
doAssert objVal.r == 1 doAssert objVal.r == 1
@ -142,7 +142,7 @@ template main {.dirty.} =
doAssert z.value == 12 doAssert z.value == 12
block: block:
var base: ObjectBase var base = ObjectBase()
var x: ObjectBaseDistinct = ObjectBaseDistinct(base) var x: ObjectBaseDistinct = ObjectBaseDistinct(base)
doAssert ObjectBase(x).value == 12 doAssert ObjectBase(x).value == 12
let y = ObjectBaseDistinct(default(ObjectBase)) let y = ObjectBaseDistinct(default(ObjectBase))
@ -161,7 +161,7 @@ template main {.dirty.} =
doAssert ObjectBase(x.data).value == 12 doAssert ObjectBase(x.data).value == 12
block: block:
var x: Object var x = Object()
doAssert x.value == 12 doAssert x.value == 12
doAssert x.time == 1.2 doAssert x.time == 1.2
doAssert x.scale == 1 doAssert x.scale == 1
@ -171,7 +171,7 @@ template main {.dirty.} =
doAssert y.time == 1.2 doAssert y.time == 1.2
doAssert y.scale == 1 doAssert y.scale == 1
var x1, x2, x3: Object var x1, x2, x3 = default(Object)
doAssert x1.value == 12 doAssert x1.value == 12
doAssert x1.time == 1.2 doAssert x1.time == 1.2
doAssert x1.scale == 1 doAssert x1.scale == 1
@ -187,7 +187,7 @@ template main {.dirty.} =
doAssert x[] == default(Object) doAssert x[] == default(Object)
block: block:
var x: Object2 var x = default(Object2)
doAssert x.name.value == 12 doAssert x.name.value == 12
doAssert x.name.time == 1.2 doAssert x.name.time == 1.2
doAssert x.name.scale == 1 doAssert x.name.scale == 1
@ -198,7 +198,7 @@ template main {.dirty.} =
doAssert x[] == default(Object2) doAssert x[] == default(Object2)
block: block:
var x: Object3 var x = default(Object3) # todo Object3() ?
doAssert x.obj.name.value == 12 doAssert x.obj.name.value == 12
doAssert x.obj.name.time == 1.2 doAssert x.obj.name.time == 1.2
doAssert x.obj.name.scale == 1 doAssert x.obj.name.scale == 1
@ -223,7 +223,7 @@ template main {.dirty.} =
doAssert y.scale == 1 doAssert y.scale == 1
block: # array block: # array
var x: array[10, Object] var x: array[10, Object] = arrayWith(default(Object), 10)
let y = x[0] let y = x[0]
doAssert y.value == 12 doAssert y.value == 12
doAssert y.time == 1.2 doAssert y.time == 1.2
@ -234,7 +234,7 @@ template main {.dirty.} =
discard x discard x
block: # tuple block: # tuple
var x: ObjectTuple var x = default(ObjectTuple)
doAssert x.base.value == 12 doAssert x.base.value == 12
doAssert x.typ == 0 doAssert x.typ == 0
doAssert x.obj.time == 1.2 doAssert x.obj.time == 1.2
@ -243,7 +243,7 @@ template main {.dirty.} =
doAssert x.obj.value == 12 doAssert x.obj.value == 12
block: # tuple in object block: # tuple in object
var x: TupleInObject var x = default(TupleInObject)
doAssert x.data.base.value == 12 doAssert x.data.base.value == 12
doAssert x.data.typ == 0 doAssert x.data.typ == 0
doAssert x.data.obj.time == 1.2 doAssert x.data.obj.time == 1.2
@ -257,7 +257,7 @@ template main {.dirty.} =
data: array[10, Object] data: array[10, Object]
block: block:
var x: ObjectArray var x = default(ObjectArray)
let y = x.data[0] let y = x.data[0]
doAssert y.value == 12 doAssert y.value == 12
doAssert y.time == 1.2 doAssert y.time == 1.2
@ -308,7 +308,7 @@ template main {.dirty.} =
doAssert typeof(x.time) is float32 doAssert typeof(x.time) is float32
block: block:
var x: ObjectVarint1 var x = default(ObjectVarint1)
doAssert x.kind == Blue doAssert x.kind == Blue
doAssert x.fill2 == "123" doAssert x.fill2 == "123"
x.cry = 326 x.cry = 326
@ -350,7 +350,7 @@ template main {.dirty.} =
him: int him: int
block: block:
var x: ObjectVarint3 var x = default(ObjectVarint3)
doAssert x.kind == Blue doAssert x.kind == Blue
doAssert x.name == Blue doAssert x.name == Blue
doAssert x.go == 12 doAssert x.go == 12
@ -375,13 +375,13 @@ template main {.dirty.} =
def: Default = (id: 777, obj: ObjectBase(), name: "fine") def: Default = (id: 777, obj: ObjectBase(), name: "fine")
block: block:
var x: Default var x = default(Default)
doAssert x.id == 1 doAssert x.id == 1
doAssert x.obj == default(ObjectBase) doAssert x.obj == default(ObjectBase)
doAssert x.name == "" doAssert x.name == ""
block: block:
var x: Class var x = default(Class)
doAssert x.def == default(Default) doAssert x.def == default(Default)
doAssert x.def.id == 1 doAssert x.def.id == 1
doAssert x.def.obj == default(ObjectBase) doAssert x.def.obj == default(ObjectBase)
@ -389,7 +389,7 @@ template main {.dirty.} =
when not defined(cpp): when not defined(cpp):
block: block:
var x: Member var x = default(Member)
doAssert x.def.id == 777 doAssert x.def.id == 777
doAssert x.def.obj == default(ObjectBase) doAssert x.def.obj == default(ObjectBase)
doAssert x.def.name == "fine" doAssert x.def.name == "fine"