From 80952cadaab41ab198a22be5f245eb2ea678ddfa Mon Sep 17 00:00:00 2001 From: Danil Yarantsev Date: Wed, 24 Jun 2020 23:32:01 +0300 Subject: [PATCH] Reject casts to builtin typeclasses (#14788) * Closes #14231, closes #14452 * Merge test to tcast.nim --- compiler/semexprs.nim | 2 ++ tests/misc/tcast.nim | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 6f267b4eb3..a9d45615e4 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 a8d1cf306f..745b9e221b 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)