mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 08:54:53 +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 `{}=`).
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))
|