mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-31 10:22:15 +00:00
fixes #23186
As explained in #23186, generics can transform `genericProc[int]` into a
call `` `[]`(genericProc, int) `` which causes a problem when
`genericProc` is resemmed, since it is not a resolved generic proc. `[]`
needs unresolved generic procs since `mArrGet` also handles explicit
generic instantiations, so delay the resolved generic proc check to
`semFinishOperands` which is intentionally not called for `mArrGet`.
The root issue for
[t6137](https://github.com/nim-lang/Nim/blob/devel/tests/generics/t6137.nim)
is also fixed (because this change breaks it otherwise), the compiler
doesn't consider the possibility that an assigned generic param can be
an unresolved static value (note the line `if t.kind == tyStatic: s.ast
= t.n` below the change in sigmatch), now it properly errors that it
couldn't instantiate it as it would for a type param. ~~The change in
semtypinst is just for symmetry with the code above it which also gives
a `cannot instantiate` error, it may or may not be necessary/correct.~~
Now removed, I don't think it was correct.
Still possible that this has unintended consequences.
(cherry picked from commit e8092a5470)
25 lines
509 B
Nim
25 lines
509 B
Nim
discard """
|
|
# just tests that this doesn't crash the compiler
|
|
errormsg: "cannot instantiate: 'a:type'"
|
|
"""
|
|
|
|
# bug #8545
|
|
|
|
template bar(a: static[bool]): untyped = int
|
|
|
|
proc main() =
|
|
proc foo1(a: static[bool]): auto = 1
|
|
doAssert foo1(true) == 1
|
|
|
|
proc foo2(a: static[bool]): bar(a) = 1
|
|
doAssert foo2(true) == 1
|
|
|
|
proc foo3(a: static[bool]): bar(cast[static[bool]](a)) = 1
|
|
doAssert foo3(true) == 1
|
|
|
|
proc foo4(a: static[bool]): bar(static(a)) = 1
|
|
doAssert foo4(true) == 1
|
|
|
|
static: main()
|
|
main()
|