diff options
-rw-r--r-- | compiler/guards.nim | 5 | ||||
-rw-r--r-- | tests/effects/tstrict_caseobjects.nim | 22 |
2 files changed, 25 insertions, 2 deletions
diff --git a/compiler/guards.nim b/compiler/guards.nim index 33bf3d99c..15c6a64e3 100644 --- a/compiler/guards.nim +++ b/compiler/guards.nim @@ -68,9 +68,12 @@ proc isLetLocation(m: PNode, isApprox: bool): bool = case n.kind of nkDotExpr, nkCheckedFieldExpr, nkObjUpConv, nkObjDownConv: n = n[0] - of nkDerefExpr, nkHiddenDeref: + of nkDerefExpr: n = n[0] inc derefs + of nkHiddenDeref: + n = n[0] + if not isApprox: inc derefs of nkBracketExpr: if isConstExpr(n[1]) or isLet(n[1]) or isConstExpr(n[1].skipConv): n = n[0] diff --git a/tests/effects/tstrict_caseobjects.nim b/tests/effects/tstrict_caseobjects.nim index e5e84f287..20bc810e0 100644 --- a/tests/effects/tstrict_caseobjects.nim +++ b/tests/effects/tstrict_caseobjects.nim @@ -1,11 +1,31 @@ discard """ errormsg: "field access outside of valid case branch: x.x" - line: 25 + line: 45 """ {.experimental: "strictCaseObjects".} type + NodeKind = enum + nkParent, + nkChild + + Node {.acyclic.} = ref object + case kind: NodeKind + of nkParent: + children: seq[Node] + of nkChild: + name: string + +let list = @[Node(kind: nkParent, children: @[]), Node(kind: nkChild, name: "hello")] +for node in list: + case node.kind + of nkChild: + echo $node.name # here this time there is a warning + else: discard + + +type Foo = object case b: bool of false: |