From 1dbc8164fa7241c5f582307f2aea90da101a45cb Mon Sep 17 00:00:00 2001 From: metagn Date: Wed, 15 May 2024 19:07:16 +0300 Subject: [PATCH] add back enum ident inference, only on undeclared identifiers closes #23611, refs #23588 --- compiler/semexprs.nim | 7 +++++++ tests/lookups/menumdirty1.nim | 18 ++++++++++++++++++ tests/lookups/menumdirty2.nim | 8 ++++++++ tests/lookups/tenumdirty.nim | 12 ++++++++++++ 4 files changed, 45 insertions(+) create mode 100644 tests/lookups/menumdirty1.nim create mode 100644 tests/lookups/menumdirty2.nim create mode 100644 tests/lookups/tenumdirty.nim diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 8fcf5936ef57..cb4de105e220 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -3034,6 +3034,13 @@ proc resolveIdentToSym(c: PContext, n: PNode, resultNode: var PNode, filter.excl {skModule, skPackage} let candidates = lookUpCandidates(c, ident, filter) if candidates.len == 0: + if expectedType != nil and ( + let expected = expectedType.skipTypes(abstractRange-{tyDistinct}); + expected.kind == tyEnum): + let nameId = ident.id + for f in expected.n: + if f.kind == nkSym and f.sym.name.id == nameId: + return f.sym result = errorUndeclaredIdentifierHint(c, ident, n.info) elif candidates.len == 1 or {efNoEvaluateGeneric, efInCall} * flags != {}: # unambiguous, or we don't care about ambiguity diff --git a/tests/lookups/menumdirty1.nim b/tests/lookups/menumdirty1.nim new file mode 100644 index 000000000000..4c08d2ccbd0f --- /dev/null +++ b/tests/lookups/menumdirty1.nim @@ -0,0 +1,18 @@ +type P = object + +template d(Name: untyped) {.dirty.} = + type Name* = object + +import menumdirty2 + +d(Json) + +type K[Flavor = P] = object + lex: V + +template F*(T: type Json, F: distinct type = P): type = K[F] + +proc init*(T: type K): T = discard + +proc s*[T](r: var K, value: var T) = + x(r.lex) diff --git a/tests/lookups/menumdirty2.nim b/tests/lookups/menumdirty2.nim new file mode 100644 index 000000000000..6cc5b146e70f --- /dev/null +++ b/tests/lookups/menumdirty2.nim @@ -0,0 +1,8 @@ +type + U* = enum + errNone + V* = object + err: U + +template x*(lex: V) {.dirty.} = + lex.err = errNone diff --git a/tests/lookups/tenumdirty.nim b/tests/lookups/tenumdirty.nim new file mode 100644 index 000000000000..9ddf3d8844db --- /dev/null +++ b/tests/lookups/tenumdirty.nim @@ -0,0 +1,12 @@ +# issue #23611 + +import menumdirty1 + +type + B = object + L = object + +template F(T: type B): type = F(Json, B) +var j = F(B).init() +var f: L +s(j, f)