Files
Nim/tests/template/tnested.nim
metagn 62d8ca4306 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](a4f3bf3742/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 `{}=`).
2024-01-07 07:48:32 +01:00

39 lines
699 B
Nim

block: # issue #22775
proc h(c: int) = discard
template k(v: int) =
template p() = v.h()
p()
let a = @[0]
k(0 and not a[0])
block: # issue #22775 case 2
proc h(c: int, q: int) = discard
template k(v: int) =
template p() = h(v, v)
p()
let a = [0]
k(0 and not a[0])
block: # issue #22775 minimal cases
proc h(c: int) = discard
template k(v: int) =
template p() = h(v)
p()
let a = [0]
k(not a[0])
block:
k(-a[0])
block:
proc f(x: int): int = x
k(f a[0])
block: # bracket assignment case of above tests
proc h(c: int) = discard
template k(v: int) =
template p() = h(v)
p()
var a = [0]
k(not (block:
a[0] = 1
1))