summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAlbert Safin <xzfcpw@gmail.com>2019-08-31 09:46:13 +0000
committerAlbert Safin <xzfcpw@gmail.com>2019-08-31 10:16:26 +0000
commitefe1bed82e8fa9476b4c9ed2a85802f6fb222cc6 (patch)
treef12af830435549f9f9830aafdb672909ffb6ee9a
parent9ae0dd611f77c4cd7122e6ac77e0278c1bafbbd7 (diff)
downloadNim-efe1bed82e8fa9476b4c9ed2a85802f6fb222cc6.tar.gz
Allow typeof(nil) as a return type
-rw-r--r--compiler/ccgtypes.nim1
-rw-r--r--compiler/jsgen.nim2
-rw-r--r--compiler/types.nim2
-rw-r--r--tests/ccgbugs/tnil_type.nim5
4 files changed, 8 insertions, 2 deletions
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index 1e3826780..5c5999e82 100644
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -155,6 +155,7 @@ proc mapType(conf: ConfigRef; typ: PType): TCTypeKind =
   of tyNone, tyTyped: result = ctVoid
   of tyBool: result = ctBool
   of tyChar: result = ctChar
+  of tyNil: result = ctPtr
   of tySet: result = mapSetType(conf, typ)
   of tyOpenArray, tyArray, tyVarargs, tyUncheckedArray: result = ctArray
   of tyObject, tyTuple: result = ctStruct
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim
index 107fa2b28..1d980ab6f 100644
--- a/compiler/jsgen.nim
+++ b/compiler/jsgen.nim
@@ -1600,6 +1600,8 @@ proc createVar(p: PProc, typ: PType, indirect: bool): Rope =
     result = putToSeq("{}", indirect)
   of tyBool:
     result = putToSeq("false", indirect)
+  of tyNil:
+    result = putToSeq("null", indirect)
   of tyArray:
     let length = toInt(lengthOrd(p.config, t))
     let e = elemType(t)
diff --git a/compiler/types.nim b/compiler/types.nim
index 1473be261..3a5f5fa62 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -1310,7 +1310,7 @@ proc typeAllowedAux(marker: var IntSet, typ: PType, kind: TSymKind,
      tyNone, tyForward, tyFromExpr:
     result = t
   of tyNil:
-    if kind != skConst and kind != skParam: result = t
+    if kind != skConst and kind != skParam and kind != skResult: result = t
   of tyString, tyBool, tyChar, tyEnum, tyInt..tyUInt64, tyCString, tyPointer:
     result = nil
   of tyOrdinal:
diff --git a/tests/ccgbugs/tnil_type.nim b/tests/ccgbugs/tnil_type.nim
index b57e64513..12310dae9 100644
--- a/tests/ccgbugs/tnil_type.nim
+++ b/tests/ccgbugs/tnil_type.nim
@@ -12,4 +12,7 @@ proc f3(_: typedesc) = discard
 f3(typeof(nil))
 
 proc f4[T](_: T) = discard
-f4(nil)
\ No newline at end of file
+f4(nil)
+
+proc f5(): typeof(nil) = nil
+discard f5()