diff options
author | metagn <metagngn@gmail.com> | 2024-10-03 20:35:53 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-03 19:35:53 +0200 |
commit | d98ef312f0cf8745d39c940b16d8d2dce1dfa70f (patch) | |
tree | d4e69247521cab04e5a4e07931f02c25dbf232f9 /tests | |
parent | 89978b48baeed0c745d45d666a9786c8d9457581 (diff) | |
download | Nim-d98ef312f0cf8745d39c940b16d8d2dce1dfa70f.tar.gz |
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.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/vm/tconstarrayresem.nim | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/tests/vm/tconstarrayresem.nim b/tests/vm/tconstarrayresem.nim new file mode 100644 index 000000000..6701cfe4d --- /dev/null +++ b/tests/vm/tconstarrayresem.nim @@ -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()) |