summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorDanil Yarantsev <tiberiumk12@gmail.com>2020-06-24 23:32:01 +0300
committerGitHub <noreply@github.com>2020-06-24 22:32:01 +0200
commit80952cadaab41ab198a22be5f245eb2ea678ddfa (patch)
tree891e7bf664c682f5232ec3676003d6a678550325
parent3e5743d6f72d9953eb97e54c11149c8b77c1062d (diff)
downloadNim-80952cadaab41ab198a22be5f245eb2ea678ddfa.tar.gz
Reject casts to builtin typeclasses (#14788)
* Closes #14231, closes #14452

* Merge test to tcast.nim
-rw-r--r--compiler/semexprs.nim2
-rw-r--r--tests/misc/tcast.nim9
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)