From c2d297cc3c3940e68614acbe683141e01d83a823 Mon Sep 17 00:00:00 2001 From: metagn Date: Sun, 7 Jan 2024 09:48:32 +0300 Subject: [PATCH] don't transform typed bracket exprs to `[]` calls in templates (#23175) fixes #22775 It's pre-existing that [`prepareOperand` doesn't typecheck expressions which have types](https://github.com/nim-lang/Nim/blob/a4f3bf374238df96f0982b7106e3702da6b485b1/compiler/sigmatch.nim#L2444). Templates can take typed subscript expressions, transform them into calls to `[]`, and then have this `[]` not be resolved later if the expression is nested inside of a call argument, which leaks an untyped expression past semantic analysis. To prevent this, don't transform any typed subscript expressions into calls to `[]` in templates. Ditto for curly subscripts (with `{}`) and assignments to subscripts and curly subscripts (with `[]=` and `{}=`). (cherry picked from commit 62d8ca43063197272968b4acf8c7a1ef27874c54) --- compiler/semtempl.nim | 39 ++++++++++++++++++++++++-------------- tests/template/tnested.nim | 38 +++++++++++++++++++++++++++++++++++++ 2 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 tests/template/tnested.nim diff --git a/compiler/semtempl.nim b/compiler/semtempl.nim index f6f26a6cb2..36b7838ec6 100644 --- a/compiler/semtempl.nim +++ b/compiler/semtempl.nim @@ -506,14 +506,21 @@ proc semTemplBody(c: var TemplCtx, n: PNode): PNode = if x.kind == nkExprColonExpr: x[1] = semTemplBody(c, x[1]) of nkBracketExpr: - result = newNodeI(nkCall, n.info) - result.add newIdentNode(getIdent(c.c.cache, "[]"), n.info) - for i in 0..