diff options
author | Danil Yarantsev <tiberiumk12@gmail.com> | 2020-06-24 23:32:01 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-24 22:32:01 +0200 |
commit | 80952cadaab41ab198a22be5f245eb2ea678ddfa (patch) | |
tree | 891e7bf664c682f5232ec3676003d6a678550325 | |
parent | 3e5743d6f72d9953eb97e54c11149c8b77c1062d (diff) | |
download | Nim-80952cadaab41ab198a22be5f245eb2ea678ddfa.tar.gz |
Reject casts to builtin typeclasses (#14788)
* Closes #14231, closes #14452 * Merge test to tcast.nim
-rw-r--r-- | compiler/semexprs.nim | 2 | ||||
-rw-r--r-- | tests/misc/tcast.nim | 9 |
2 files changed, 10 insertions, 1 deletions
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 6f267b4eb..a9d45615e 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -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) diff --git a/tests/misc/tcast.nim b/tests/misc/tcast.nim index a8d1cf306..745b9e221 100644 --- a/tests/misc/tcast.nim +++ b/tests/misc/tcast.nim @@ -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) |