From 60d2dc6b35a0a946d93d1b4223e57ee64f5519d2 Mon Sep 17 00:00:00 2001 From: metagn Date: Fri, 7 Jun 2024 19:48:23 +0300 Subject: [PATCH] ignore type symbols in lookup when enum type is expected fixes #23689 --- compiler/semexprs.nim | 4 ++++ tests/enum/ttypenameconflict.nim | 13 +++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 tests/enum/ttypenameconflict.nim diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 10695ed1d0fa1..ce9c662713e98 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -3047,6 +3047,10 @@ proc resolveIdentToSym(c: PContext, n: PNode, resultNode: var PNode, if efNoEvaluateGeneric in flags or expectedType != nil: # `a[...]` where `a` is a module or package is not possible filter.excl {skModule, skPackage} + if expectedType != nil and ( + let expected = expectedType.skipTypes(abstractRange-{tyDistinct}); + expected.kind == tyEnum): + filter.excl {skType} let candidates = lookUpCandidates(c, ident, filter) if candidates.len == 0: result = errorUndeclaredIdentifierHint(c, ident, n.info) diff --git a/tests/enum/ttypenameconflict.nim b/tests/enum/ttypenameconflict.nim new file mode 100644 index 0000000000000..b13bf00cee0eb --- /dev/null +++ b/tests/enum/ttypenameconflict.nim @@ -0,0 +1,13 @@ +# issue #23689 + +type + MyEnum {.pure.} = enum + A, B, C, D + + B = object + field: int + +let x: MyEnum = B +doAssert $x == "B" +doAssert typeof(x) is MyEnum +doAssert x in {A, B}