mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 14:25:23 +00:00
remove prev == nil requirement for typedesc params as type nodes (#24206)
fixes #24203 `semTypeNode` is called twice for RHS'es of type sections, [here](b0e6d28782/compiler/semstmts.nim (L1612)) and [here](b0e6d28782/compiler/semstmts.nim (L1646)). Each time `prev` is `s.typ`, but the assertion expects `prev == nil` which is false since `s.typ` is not nil the second time. To fix this, the `prev == nil` part of the assertion is removed. The reason this only happens for types like `seq[int]`, `(int, int)` etc is because they don't have syms: `semTypeIdent` attempts to directly [replace the typedesc param itself](b0e6d28782/compiler/semtypes.nim (L1916)) with the sym of the base type of the resolved typedesc type if it exists, which means `semTypeNode` doesn't receive the typedesc param sym to perform the assert. (cherry picked from commit2a48182288)
This commit is contained in:
@@ -2095,7 +2095,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
|
||||
if s.kind != skError: localError(c.config, n.info, errTypeExpected)
|
||||
result = newOrPrevType(tyError, prev, c)
|
||||
elif s.kind == skParam and s.typ.kind == tyTypeDesc:
|
||||
internalAssert c.config, s.typ.base.kind != tyNone and prev == nil
|
||||
internalAssert c.config, s.typ.base.kind != tyNone
|
||||
result = s.typ.base
|
||||
elif prev == nil:
|
||||
result = s.typ
|
||||
@@ -2119,7 +2119,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
|
||||
if s.kind == skType:
|
||||
s.typ
|
||||
else:
|
||||
internalAssert c.config, s.typ.base.kind != tyNone and prev == nil
|
||||
internalAssert c.config, s.typ.base.kind != tyNone
|
||||
s.typ.base
|
||||
let alias = maybeAliasType(c, t, prev)
|
||||
if alias != nil:
|
||||
|
||||
@@ -157,3 +157,12 @@ block t3338:
|
||||
var t2 = Bar[int32]()
|
||||
t2.add()
|
||||
doAssert t2.x == 5
|
||||
|
||||
block: # issue #24203
|
||||
proc b(G: typedesc) =
|
||||
type U = G
|
||||
template s(h: untyped) = h
|
||||
s(b(typeof (0, 0)))
|
||||
b(seq[int])
|
||||
b((int, int))
|
||||
b(typeof (0, 0))
|
||||
|
||||
Reference in New Issue
Block a user