diff options
-rw-r--r-- | compiler/types.nim | 17 | ||||
-rw-r--r-- | tests/errmsgs/tuncheckedarrayvar.nim | 9 | ||||
-rw-r--r-- | tests/macros/tmacros_issues.nim | 4 |
3 files changed, 23 insertions, 7 deletions
diff --git a/compiler/types.nim b/compiler/types.nim index a40a94421..ce80949b5 100644 --- a/compiler/types.nim +++ b/compiler/types.nim @@ -1199,9 +1199,9 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, case t2.kind of tyVar, tyLent: if taHeap notin flags: result = t2 # ``var var`` is illegal on the heap - of tyOpenArray: + of tyOpenArray, tyUncheckedArray: if kind != skParam: result = t - else: result = typeAllowedAux(marker, t2, kind, flags) + else: result = typeAllowedAux(marker, t2.sons[0], skParam, flags) else: if kind notin {skParam, skResult}: result = t else: result = typeAllowedAux(marker, t2, kind, flags) @@ -1235,14 +1235,21 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind, result = nil of tyOrdinal: if kind != skParam: result = t - of tyGenericInst, tyDistinct, tyAlias, tyInferred, tyUncheckedArray: + of tyGenericInst, tyDistinct, tyAlias, tyInferred: result = typeAllowedAux(marker, lastSon(t), kind, flags) of tyRange: if skipTypes(t.sons[0], abstractInst-{tyTypeDesc}).kind notin {tyChar, tyEnum, tyInt..tyFloat128, tyUInt8..tyUInt32}: result = t of tyOpenArray, tyVarargs, tySink: - if kind != skParam: result = t - else: result = typeAllowedAux(marker, t.sons[0], skVar, flags) + if kind != skParam: + result = t + else: + result = typeAllowedAux(marker, t.sons[0], skVar, flags) + of tyUncheckedArray: + if kind != skParam and taHeap notin flags: + result = t + else: + result = typeAllowedAux(marker, lastSon(t), kind, flags) of tySequence, tyOpt: if t.sons[0].kind != tyEmpty: result = typeAllowedAux(marker, t.sons[0], skVar, flags+{taHeap}) diff --git a/tests/errmsgs/tuncheckedarrayvar.nim b/tests/errmsgs/tuncheckedarrayvar.nim new file mode 100644 index 000000000..17965914a --- /dev/null +++ b/tests/errmsgs/tuncheckedarrayvar.nim @@ -0,0 +1,9 @@ +discard """ +errormsg: ''' +invalid type: 'UncheckedArray[uint8]' for var +''' +""" + +var + rawMem = alloc0(20) + byteUA = cast[UncheckedArray[uint8]](rawMem) diff --git a/tests/macros/tmacros_issues.nim b/tests/macros/tmacros_issues.nim index 657f30fc4..d32b6a2a2 100644 --- a/tests/macros/tmacros_issues.nim +++ b/tests/macros/tmacros_issues.nim @@ -4,7 +4,7 @@ IntLit 5 proc (x: int): string => typeDesc[proc[string, int]] proc (x: int): void => typeDesc[proc[void, int]] proc (x: int) => typeDesc[proc[void, int]] -x => UncheckedArray[int] +x => seq[int] a s d @@ -111,7 +111,7 @@ block t2211: showType(proc(x:int): void) showType(proc(x:int)) - var x: UncheckedArray[int] + var x: seq[int] showType(x) |