mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
Reject casts to builtin typeclasses (#14788)
* Closes #14231, closes #14452 * Merge test to tcast.nim
This commit is contained in:
@@ -191,6 +191,8 @@ proc isCastable(conf: ConfigRef; dst, src: PType): bool =
|
||||
return false
|
||||
if skipTypes(src, abstractInst-{tyTypeDesc}).kind == tyTypeDesc:
|
||||
return false
|
||||
if skipTypes(dst, abstractInst).kind == tyBuiltInTypeClass:
|
||||
return false
|
||||
if conf.selectedGC in {gcArc, gcOrc}:
|
||||
let d = skipTypes(dst, abstractInst)
|
||||
let s = skipTypes(src, abstractInst)
|
||||
|
||||
@@ -10,15 +10,22 @@ type MyProc3 = proc() #{.closure.} is implicit
|
||||
|
||||
proc testProc() = echo "Hello World"
|
||||
|
||||
template reject(x) = doAssert(not compiles(x))
|
||||
|
||||
proc callPointer(p: pointer) =
|
||||
# can cast to proc(){.cdecl.}
|
||||
let ffunc0 = cast[MyProc](p)
|
||||
# can cast to proc(){.nimcall.}
|
||||
let ffunc1 = cast[MyProc2](p)
|
||||
# cannot cast to proc(){.closure.}
|
||||
doAssert(not compiles(cast[MyProc3](p)))
|
||||
reject: cast[MyProc3](p)
|
||||
|
||||
ffunc0()
|
||||
ffunc1()
|
||||
|
||||
callPointer(cast[pointer](testProc))
|
||||
|
||||
reject: discard cast[enum](0)
|
||||
proc a = echo "hi"
|
||||
|
||||
reject: discard cast[ptr](a)
|
||||
|
||||
Reference in New Issue
Block a user