-
-
Notifications
You must be signed in to change notification settings - Fork 1.5k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
don't construct array type for already typed
nkBracket
node (#24224)
fixes #23010, split from #24195 When resemming bracket nodes, the compiler currently unconditionally makes a new node with an array type based on the node. However the VM can generate bracket nodes with `seq` types, which this erases. To fix this, if a bracket node already has a type, we still resem the bracket node, but don't construct a new type for it, instead using the type of the original node. A version of this was rejected that didn't resem the node at all if it was typed, but I can't find it. The difference with this one is that the individual elements are still resemmed. This should fix the break caused by #24184 so we could redo it after this PR but it might still have issues, not to mention the related pre-existing issues like #22793, #12559 etc.
- Loading branch information
Showing
2 changed files
with
72 additions
and
22 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,29 @@ | ||
# issue #23010 | ||
|
||
type | ||
Result[T, E] = object | ||
case oResult: bool | ||
of false: | ||
discard | ||
of true: | ||
vResult: T | ||
|
||
Opt[T] = Result[T, void] | ||
|
||
template ok[T, E](R: type Result[T, E], x: untyped): R = | ||
R(oResult: true, vResult: x) | ||
|
||
template c[T](v: T): Opt[T] = Opt[T].ok(v) | ||
|
||
type | ||
FixedBytes[N: static[int]] = distinct array[N, byte] | ||
|
||
H = object | ||
d: FixedBytes[2] | ||
|
||
const b = default(H) | ||
template g(): untyped = | ||
const t = default(H) | ||
b | ||
|
||
discard c(g()) |