mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-29 01:14:41 +00:00
fixes #16700, fixes #20916, refs #24010 Fixes the instantiation issues for proc param default values encountered in #24010 by: 1. semchecking generic default param values with `inGenericContext` for #22029 and followups to apply (the bigger change in semtypes), 2. rejecting explicit generic instantiations with unresolved generic types inside `inGenericContext` (sigmatch change), 3. instantiating the default param values using `prepareNode` rather than an insufficient manual method (the bigger change in seminst). This had an important side effect of references to other parameters not working since they would be resolved as a symbol belonging to the uninstantiated original generic proc rather than the later instantiated proc. There is a more radical way to fix this which is generating ident nodes with `tyFromExpr` in specifically this context, but instead we just count them as belonging to the same proc in `hoistParamsUsedInDefault`. Other minor bugfixes: * To make the error message in t20883 make sense, we now give a "cannot instantiate" error when trying to instantiate a proc generic param with `tyFromExpr`. * Object constructors as default param values generated default values of private fields going through `evalConstExpr` more than once, but the VM doesn't mark the object fields as `nfSkipFieldChecking` which gives a "cannot access field" error. So the VM now marks object fields it generates as `nfSkipFieldChecking`. Not sure if this affects VM performance, don't see why it would. * The nkRecWhen changes in #24042 didn't cover the case where all conditions are constantly false correctly, this is fixed with a minor change. This isn't needed for this PR now but I encountered it after forgetting to `dec c.inGenericContext`.
23 lines
447 B
Nim
23 lines
447 B
Nim
block: # issue #16700
|
|
type MyObject[T] = object
|
|
x: T
|
|
proc initMyObject[T](value = T.default): MyObject[T] =
|
|
MyObject[T](x: value)
|
|
var obj = initMyObject[int]()
|
|
|
|
block: # issue #20916
|
|
type
|
|
SomeX = object
|
|
v: int
|
|
var val = 0
|
|
proc f(_: type int, x: SomeX, v = x.v) =
|
|
doAssert v == 42
|
|
val = v
|
|
proc a(): proc() =
|
|
let v = SomeX(v: 42)
|
|
var tmp = proc() =
|
|
int.f(v)
|
|
tmp
|
|
a()()
|
|
doAssert val == 42
|