Merge pull request #1229 from Varriount/fix-1203

Fix issue #1203
This commit is contained in:
Andreas Rumpf 2014-05-31 22:53:36 +02:00
commit cbe25a41b0

View file

@ -176,21 +176,26 @@ proc checkConvertible(c: PContext, castDest, src: PType): TConvStatus =
else: else:
discard discard
proc isCastable(dst, src: PType): bool = proc isCastable(dst, src: PType): bool =
## Checks whether the source type can be casted to the destination type.
## Casting is very unrestrictive; casts are allowed as long as
## castDest.size >= src.size, and typeAllowed(dst, skParam)
#const #const
# castableTypeKinds = {tyInt, tyPtr, tyRef, tyCstring, tyString, # castableTypeKinds = {tyInt, tyPtr, tyRef, tyCstring, tyString,
# tySequence, tyPointer, tyNil, tyOpenArray, # tySequence, tyPointer, tyNil, tyOpenArray,
# tyProc, tySet, tyEnum, tyBool, tyChar} # tyProc, tySet, tyEnum, tyBool, tyChar}
var ds, ss: BiggestInt var dstSize, srcSize: BiggestInt
# this is very unrestrictive; cast is allowed if castDest.size >= src.size
ds = computeSize(dst) dstSize = computeSize(dst)
ss = computeSize(src) srcSize = computeSize(src)
if ds < 0: if dstSize < 0:
result = false result = false
elif ss < 0: elif srcSize < 0:
result = false
elif not typeAllowed(dst, skParam):
result = false result = false
else: else:
result = (ds >= ss) or result = (dstSize >= srcSize) or
(skipTypes(dst, abstractInst).kind in IntegralTypes) or (skipTypes(dst, abstractInst).kind in IntegralTypes) or
(skipTypes(src, abstractInst-{tyTypeDesc}).kind in IntegralTypes) (skipTypes(src, abstractInst-{tyTypeDesc}).kind in IntegralTypes)
@ -254,6 +259,7 @@ proc semConv(c: PContext, n: PNode): PNode =
localError(n.info, errUseQualifier, op.sons[0].sym.name.s) localError(n.info, errUseQualifier, op.sons[0].sym.name.s)
proc semCast(c: PContext, n: PNode): PNode = proc semCast(c: PContext, n: PNode): PNode =
## Semantically analyze a casting ("cast[type](param)")
if optSafeCode in gGlobalOptions: localError(n.info, errCastNotInSafeMode) if optSafeCode in gGlobalOptions: localError(n.info, errCastNotInSafeMode)
#incl(c.p.owner.flags, sfSideEffect) #incl(c.p.owner.flags, sfSideEffect)
checkSonsLen(n, 2) checkSonsLen(n, 2)