forked from nim-lang/Nim
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
don't transform typed bracket exprs to
[]
calls in templates (nim-l…
…ang#23175) fixes nim-lang#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 `{}=`).
- Loading branch information
Showing
2 changed files
with
63 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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)) |