fixes #20681; add efSkipFieldVisibilityCheck to skip check (#20639)

* don't sem const objectConstr defaults

* fixes

* add `efSkipFieldVisibilityCheck`; fixes nkBracket types

* fixes #20681

* fixes tests

* suggestion from @metagn

* fixes tests

Co-authored-by: xflywind <43030857+xflywind@users.noreply.github.com>
This commit is contained in:
ringabout 2022-10-29 04:19:40 +08:00 • committed by GitHub
commit 141abb7b75
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 50 additions and 47 deletions

View file

@ -76,7 +76,8 @@ proc semConstrField(c: PContext, flags: TExprFlags,
let assignment = locateFieldInInitExpr(c, field, initExpr)
if assignment != nil:
if nfSem in assignment.flags: return assignment[1]
if nfUseDefaultField in assignment[1].flags:
if nfUseDefaultField in assignment[1].flags or
efSkipFieldVisibilityCheck in flags:
discard
elif not fieldVisible(c, field):
localError(c.config, initExpr.info,
@ -415,7 +416,10 @@ proc semObjConstr(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType
# field (if this is a case object, initialized fields in two different
# branches will be reported as an error):
var constrCtx = initConstrContext(t, result)
let (initResult, defaults) = semConstructTypeAux(c, constrCtx, flags)
let (initResult, defaults) = if nfUseDefaultField in n.flags:
semConstructTypeAux(c, constrCtx, flags + {efSkipFieldVisibilityCheck})
else:
semConstructTypeAux(c, constrCtx, flags)
result[0].sons.add defaults
var hasError = false # needed to split error detect/report for better msgs