mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 09:24:36 +00:00
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 `{}=`). (cherry picked from commit62d8ca4306)
39 lines
699 B
Nim
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))
|