summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/semfold.nim2
-rw-r--r--lib/posix/posix_linux_amd64_consts.nim2
-rw-r--r--tests/ccgbugs/t15623.nim11
-rw-r--r--tests/ccgbugs/t15623_2.nim13
4 files changed, 26 insertions, 2 deletions
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 9b21c5fa3..f38359a64 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -674,7 +674,7 @@ proc getConstExpr(m: PSym, n: PNode; idgen: IdGenerator; g: ModuleGraph): PNode
   of nkCast:
     var a = getConstExpr(m, n[1], idgen, g)
     if a == nil: return
-    if n.typ != nil and n.typ.kind in NilableTypes:
+    if n.typ != nil and n.typ.kind in NilableTypes and a.kind != nkNilLit:
       # we allow compile-time 'cast' for pointer types:
       result = a
       result.typ = n.typ
diff --git a/lib/posix/posix_linux_amd64_consts.nim b/lib/posix/posix_linux_amd64_consts.nim
index f3230f71d..917c1f966 100644
--- a/lib/posix/posix_linux_amd64_consts.nim
+++ b/lib/posix/posix_linux_amd64_consts.nim
@@ -365,7 +365,7 @@ const SCHED_RR* = cint(2)
 const SCHED_OTHER* = cint(0)
 
 # <semaphore.h>
-const SEM_FAILED* = cast[pointer]((nil))
+const SEM_FAILED* = nil
 
 # <signal.h>
 const SIGEV_NONE* = cint(1)
diff --git a/tests/ccgbugs/t15623.nim b/tests/ccgbugs/t15623.nim
new file mode 100644
index 000000000..c8246c85b
--- /dev/null
+++ b/tests/ccgbugs/t15623.nim
@@ -0,0 +1,11 @@
+discard """
+  action: "compile"
+"""
+
+# bug #15623
+block:
+  echo cast[ptr int](nil)[]
+
+block:
+  var x: ref int = nil
+  echo cast[ptr int](x)[]
diff --git a/tests/ccgbugs/t15623_2.nim b/tests/ccgbugs/t15623_2.nim
new file mode 100644
index 000000000..4f33bc745
--- /dev/null
+++ b/tests/ccgbugs/t15623_2.nim
@@ -0,0 +1,13 @@
+discard """
+  output: '''0
+0
+'''
+"""
+
+# bug #15623
+block:
+  echo cast[int](cast[ptr int](nil))
+
+block:
+  var x: ref int = nil
+  echo cast[int](cast[ptr int](x))