mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-29 10:43:57 +00:00
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.
(cherry picked from commit d98ef312f0)
30 lines
472 B
Nim
30 lines
472 B
Nim
# 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())
|