commit
cbe25a41b0
1 changed files with 14 additions and 8 deletions
|
|
@ -177,20 +177,25 @@ proc checkConvertible(c: PContext, castDest, src: PType): TConvStatus =
|
||||||
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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue