From f16e4dd22a2a06f473943c4de16aceba6d2b10dc Mon Sep 17 00:00:00 2001 From: metagn Date: Mon, 28 Aug 2023 22:40:46 +0300 Subject: [PATCH] correct logic for qualified symbol in templates (#22577) * correct logic for qualified symbol in templates fixes #19865 * add test (cherry picked from commit 3de8d755135d94983ca087f448ad76832c341eaa) --- compiler/semtempl.nim | 5 ++++- tests/template/template_issues.nim | 4 ++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index cdb7ce08dd..9108363a45 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -571,6 +571,7 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = # so we use the generic code for nkDotExpr too let s = qualifiedLookUp(c.c, n, {}) if s != nil: + # mirror the nkIdent case # do not symchoice a quoted template parameter (bug #2390): if s.owner == c.owner and s.kind == skParam and n.kind == nkAccQuoted and n.len == 1: @@ -582,7 +583,9 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = elif contains(c.toMixin, s.name.id): return symChoice(c.c, n, s, scForceOpen, c.noGenSym > 0) else: - return symChoice(c.c, n, s, scOpen, c.noGenSym > 0) + if s.kind in {skType, skVar, skLet, skConst}: + discard qualifiedLookUp(c.c, n, {checkAmbiguity, checkModule}) + return semTemplSymbol(c.c, n, s, c.noGenSym > 0) if n.kind == nkDotExpr: result = n result[0] = semTemplBody(c, n[0]) diff --git a/tests/template/template_issues.nim b/tests/template/template_issues.nim index 58c40941db..5b7c54ed64 100644 --- a/tests/template/template_issues.nim +++ b/tests/template/template_issues.nim @@ -302,3 +302,7 @@ block: # bug #21920 discard t[void]() # Error: expression has no type: discard + +block: # issue #19865 + template f() = discard default(system.int) + f()