diff --git a/compiler/guards.nim b/compiler/guards.nim index bbb2398674..553cc744df 100644 --- a/compiler/guards.nim +++ b/compiler/guards.nim @@ -1165,8 +1165,12 @@ proc buildProperFieldCheck(access, check: PNode; o: Operators): PNode = if check[1].kind == nkCurly: result = copyTree(check) if access.kind == nkDotExpr: + # change the access to the discriminator field access var a = copyTree(access) + # set field name to discriminator field name a[1] = check[2] + # set discriminator field type: important for `neg` + a.typ = check[2].typ result[2] = a # 'access.kind != nkDotExpr' can happen for object constructors # which we don't check yet diff --git a/tests/objvariant/tcorrectcheckedfield.nim b/tests/objvariant/tcorrectcheckedfield.nim new file mode 100644 index 0000000000..e5e67c727d --- /dev/null +++ b/tests/objvariant/tcorrectcheckedfield.nim @@ -0,0 +1,22 @@ +discard """ + matrix: "; --warning[ProveField]:on --warningAsError[ProveField]:on; --experimental:strictCaseObjects" +""" + +block: # issue #24021 + type + FooKind = enum + a + b + BiggerEnum = enum b1, b2, b3, b4, b5, b6, b7, b8, b9, b10 + Foo = object + case kind: FooKind + of a: discard + else: + z: BiggerEnum + + proc p(foo: Foo, val: int) = + case foo.kind + of a: + discard + else: + discard foo.z