fixes #23419; internal error with void in generic array instantiation (#23550)

fixes #23419

`void` is only supported as fields of objects/tuples. It shouldn't allow
void in the array.

I didn't merge it with taField because that flag is also used for
tyLent, which is allowed in the fields of other types.

(cherry picked from commit 185e06c923)
This commit is contained in:
ringabout
2024-05-01 15:02:43 +08:00
committed by narimiran
parent a6e729ed5d
commit d372a0030d
2 changed files with 10 additions and 2 deletions

View File

@@ -27,6 +27,7 @@ type
taProcContextIsNotMacro
taIsCastable
taIsDefaultField
taVoid # only allow direct void fields of objects/tuples
TTypeAllowedFlags* = set[TTypeAllowedFlag]
@@ -58,6 +59,8 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind,
if typ == nil: return nil
if containsOrIncl(marker, typ.id): return nil
var t = skipTypes(typ, abstractInst-{tyTypeDesc, tySink})
let flags = if t.kind == tyVoid: flags else: flags-{taVoid}
case t.kind
of tyVar, tyLent:
if kind in {skProc, skFunc, skConst} and (views notin c.features):
@@ -113,7 +116,7 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind,
of tyStatic:
if kind notin {skParam}: result = t
of tyVoid:
if taField notin flags: result = t
if taVoid notin flags: result = t
of tyTypeClasses:
if tfGenericTypeParam in t.flags or taConcept in flags: #or taField notin flags:
discard
@@ -184,7 +187,7 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind,
t.kind == tyObject and t[0] != nil and taIsDefaultField notin flags:
result = t
else:
let flags = flags+{taField}
let flags = flags+{taField, taVoid}
for i in 0..<t.len:
result = typeAllowedAux(marker, t[i], kind, c, flags)
if result != nil: break

5
tests/errmsgs/t23419.nim Normal file
View File

@@ -0,0 +1,5 @@
discard """
errormsg: "invalid type: 'void' in this context: '(array[0..-1, void],)' for var"
"""
var a: (array[0, void], )