forbid casting to bare unchecked array (#11186)

* fixes #11180, forbid casting to unchecked array.
* allow UncheckedArray as param
This commit is contained in:
Arne Döring
2019-05-08 09:36:27 +02:00
committed by Andreas Rumpf
parent a5fb0acf5f
commit 34405db80f
3 changed files with 23 additions and 7 deletions

View File

@@ -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})

View File

@@ -0,0 +1,9 @@
discard """
errormsg: '''
invalid type: 'UncheckedArray[uint8]' for var
'''
"""
var
rawMem = alloc0(20)
byteUA = cast[UncheckedArray[uint8]](rawMem)

View File

@@ -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)