diff options
author | ringabout <43030857+ringabout@users.noreply.github.com> | 2024-05-01 15:02:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-01 09:02:43 +0200 |
commit | 185e06c92362083c06c76f87e325889b1c9dc659 (patch) | |
tree | ab7eaac8fa2601dab0cbb8c2188181be4825d752 | |
parent | d09c3c0f58eb9f1f4cf07fa98a9686aa19778f16 (diff) | |
download | Nim-185e06c92362083c06c76f87e325889b1c9dc659.tar.gz |
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.
-rw-r--r-- | compiler/typeallowed.nim | 9 | ||||
-rw-r--r-- | tests/errmsgs/t23419.nim | 5 |
2 files changed, 11 insertions, 3 deletions
diff --git a/compiler/typeallowed.nim b/compiler/typeallowed.nim index d226b2e06..2f757bb62 100644 --- a/compiler/typeallowed.nim +++ b/compiler/typeallowed.nim @@ -27,6 +27,7 @@ type taProcContextIsNotMacro taIsCastable taIsDefaultField + taVoid # only allow direct void fields of objects/tuples TTypeAllowedFlags* = set[TTypeAllowedFlag] @@ -60,6 +61,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): @@ -115,7 +118,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,12 +187,12 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, t.baseClass != nil and taIsDefaultField notin flags: result = t else: - let flags = flags+{taField} + let flags = flags+{taField, taVoid} result = typeAllowedAux(marker, t.baseClass, kind, c, flags) if result.isNil and t.n != nil: result = typeAllowedNode(marker, t.n, kind, c, flags) of tyTuple: - let flags = flags+{taField} + let flags = flags+{taField, taVoid} for a in t.kids: result = typeAllowedAux(marker, a, kind, c, flags) if result != nil: break diff --git a/tests/errmsgs/t23419.nim b/tests/errmsgs/t23419.nim new file mode 100644 index 000000000..59a72f081 --- /dev/null +++ b/tests/errmsgs/t23419.nim @@ -0,0 +1,5 @@ +discard """ + errormsg: "invalid type: 'void' in this context: '(array[0..-1, void],)' for var" +""" + +var a: (array[0, void], ) |