diff options
author | metagn <metagngn@gmail.com> | 2024-01-07 09:48:32 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-07 07:48:32 +0100 |
commit | 62d8ca43063197272968b4acf8c7a1ef27874c54 (patch) | |
tree | 5a3174f9f8d24188f2384fd2939f414d146c5627 /tests/template | |
parent | a4f3bf374238df96f0982b7106e3702da6b485b1 (diff) | |
download | Nim-62d8ca43063197272968b4acf8c7a1ef27874c54.tar.gz |
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 `{}=`).
Diffstat (limited to 'tests/template')
-rw-r--r-- | tests/template/tnested.nim | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/tests/template/tnested.nim b/tests/template/tnested.nim new file mode 100644 index 000000000..81e416a76 --- /dev/null +++ b/tests/template/tnested.nim @@ -0,0 +1,38 @@ +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)) |