fixes requiresInit for var statements without initialization (#24177)

ref https://forum.nim-lang.org/t/12530
This commit is contained in:
ringabout
2024-09-26 12:28:40 +08:00
committed by GitHub
parent 3b85c1a2e9
commit 6d6489a9ab
3 changed files with 18 additions and 4 deletions

View File

@@ -75,6 +75,7 @@ type
# overload resolution.
efTypeAllowed # typeAllowed will be called after
efWantNoDefaults
efIgnoreDefaults # var statements without initialization
efAllowSymChoice # symchoice node should not be resolved
TExprFlags* = set[TExprFlag]

View File

@@ -387,10 +387,13 @@ proc semConstructFields(c: PContext, n: PNode, constrCtx: var ObjConstrContext,
if e != nil:
result.status = initFull
elif field.ast != nil:
result.status = initUnknown
result.defaults.add newTree(nkExprColonExpr, n, field.ast)
if efIgnoreDefaults notin flags:
result.status = initUnknown
result.defaults.add newTree(nkExprColonExpr, n, field.ast)
else:
result.status = initNone
else:
if efWantNoDefaults notin flags: # cannot compute defaults at the typeRightPass
if {efWantNoDefaults, efIgnoreDefaults} * flags == {}: # cannot compute defaults at the typeRightPass
let defaultExpr = defaultNodeField(c, n, constrCtx.checkDefault)
if defaultExpr != nil:
result.status = initUnknown
@@ -443,7 +446,7 @@ proc defaultConstructionError(c: PContext, t: PType, info: TLineInfo) =
assert objType != nil
if objType.kind == tyObject:
var constrCtx = initConstrContext(objType, newNodeI(nkObjConstr, info))
let initResult = semConstructTypeAux(c, constrCtx, {efWantNoDefaults})
let initResult = semConstructTypeAux(c, constrCtx, {efIgnoreDefaults})
if constrCtx.missingFields.len > 0:
localError(c.config, info,
"The $1 type doesn't have a default value. The following fields must be initialized: $2." % [typeToString(t), listSymbolNames(constrCtx.missingFields)])

View File

@@ -0,0 +1,10 @@
discard """
errormsg: "The MPlayerObj type doesn't have a default value. The following fields must be initialized: foo."
"""
type
MPlayerObj* {.requiresInit.} = object
foo: range[5..10] = 5
var a: MPlayerObj
echo a.foo