summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2014-01-19 16:54:59 +0100
committerAraq <rumpf_a@web.de>2014-01-19 16:54:59 +0100
commit73c6efdf66dd62370cb04f7ce75640743905edc5 (patch)
tree5ffe8181b782134db74b439fedca073536f3a9f4
parentcde9e5d64421e34d7d844c048213f01c40af5dd7 (diff)
downloadNim-73c6efdf66dd62370cb04f7ce75640743905edc5.tar.gz
'nil' as a statement is deprecated, use an empty 'discard' instead
-rw-r--r--compiler/aliases.nim8
-rw-r--r--compiler/ast.nim2
-rw-r--r--compiler/ccgcalls.nim2
-rw-r--r--compiler/ccgexprs.nim8
-rw-r--r--compiler/ccgmerge.nim2
-rw-r--r--compiler/ccgtrav.nim2
-rw-r--r--compiler/ccgtypes.nim4
-rw-r--r--compiler/cgen.nim4
-rw-r--r--compiler/cgmeth.nim2
-rw-r--r--compiler/depends.nim2
-rw-r--r--compiler/docgen2.nim4
-rw-r--r--compiler/filter_tmpl.nim2
-rw-r--r--compiler/guards.nim2
-rw-r--r--compiler/hlo.nim2
-rw-r--r--compiler/jsgen.nim20
-rw-r--r--compiler/lambdalifting.nim22
-rw-r--r--compiler/lexer.nim2
-rw-r--r--compiler/lookups.nim2
-rw-r--r--compiler/msgs.nim12
-rw-r--r--compiler/nimconf.nim6
-rw-r--r--compiler/nimrod.nimrod.cfg2
-rw-r--r--compiler/parser.nim2
-rw-r--r--compiler/passaux.nim2
-rw-r--r--compiler/patterns.nim4
-rw-r--r--compiler/procfind.nim2
-rw-r--r--compiler/renderer.nim8
-rw-r--r--compiler/rodread.nim2
-rw-r--r--compiler/rodwrite.nim2
-rw-r--r--compiler/semcall.nim2
-rw-r--r--compiler/semexprs.nim45
-rw-r--r--compiler/semfold.nim4
-rw-r--r--compiler/semmagic.nim2
-rw-r--r--compiler/semstmts.nim10
-rw-r--r--compiler/semtypes.nim12
-rw-r--r--compiler/semtypinst.nim4
-rw-r--r--compiler/sigmatch.nim32
-rw-r--r--compiler/suggest.nim2
-rw-r--r--compiler/transf.nim4
-rw-r--r--compiler/types.nim8
-rw-r--r--doc/manual.txt2
-rw-r--r--doc/tut1.txt10
-rw-r--r--doc/tut2.txt25
-rw-r--r--lib/packages/docutils/highlite.nim4
-rw-r--r--lib/packages/docutils/rst.nim12
-rw-r--r--lib/packages/docutils/rstgen.nim2
-rw-r--r--lib/pure/json.nim3
-rw-r--r--lib/pure/osproc.nim2
-rw-r--r--lib/pure/parseutils.nim2
-rw-r--r--lib/pure/sockets.nim2
-rw-r--r--lib/pure/streams.nim2
-rw-r--r--lib/pure/strutils.nim2
-rw-r--r--lib/pure/times.nim2
-rw-r--r--lib/system/gc.nim6
-rw-r--r--web/news.txt5
54 files changed, 170 insertions, 170 deletions
diff --git a/compiler/aliases.nim b/compiler/aliases.nim
index 5be7b5f12..a26b94303 100644
--- a/compiler/aliases.nim
+++ b/compiler/aliases.nim
@@ -54,7 +54,7 @@ proc isPartOfAux(a, b: PType, marker: var TIntSet): TAnalysisResult =
     for i in countup(0, sonsLen(a) - 1): 
       result = isPartOfAux(a.sons[i], b, marker)
       if result == arYes: return 
-  else: nil
+  else: discard
 
 proc isPartOf(a, b: PType): TAnalysisResult = 
   ## checks iff 'a' can be part of 'b'. Iterates over VALUE types!
@@ -140,7 +140,7 @@ proc isPartOf*(a, b: PNode): TAnalysisResult =
       result = isPartOf(a[1], b[1])
     of nkObjUpConv, nkObjDownConv, nkCheckedFieldExpr:
       result = isPartOf(a[0], b[0])
-    else: nil
+    else: discard
     # Calls return a new location, so a default of ``arNo`` is fine.
   else:
     # go down recursively; this is quite demanding:
@@ -177,6 +177,6 @@ proc isPartOf*(a, b: PNode): TAnalysisResult =
         if isPartOf(a.typ, b.typ) != arNo:
           result = isPartOf(a[0], b)
           if result == arNo: result = arMaybe
-      else: nil
-    else: nil
+      else: discard
+    else: discard
 
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 1d356b6d8..0e351a31a 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -1257,7 +1257,7 @@ proc propagateToOwner*(owner, elem: PType) =
       owner.flags.incl tfNeedsInit
   
   if tfNeedsInit in elem.flags:
-    if owner.kind in HaveTheirOwnEmpty: nil
+    if owner.kind in HaveTheirOwnEmpty: discard
     else: owner.flags.incl tfNeedsInit
     
   if tfShared in elem.flags:
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim
index ec1250155..1c6eea621 100644
--- a/compiler/ccgcalls.nim
+++ b/compiler/ccgcalls.nim
@@ -73,7 +73,7 @@ proc isInCurrentFrame(p: BProc, n: PNode): bool =
     result = false
   of nkObjUpConv, nkObjDownConv, nkCheckedFieldExpr:
     result = isInCurrentFrame(p, n.sons[0])
-  else: nil
+  else: discard
 
 proc openArrayLoc(p: BProc, n: PNode): PRope =
   var a: TLoc
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 22a00cf29..9554c6b55 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -202,7 +202,7 @@ proc asgnComplexity(n: PNode): int =
     of nkRecList:
       for t in items(n):
         result += asgnComplexity(t)
-    else: nil
+    else: discard
 
 proc optAsgnLoc(a: TLoc, t: PType, field: PRope): TLoc =
   result.k = locField
@@ -228,7 +228,7 @@ proc genOptAsgnObject(p: BProc, dest, src: TLoc, flags: TAssignmentFlags,
                      optAsgnLoc(src, field.typ, field.loc.r), flags)
   of nkRecList:
     for child in items(t): genOptAsgnObject(p, dest, src, flags, child)
-  else: nil
+  else: discard
 
 proc genGenericAsgn(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
   # Consider: 
@@ -1901,7 +1901,7 @@ proc expr(p: BProc, n: PNode, d: var TLoc) =
   of nkClosure: genClosure(p, n, d)
   of nkMetaNode: expr(p, n.sons[0], d)
 
-  of nkEmpty:  nil
+  of nkEmpty: discard
   of nkWhileStmt: genWhileStmt(p, n)
   of nkVarSection, nkLetSection: genVarStmt(p, n)
   of nkConstSection: genConstStmt(p, n)
@@ -1931,7 +1931,7 @@ proc expr(p: BProc, n: PNode, d: var TLoc) =
   of nkCommentStmt, nkIteratorDef, nkIncludeStmt, 
      nkImportStmt, nkImportExceptStmt, nkExportStmt, nkExportExceptStmt, 
      nkFromStmt, nkTemplateDef, nkMacroDef: 
-    nil
+    discard
   of nkPragma: genPragma(p, n)
   of nkProcDef, nkMethodDef, nkConverterDef: 
     if (n.sons[genericParamsPos].kind == nkEmpty):
diff --git a/compiler/ccgmerge.nim b/compiler/ccgmerge.nim
index 514b77b73..5b04f1358 100644
--- a/compiler/ccgmerge.nim
+++ b/compiler/ccgmerge.nim
@@ -285,7 +285,7 @@ proc readMergeSections(cfilename: string, m: var TMergeSections) =
   withCFile(cfilename):
     readKey(L, k)
     if k == "NIM_merge_INFO":   
-      nil
+      discard
     elif ^L.bufpos == '*' and ^(L.bufpos+1) == '/':
       inc(L.bufpos, 2)
       # read back into section
diff --git a/compiler/ccgtrav.nim b/compiler/ccgtrav.nim
index ecf1eb152..26f474659 100644
--- a/compiler/ccgtrav.nim
+++ b/compiler/ccgtrav.nim
@@ -83,7 +83,7 @@ proc genTraverseProc(c: var TTraversalClosure, accessor: PRope, typ: PType) =
     if typ.callConv == ccClosure:
       lineCg(p, cpsStmts, c.visitorFrmt, rfmt(nil, "$1.ClEnv", accessor))
   else:
-    nil
+    discard
 
 proc genTraverseProcSeq(c: var TTraversalClosure, accessor: PRope, typ: PType) =
   var p = c.p
diff --git a/compiler/ccgtypes.nim b/compiler/ccgtypes.nim
index 79f10b981..c92c15fa9 100644
--- a/compiler/ccgtypes.nim
+++ b/compiler/ccgtypes.nim
@@ -25,7 +25,7 @@ proc mangleField(name: string): string =
     of 'A'..'Z': 
       add(result, chr(ord(name[i]) - ord('A') + ord('a')))
     of '_': 
-      nil
+      discard
     of 'a'..'z', '0'..'9': 
       add(result, name[i])
     else: 
@@ -48,7 +48,7 @@ proc mangle(name: string): string =
     of 'A'..'Z': 
       add(result, chr(ord(name[i]) - ord('A') + ord('a')))
     of '_': 
-      nil
+      discard
     of 'a'..'z', '0'..'9': 
       add(result, name[i])
     else: 
diff --git a/compiler/cgen.nim b/compiler/cgen.nim
index c7de1091b..0e6e48399 100644
--- a/compiler/cgen.nim
+++ b/compiler/cgen.nim
@@ -319,7 +319,7 @@ proc genObjectInit(p: BProc, section: TCProcSection, t: PType, a: TLoc,
                    takeAddr: bool) =
   case analyseObjectWithTypeField(t)
   of frNone:
-    nil
+    discard
   of frHeader:
     var r = rdLoc(a)
     if not takeAddr: r = ropef("(*$1)", [r])
@@ -832,7 +832,7 @@ proc genProcNoForward(m: BModule, prc: PSym) =
     discard cgsym(m, prc.name.s)
     return  
   genProcPrototype(m, prc)
-  if lfNoDecl in prc.loc.flags: nil
+  if lfNoDecl in prc.loc.flags: discard
   elif prc.typ.callConv == ccInline:
     # We add inline procs to the calling module to enable C based inlining.
     # This also means that a check with ``q.declaredThings`` is wrong, we need
diff --git a/compiler/cgmeth.nim b/compiler/cgmeth.nim
index 9613eb525..1c5ce7a21 100644
--- a/compiler/cgmeth.nim
+++ b/compiler/cgmeth.nim
@@ -66,7 +66,7 @@ proc sameMethodBucket(a, b: PSym): bool =
     if sameType(aa, bb) or
         (aa.kind == tyObject) and (bb.kind == tyObject) and
         (inheritanceDiff(bb, aa) < 0):
-      nil
+      discard
     else:
       return
   result = true
diff --git a/compiler/depends.nim b/compiler/depends.nim
index 5b02275c6..a43eaf844 100644
--- a/compiler/depends.nim
+++ b/compiler/depends.nim
@@ -39,7 +39,7 @@ proc addDotDependency(c: PPassContext, n: PNode): PNode =
   of nkStmtList, nkBlockStmt, nkStmtListExpr, nkBlockExpr: 
     for i in countup(0, sonsLen(n) - 1): discard addDotDependency(c, n.sons[i])
   else: 
-    nil
+    discard
 
 proc generateDot(project: string) = 
   writeRope(ropef("digraph $1 {$n$2}$n", [
diff --git a/compiler/docgen2.nim b/compiler/docgen2.nim
index d48f53d15..d76be8e3c 100644
--- a/compiler/docgen2.nim
+++ b/compiler/docgen2.nim
@@ -27,7 +27,7 @@ proc close(p: PPassContext, n: PNode): PNode =
     try:
       generateIndex(g.doc)
     except EIO:
-      nil
+      discard
 
 proc processNode(c: PPassContext, n: PNode): PNode = 
   result = n
@@ -46,4 +46,4 @@ proc myOpen(module: PSym): PPassContext =
 const docgen2Pass* = makePass(open = myOpen, process = processNode, close = close)
 
 proc finishDoc2Pass*(project: string) = 
-  nil
+  discard
diff --git a/compiler/filter_tmpl.nim b/compiler/filter_tmpl.nim
index 806754122..0014e9c78 100644
--- a/compiler/filter_tmpl.nim
+++ b/compiler/filter_tmpl.nim
@@ -55,7 +55,7 @@ proc scanPar(p: var TTmplParser, d: int) =
     of ']': dec(p.bracket)
     of '{': inc(p.curly)
     of '}': dec(p.curly)
-    else: nil
+    else: discard
     inc(i)
 
 proc withInExpr(p: TTmplParser): bool {.inline.} = 
diff --git a/compiler/guards.nim b/compiler/guards.nim
index 3d27c85c9..607bb074a 100644
--- a/compiler/guards.nim
+++ b/compiler/guards.nim
@@ -439,7 +439,7 @@ proc impliesLe(fact, x, c: PNode): TImplication =
         if leValue(c, fact.sons[1].pred): result = impNo
 
   of mNot, mOr, mAnd: internalError(x.info, "impliesLe")
-  else: nil
+  else: discard
 
 proc impliesLt(fact, x, c: PNode): TImplication =
   # x < 3  same as x <= 2:
diff --git a/compiler/hlo.nim b/compiler/hlo.nim
index e3f80ad36..7982d4aa1 100644
--- a/compiler/hlo.nim
+++ b/compiler/hlo.nim
@@ -81,7 +81,7 @@ proc hlo(c: PContext, n: PNode): PNode =
     else:
       # perform type checking, so that the replacement still fits:
       if isEmptyType(n.typ) and isEmptyType(result.typ):
-        nil
+        discard
       else:
         result = fitNode(c, n.typ, result)
       # optimization has been applied so check again:
diff --git a/compiler/jsgen.nim b/compiler/jsgen.nim
index dd06b0235..82c45059c 100644
--- a/compiler/jsgen.nim
+++ b/compiler/jsgen.nim
@@ -143,7 +143,7 @@ proc mangle(name: string): string =
     of 'A'..'Z': 
       add(result, chr(ord(name[i]) - ord('A') + ord('a')))
     of '_': 
-      nil
+      discard
     of 'a'..'z', '0'..'9': 
       add(result, name[i])
     else: add(result, 'X' & toHex(ord(name[i]), 2))
@@ -996,10 +996,10 @@ proc genSym(p: PProc, n: PNode, r: var TCompRes) =
     r.res = s.loc.r
     if lfNoDecl in s.loc.flags or s.magic != mNone or
        {sfImportc, sfInfixCall} * s.flags != {}:
-      nil
+      discard
     elif s.kind == skMethod and s.getBody.kind == nkEmpty:
       # we cannot produce code for the dispatcher yet:
-      nil
+      discard
     elif sfForward in s.flags:
       p.g.forwarded.add(s)
     elif not p.g.generatedSyms.containsOrIncl(s.id):
@@ -1336,10 +1336,10 @@ proc genMagic(p: PProc, n: PNode, r: var TCompRes) =
     else:
       unaryExpr(p, n, r, "", "($1.length-1)")
   of mInc:
-    if not (optOverflowCheck in p.options): binaryExpr(p, n, r, "", "$1 += $2")
+    if optOverflowCheck notin p.options: binaryExpr(p, n, r, "", "$1 += $2")
     else: binaryExpr(p, n, r, "addInt", "$1 = addInt($1, $2)")
   of ast.mDec:
-    if not (optOverflowCheck in p.options): binaryExpr(p, n, r, "", "$1 -= $2")
+    if optOverflowCheck notin p.options: binaryExpr(p, n, r, "", "$1 -= $2")
     else: binaryExpr(p, n, r, "subInt", "$1 = subInt($1, $2)")
   of mSetLengthStr: binaryExpr(p, n, r, "", "$1.length = ($2)-1")
   of mSetLengthSeq: binaryExpr(p, n, r, "", "$1.length = $2")
@@ -1544,7 +1544,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) =
     r.res = toRope(n.intVal)
   of nkNilLit:
     if isEmptyType(n.typ):
-      nil
+      discard
     elif mapType(n.typ) == etyBaseIndex:
       r.typ = etyBaseIndex
       r.address = toRope"null" | toRope"nil"
@@ -1592,12 +1592,12 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) =
   of nkChckRange: genRangeChck(p, n, r, "chckRange")
   of nkStringToCString: convStrToCStr(p, n, r)
   of nkCStringToString: convCStrToStr(p, n, r)
-  of nkEmpty: nil
+  of nkEmpty: discard
   of nkLambdaKinds: 
     let s = n.sons[namePos].sym
     discard mangleName(s)
     r.res = s.loc.r
-    if lfNoDecl in s.loc.flags or s.magic != mNone: nil
+    if lfNoDecl in s.loc.flags or s.magic != mNone: discard
     elif not p.g.generatedSyms.containsOrIncl(s.id):
       app(p.locals, genProc(p, s))
   of nkMetaNode: gen(p, n.sons[0], r)
@@ -1614,7 +1614,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) =
   of nkIfStmt, nkIfExpr: genIf(p, n, r)
   of nkWhileStmt: genWhileStmt(p, n)
   of nkVarSection, nkLetSection: genVarStmt(p, n)
-  of nkConstSection: nil
+  of nkConstSection: discard
   of nkForStmt, nkParForStmt: 
     internalError(n.info, "for statement not eliminated")
   of nkCaseStmt: 
@@ -1633,7 +1633,7 @@ proc gen(p: PProc, n: PNode, r: var TCompRes) =
   of nkRaiseStmt: genRaiseStmt(p, n)
   of nkTypeSection, nkCommentStmt, nkIteratorDef, nkIncludeStmt, 
      nkImportStmt, nkImportExceptStmt, nkExportStmt, nkExportExceptStmt, 
-     nkFromStmt, nkTemplateDef, nkMacroDef, nkPragma: nil
+     nkFromStmt, nkTemplateDef, nkMacroDef, nkPragma: discard
   of nkProcDef, nkMethodDef, nkConverterDef:
     var s = n.sons[namePos].sym
     if {sfExportc, sfCompilerProc} * s.flags == {sfExportc}:
diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim
index 9e42210c0..ed92fefb4 100644
--- a/compiler/lambdalifting.nim
+++ b/compiler/lambdalifting.nim
@@ -1,7 +1,7 @@
 #
 #
 #           The Nimrod Compiler
-#        (c) Copyright 2013 Andreas Rumpf
+#        (c) Copyright 2014 Andreas Rumpf
 #
 #    See the file "copying.txt", included in this
 #    distribution, for details about the copyright.
@@ -275,7 +275,7 @@ proc captureVar(o: POuterContext, i: PInnerContext, local: PSym,
   addCapturedVar(it, local)
   if it == e:
     # common case: local directly in current environment:
-    nil
+    discard
   else:
     # it's in some upper environment:
     access = indirectAccess(access, addDep(e, it, i.fn), info)
@@ -314,7 +314,7 @@ proc gatherVars(o: POuterContext, i: PInnerContext, n: PNode) =
       if o.currentEnv != env:
         discard addDep(o.currentEnv, env, i.fn)
         internalError(n.info, "too complex environment handling required")
-  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: nil
+  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: discard
   else:
     for k in countup(0, sonsLen(n) - 1): 
       gatherVars(o, i, n.sons[k])
@@ -351,7 +351,7 @@ proc makeClosure(prc, env: PSym, info: TLineInfo): PNode =
 
 proc transformInnerProc(o: POuterContext, i: PInnerContext, n: PNode): PNode =
   case n.kind
-  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: nil
+  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: discard
   of nkSym:
     let s = n.sym
     if s == i.fn: 
@@ -371,7 +371,7 @@ proc transformInnerProc(o: POuterContext, i: PInnerContext, n: PNode): PNode =
   of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef, nkTemplateDef,
      nkIteratorDef:
     # don't recurse here:
-    nil
+    discard
   else:
     for j in countup(0, sonsLen(n) - 1):
       let x = transformInnerProc(o, i, n.sons[j])
@@ -386,7 +386,7 @@ proc searchForInnerProcs(o: POuterContext, n: PNode) =
   if n == nil: return
   case n.kind
   of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: 
-    nil
+    discard
   of nkSym:
     if isInnerProc(n.sym, o.fn) and not containsOrIncl(o.processed, n.sym.id):
       var inner = newInnerContext(n.sym)
@@ -422,7 +422,7 @@ proc searchForInnerProcs(o: POuterContext, n: PNode) =
     # counts, not the block where it is captured!
     for i in countup(0, sonsLen(n) - 1):
       var it = n.sons[i]
-      if it.kind == nkCommentStmt: nil
+      if it.kind == nkCommentStmt: discard
       elif it.kind == nkIdentDefs:
         var L = sonsLen(it)
         if it.sons[0].kind != nkSym: internalError(it.info, "transformOuter")
@@ -441,7 +441,7 @@ proc searchForInnerProcs(o: POuterContext, n: PNode) =
      nkIteratorDef:
     # don't recurse here:
     # XXX recurse here and setup 'up' pointers
-    nil
+    discard
   else:
     for i in countup(0, sonsLen(n) - 1):
       searchForInnerProcs(o, n.sons[i])
@@ -500,7 +500,7 @@ proc generateClosureCreation(o: POuterContext, scope: PEnv): PNode =
 proc transformOuterProc(o: POuterContext, n: PNode): PNode =
   if n == nil: return nil
   case n.kind
-  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: nil
+  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: discard
   of nkSym:
     var local = n.sym
     var closure = PEnv(idTableGet(o.lambdasToEnv, local))
@@ -540,7 +540,7 @@ proc transformOuterProc(o: POuterContext, n: PNode): PNode =
   of nkProcDef, nkMethodDef, nkConverterDef, nkMacroDef, nkTemplateDef, 
      nkIteratorDef: 
     # don't recurse here:
-    nil
+    discard
   of nkHiddenStdConv, nkHiddenSubConv, nkConv:
     let x = transformOuterProc(o, n.sons[1])
     if x != nil: n.sons[1] = x
@@ -625,7 +625,7 @@ proc transfIterBody(c: var TIterContext, n: PNode): PNode =
     if interestingIterVar(s) and c.iter.id == s.owner.id:
       if not containsOrIncl(c.capturedVars, s.id): addField(c.tup, s)
       result = indirectAccess(newSymNode(c.closureParam), s, n.info)
-  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: nil
+  of nkEmpty..pred(nkSym), succ(nkSym)..nkNilLit: discard
   of nkYieldStmt:
     inc c.state.typ.n.sons[1].intVal
     let stateNo = c.state.typ.n.sons[1].intVal
diff --git a/compiler/lexer.nim b/compiler/lexer.nim
index 93aea7f61..97414ddb7 100644
--- a/compiler/lexer.nim
+++ b/compiler/lexer.nim
@@ -434,7 +434,7 @@ proc handleHexChar(L: var TLexer, xi: var int) =
   of 'A'..'F': 
     xi = (xi shl 4) or (ord(L.buf[L.bufpos]) - ord('A') + 10)
     inc(L.bufpos)
-  else: nil
+  else: discard
 
 proc handleDecChars(L: var TLexer, xi: var int) = 
   while L.buf[L.bufpos] in {'0'..'9'}: 
diff --git a/compiler/lookups.nim b/compiler/lookups.nim
index 57c420d3b..6dfd25968 100644
--- a/compiler/lookups.nim
+++ b/compiler/lookups.nim
@@ -286,7 +286,7 @@ proc initOverloadIter*(o: var TOverloadIter, c: PContext, n: PNode): PSym =
     o.symChoiceIndex = 1
     o.inSymChoice = initIntSet()
     incl(o.inSymChoice, result.id)
-  else: nil
+  else: discard
   if result != nil and result.kind == skStub: loadStub(result)
 
 proc lastOverloadScope*(o: TOverloadIter): int =
diff --git a/compiler/msgs.nim b/compiler/msgs.nim
index d7944a182..61336aa87 100644
--- a/compiler/msgs.nim
+++ b/compiler/msgs.nim
@@ -113,7 +113,7 @@ type
     warnDifferentHeaps, warnWriteToForeignHeap, warnImplicitClosure,
     warnEachIdentIsTuple, warnShadowIdent, 
     warnProveInit, warnProveField, warnProveIndex,
-    warnUninit, warnUser,
+    warnUninit, warnGcMem, warnUser,
     hintSuccess, hintSuccessX,
     hintLineTooLong, hintXDeclaredButNotUsed, hintConvToBaseNotNeeded,
     hintConvFromXtoItselfNotNeeded, hintExprAlwaysX, hintQuitCalled,
@@ -370,6 +370,7 @@ const
     warnProveField: "cannot prove that field '$1' is accessible [ProveField]",
     warnProveIndex: "cannot prove index '$1' is valid [ProveIndex]",
     warnUninit: "'$1' might not have been initialized [Uninit]",
+    warnGcMem: "'$1' uses GC'ed memory [GcMem]",
     warnUser: "$1 [User]", 
     hintSuccess: "operation successful [Success]", 
     hintSuccessX: "operation successful ($# lines compiled; $# sec total; $#) [SuccessX]", 
@@ -389,7 +390,7 @@ const
     hintUser: "$1 [User]"]
 
 const
-  WarningsToStr*: array[0..23, string] = ["CannotOpenFile", "OctalEscape", 
+  WarningsToStr*: array[0..24, string] = ["CannotOpenFile", "OctalEscape", 
     "XIsNeverRead", "XmightNotBeenInit",
     "Deprecated", "ConfigDeprecated",
     "SmallLshouldNotBeUsed", "UnknownMagic", 
@@ -397,7 +398,7 @@ const
     "CommentXIgnored", "NilStmt",
     "AnalysisLoophole", "DifferentHeaps", "WriteToForeignHeap",
     "ImplicitClosure", "EachIdentIsTuple", "ShadowIdent", 
-    "ProveInit", "ProveField", "ProveIndex", "Uninit", "User"]
+    "ProveInit", "ProveField", "ProveIndex", "Uninit", "GcMem", "User"]
 
   HintsToStr*: array[0..15, string] = ["Success", "SuccessX", "LineTooLong", 
     "XDeclaredButNotUsed", "ConvToBaseNotNeeded", "ConvFromXtoItselfNotNeeded", 
@@ -856,6 +857,5 @@ ropes.errorHandler = proc (err: TRopesError, msg: string, useWarning: bool) =
   of rTokenTooLong:
     internalError("ropes: token too long: " & msg)
   of rCannotOpenFile:
-    rawMessage(if useWarning: warnCannotOpenFile else: errCannotOpenFile,
-               msg)
- 
+    rawMessage(if useWarning: warnCannotOpenFile else: errCannotOpenFile, msg)
+
diff --git a/compiler/nimconf.nim b/compiler/nimconf.nim
index 2bdfbe0b8..136a0d454 100644
--- a/compiler/nimconf.nim
+++ b/compiler/nimconf.nim
@@ -101,11 +101,11 @@ proc jumpToDirective(L: var TLexer, tok: var TToken, dest: TJumpDest) =
           break 
         if nestedIfs > 0: dec(nestedIfs)
       else: 
-        nil
+        discard
       ppGetTok(L, tok)
-    elif tok.tokType == tkEof: 
+    elif tok.tokType == tkEof:
       lexMessage(L, errTokenExpected, "@end")
-    else: 
+    else:
       ppGetTok(L, tok)
   
 proc parseDirective(L: var TLexer, tok: var TToken) = 
diff --git a/compiler/nimrod.nimrod.cfg b/compiler/nimrod.nimrod.cfg
index b2ae97686..657c47b28 100644
--- a/compiler/nimrod.nimrod.cfg
+++ b/compiler/nimrod.nimrod.cfg
@@ -16,3 +16,5 @@ import:testability
 @if windows:
   cincludes: "$lib/wrappers/libffi/common"
 @end
+
+cs:partial
diff --git a/compiler/parser.nim b/compiler/parser.nim
index e7a15c8ab..c44036c5f 100644
--- a/compiler/parser.nim
+++ b/compiler/parser.nim
@@ -1817,7 +1817,7 @@ proc parseStmt(p: var TParser): PNode =
     withInd(p):
       while true:
         if p.tok.indent == p.currInd:
-          nil
+          discard
         elif p.tok.tokType == tkSemiColon:
           getTok(p)
           if p.tok.indent < 0 or p.tok.indent == p.currInd: discard
diff --git a/compiler/passaux.nim b/compiler/passaux.nim
index 79d11419b..0ba9f22d0 100644
--- a/compiler/passaux.nim
+++ b/compiler/passaux.nim
@@ -41,7 +41,7 @@ proc cleanUp(c: PPassContext, n: PNode): PNode =
       if sfDeadCodeElim notin getModule(s).flags and not astNeeded(s): 
         s.ast.sons[bodyPos] = ast.emptyNode # free the memory
   else: 
-    nil
+    discard
 
 const cleanupPass* = makePass(process = cleanUp, close = cleanUp)
 
diff --git a/compiler/patterns.nim b/compiler/patterns.nim
index 54f8d3af4..d262790ab 100644
--- a/compiler/patterns.nim
+++ b/compiler/patterns.nim
@@ -40,7 +40,7 @@ proc canonKind(n: PNode): TNodeKind =
   of nkCallKinds: result = nkCall
   of nkStrLit..nkTripleStrLit: result = nkStrLit
   of nkFastAsgn: result = nkAsgn
-  else: nil
+  else: discard
 
 proc sameKinds(a, b: PNode): bool {.inline.} =
   result = a.kind == b.kind or a.canonKind == b.canonKind
@@ -267,7 +267,7 @@ proc applyRule*(c: PContext, s: PSym, n: PNode): PNode =
       var rs = result.sons[i]
       let param = params.sons[i].sym
       case whichAlias(param)
-      of aqNone: nil
+      of aqNone: discard
       of aqShouldAlias:
         # it suffices that it aliases for sure with *some* other param:
         var ok = false
diff --git a/compiler/procfind.nim b/compiler/procfind.nim
index eb0cbca3f..0354d585d 100644
--- a/compiler/procfind.nim
+++ b/compiler/procfind.nim
@@ -60,7 +60,7 @@ proc searchForProcOld*(c: PContext, scope: PScope, fn: PSym): PSym =
           localError(fn.info, errNotOverloadable, fn.name.s)
           return
         of paramsNotEqual:
-          nil
+          discard
       result = nextIdentIter(it, scope.symbols)
 
 proc searchForProcNew(c: PContext, scope: PScope, fn: PSym): PSym =
diff --git a/compiler/renderer.nim b/compiler/renderer.nim
index 6c7d9cae3..b5e3c0e74 100644
--- a/compiler/renderer.nim
+++ b/compiler/renderer.nim
@@ -236,7 +236,7 @@ proc containsNL(s: string): bool =
     of '\x0D', '\x0A': 
       return true
     else: 
-      nil
+      discard
   result = false
 
 proc pushCom(g: var TSrcGen, n: PNode) = 
@@ -487,7 +487,7 @@ proc hasCom(n: PNode): bool =
   result = false
   if n.comment != nil: return true
   case n.kind
-  of nkEmpty..nkNilLit: nil
+  of nkEmpty..nkNilLit: discard
   else: 
     for i in countup(0, sonsLen(n) - 1): 
       if hasCom(n.sons[i]): return true
@@ -769,7 +769,7 @@ proc gsub(g: var TSrcGen, n: PNode, c: TContext) =
   if n.comment != nil: pushCom(g, n)
   case n.kind                 # atoms:
   of nkTripleStrLit: putRawStr(g, tkTripleStrLit, n.strVal)
-  of nkEmpty: nil
+  of nkEmpty: discard
   of nkType: put(g, tkInvalid, atom(n))
   of nkSym, nkIdent: gident(g, n)
   of nkIntLit: put(g, tkIntLit, atom(n))
@@ -1273,7 +1273,7 @@ proc renderModule(n: PNode, filename: string,
     case n.sons[i].kind
     of nkTypeSection, nkConstSection, nkVarSection, nkLetSection,
        nkCommentStmt: putNL(g)
-    else: nil
+    else: discard
   gcoms(g)
   if optStdout in gGlobalOptions:
     write(stdout, g.buf)
diff --git a/compiler/rodread.nim b/compiler/rodread.nim
index 7a35f0c84..b53135a95 100644
--- a/compiler/rodread.nim
+++ b/compiler/rodread.nim
@@ -539,7 +539,7 @@ proc cmdChangeTriggersRecompilation(old, new: TCommands): bool =
   of cmdNone, cmdDoc, cmdInterpret, cmdPretty, cmdGenDepend, cmdDump,
       cmdCheck, cmdParse, cmdScan, cmdIdeTools, cmdDef, 
       cmdRst2html, cmdRst2tex, cmdInteractive, cmdRun:
-    nil
+    discard
   # else: trigger recompilation:
   result = true
   
diff --git a/compiler/rodwrite.nim b/compiler/rodwrite.nim
index c393ce1da..4231da2d0 100644
--- a/compiler/rodwrite.nim
+++ b/compiler/rodwrite.nim
@@ -573,7 +573,7 @@ proc process(c: PPassContext, n: PNode): PNode =
   of nkPragma: 
     addStmt(w, n)
   else: 
-    nil
+    discard
 
 proc myOpen(module: PSym): PPassContext =
   if module.id < 0: internalError("rodwrite: module ID not set")
diff --git a/compiler/semcall.nim b/compiler/semcall.nim
index 5990f2e96..6b19dc359 100644
--- a/compiler/semcall.nim
+++ b/compiler/semcall.nim
@@ -71,7 +71,7 @@ proc pickBestCandidate(c: PContext, headSymbol: PNode,
           var cmp = cmpCandidates(best, z)
           if cmp < 0: best = z   # x is better than the best so far
           elif cmp == 0: alt = z # x is as good as the best so far
-          else: nil
+          else: discard
     sym = nextOverloadIter(o, c, headSymbol)
 
 proc notFoundError*(c: PContext, n: PNode, errors: seq[string]) =
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 0d74db1ce..6e2d777fb 100644
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -168,7 +168,7 @@ proc checkConvertible(c: PContext, castDest, src: PType): TConvStatus =
       if not compareTypes(castDest, src, dcEqIgnoreDistinct):
         result = convNotLegal
     else:
-      nil
+      discard
 
 proc isCastable(dst, src: PType): bool = 
   #const
@@ -204,7 +204,7 @@ proc semConv(c: PContext, n: PNode): PNode =
   if not isSymChoice(op):
     let status = checkConvertible(c, result.typ, op.typ)
     case status
-    of convOK: nil
+    of convOK: discard
     of convNotNeedeed:
       message(n.info, hintConvFromXtoItselfNotNeeded, result.typ.typeToString)
     of convNotLegal:
@@ -397,7 +397,7 @@ proc changeType(n: PNode, newType: PType, check: bool) =
   of nkPar: 
     if newType.kind != tyTuple: 
       internalError(n.info, "changeType: no tuple type for constructor")
-    elif newType.n == nil: nil
+    elif newType.n == nil: discard
     elif sonsLen(n) > 0 and n.sons[0].kind == nkExprColonExpr: 
       for i in countup(0, sonsLen(n) - 1): 
         var m = n.sons[i].sons[0]
@@ -423,7 +423,7 @@ proc changeType(n: PNode, newType: PType, check: bool) =
       if value < firstOrd(newType) or value > lastOrd(newType):
         localError(n.info, errGenerated, "cannot convert " & $value &
                                          " to " & typeToString(newType))
-  else: nil
+  else: discard
   n.typ = newType
 
 proc arrayConstrType(c: PContext, n: PNode): PType = 
@@ -513,7 +513,7 @@ proc fixAbstractType(c: PContext, n: PNode) =
       # an implicitly constructed array (passed to an open array):
       n.sons[i] = semArrayConstr(c, it, {})
     else: 
-      nil
+      discard
       #if (it.typ == nil): 
       #  InternalError(it.info, "fixAbstractType: " & renderTree(it))  
   
@@ -677,7 +677,7 @@ proc semOverloadedCallAnalyseEffects(c: PContext, n: PNode, nOrig: PNode,
       return
     let callee = result.sons[0].sym
     case callee.kind
-    of skMacro, skTemplate: nil
+    of skMacro, skTemplate: discard
     else:
       if (callee.kind == skIterator) and (callee.id == c.p.owner.id): 
         localError(n.info, errRecursiveDependencyX, callee.name.s)
@@ -1098,7 +1098,7 @@ proc takeImplicitAddr(c: PContext, n: PNode): PNode =
   of nkHiddenDeref, nkDerefExpr: return n.sons[0]
   of nkBracketExpr:
     if len(n) == 1: return n.sons[0]
-  else: nil
+  else: discard
   var valid = isAssignable(c, n)
   if valid != arLValue:
     if valid == arLocalLValue:
@@ -1207,7 +1207,7 @@ proc semProcBody(c: PContext, n: PNode): PNode =
     # transform ``expr`` to ``result = expr``, but not if the expr is already
     # ``result``:
     if result.kind == nkSym and result.sym == c.p.resultSym:
-      nil
+      discard
     elif result.kind == nkNilLit:
       # or ImplicitlyDiscardable(result):
       # new semantic: 'result = x' triggers the void context
@@ -1244,7 +1244,7 @@ proc semYieldVarResult(c: PContext, n: PNode, restype: PType) =
           a.sons[i] = takeImplicitAddr(c, a.sons[i])
         else:
           localError(n.sons[0].info, errXExpected, "tuple constructor")
-  else: nil
+  else: discard
   
 proc semYield(c: PContext, n: PNode): PNode =
   result = n
@@ -1472,7 +1472,7 @@ proc tryExpr(c: PContext, n: PNode,
     result = semExpr(c, n, flags)
     if msgs.gErrorCounter != oldErrorCount: result = nil
   except ERecoverableError:
-    nil
+    discard
   # undo symbol table changes (as far as it's possible):
   c.generics = oldGenerics
   c.inGenericContext = oldInGenericContext
@@ -1590,9 +1590,9 @@ proc semSetConstr(c: PContext, n: PNode): PNode =
           typ = skipTypes(n.sons[i].typ, {tyGenericInst, tyVar, tyOrdinal})
     if not isOrdinalType(typ):
       localError(n.info, errOrdinalTypeExpected)
-      typ = makeRangeType(c, 0, MaxSetElements - 1, n.info)
+      typ = makeRangeType(c, 0, MaxSetElements-1, n.info)
     elif lengthOrd(typ) > MaxSetElements: 
-      typ = makeRangeType(c, 0, MaxSetElements - 1, n.info)
+      typ = makeRangeType(c, 0, MaxSetElements-1, n.info)
     addSonSkipIntLit(result.typ, typ)
     for i in countup(0, sonsLen(n) - 1): 
       var m: PNode
@@ -1629,27 +1629,27 @@ proc semTableConstr(c: PContext, n: PNode): PNode =
   if lastKey != n.len: illFormedAst(n)
   result = semExpr(c, result)
 
-type 
-  TParKind = enum 
+type
+  TParKind = enum
     paNone, paSingle, paTupleFields, paTuplePositions
 
-proc checkPar(n: PNode): TParKind = 
+proc checkPar(n: PNode): TParKind =
   var length = sonsLen(n)
   if length == 0: 
     result = paTuplePositions # ()
   elif length == 1: 
     result = paSingle         # (expr)
-  else: 
+  else:
     if n.sons[0].kind == nkExprColonExpr: result = paTupleFields
     else: result = paTuplePositions
-    for i in countup(0, length - 1): 
-      if result == paTupleFields: 
+    for i in countup(0, length - 1):
+      if result == paTupleFields:
         if (n.sons[i].kind != nkExprColonExpr) or
-            not (n.sons[i].sons[0].kind in {nkSym, nkIdent}): 
+            not (n.sons[i].sons[0].kind in {nkSym, nkIdent}):
           localError(n.sons[i].info, errNamedExprExpected)
           return paNone
-      else: 
-        if n.sons[i].kind == nkExprColonExpr: 
+      else:
+        if n.sons[i].kind == nkExprColonExpr:
           localError(n.sons[i].info, errNamedExprNotAllowed)
           return paNone
 
@@ -1659,8 +1659,7 @@ proc semTupleFieldsConstr(c: PContext, n: PNode, flags: TExprFlags): PNode =
   typ.n = newNodeI(nkRecList, n.info) # nkIdentDefs
   var ids = initIntSet()
   for i in countup(0, sonsLen(n) - 1):
-    if (n.sons[i].kind != nkExprColonExpr) or
-        not (n.sons[i].sons[0].kind in {nkSym, nkIdent}):
+    if n[i].kind != nkExprColonExpr or n[i][0].kind notin {nkSym, nkIdent}:
       illFormedAst(n.sons[i])
     var id: PIdent
     if n.sons[i].sons[0].kind == nkIdent: id = n.sons[i].sons[0].ident
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index 1d03e6888..78e5cdd5e 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -222,7 +222,7 @@ proc getIntervalType*(m: TMagic, n: PNode): PType =
     commutativeOp(min)
   of mMaxI, mMaxI64:
     commutativeOp(max)
-  else: nil
+  else: discard
   
 discard """
   mShlI, mShlI64,
@@ -546,7 +546,7 @@ proc foldArrayAccess(m: PSym, n: PNode): PNode =
     if (idx >= 0) and (idx < len(x.strVal)): 
       result.intVal = ord(x.strVal[int(idx)])
     elif idx == len(x.strVal): 
-      nil
+      discard
     else: 
       localError(n.info, errIndexOutOfBounds)
   else: discard
diff --git a/compiler/semmagic.nim b/compiler/semmagic.nim
index a1af94971..4caf1fb8e 100644
--- a/compiler/semmagic.nim
+++ b/compiler/semmagic.nim
@@ -53,7 +53,7 @@ proc semTypeTraits(c: PContext, n: PNode): PNode =
   if t.sonsLen > 0:
     # This is either a type known to sem or a typedesc
     # param to a regular proc (again, known at instantiation)
-    result = evalTypeTrait(n[0], t, GetCurrOwner())
+    result = evalTypeTrait(n[0], t, getCurrOwner())
   else:
     # a typedesc variable, pass unmodified to evals
     result = n
diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim
index f0007d01e..1aa6a793c 100644
--- a/compiler/semstmts.nim
+++ b/compiler/semstmts.nim
@@ -136,6 +136,7 @@ proc discardCheck(c: PContext, result: PNode) =
   if result.typ != nil and result.typ.kind notin {tyStmt, tyEmpty}:
     if result.kind == nkNilLit:
       result.typ = nil
+      message(result.info, warnNilStatement)
     elif implicitlyDiscardable(result):
       var n = result
       result.typ = nil
@@ -145,10 +146,11 @@ proc discardCheck(c: PContext, result: PNode) =
     elif c.inTypeClass > 0 and result.typ.kind == tyBool:
       let verdict = semConstExpr(c, result)
       if verdict.intVal == 0:
-        localError(result.info, "type class predicate failed.")
+        localError(result.info, "type class predicate failed")
     elif result.typ.kind != tyError and gCmd != cmdInteractive:
       if result.typ.kind == tyNil:
         fixNilType(result)
+        message(result.info, warnNilStatement)
       else:
         var n = result
         while n.kind in skipForDiscardable: n = n.lastSon
@@ -996,7 +998,7 @@ proc semProcAux(c: PContext, n: PNode, kind: TSymKind,
   if proto == nil: 
     s.typ.callConv = lastOptionEntry(c).defaultCC
     # add it here, so that recursive procs are possible:
-    if sfGenSym in s.flags: nil
+    if sfGenSym in s.flags: discard
     elif kind in OverloadableSyms:
       if not typeIsDetermined:
         addInterfaceOverloadableSymAt(c, s.scope, s)
@@ -1252,9 +1254,9 @@ proc semStmtList(c: PContext, n: PNode): PNode =
       of LastBlockStmts: 
         for j in countup(i + 1, length - 1): 
           case n.sons[j].kind
-          of nkPragma, nkCommentStmt, nkNilLit, nkEmpty: nil
+          of nkPragma, nkCommentStmt, nkNilLit, nkEmpty: discard
           else: localError(n.sons[j].info, errStmtInvalidAfterReturn)
-      else: nil
+      else: discard
   if result.len == 1:
     result = result.sons[0]
   when false:
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index 64c8f81e2..d5a938a12 100644
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -537,7 +537,7 @@ proc semRecordNodeAux(c: PContext, n: PNode, check: var TIntSet, pos: var int,
       if a.kind == nkEmpty: addSon(father, newSymNode(f))
       else: addSon(a, newSymNode(f))
     if a.kind != nkEmpty: addSon(father, a)
-  of nkEmpty: nil
+  of nkEmpty: discard
   else: illFormedAst(n)
   
 proc addInheritedFieldsAux(c: PContext, check: var TIntSet, pos: var int, 
@@ -615,7 +615,7 @@ proc addParamOrResult(c: PContext, param: PSym, kind: TSymKind) =
 let typedescId = getIdent"typedesc"
 
 template shouldHaveMeta(t) =
-  InternalAssert tfHasMeta in t.flags
+  internalAssert tfHasMeta in t.flags
   # result.lastSon.flags.incl tfHasMeta
 
 proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode,
@@ -745,7 +745,7 @@ proc liftParamType(c: PContext, procKind: TSymKind, genericParams: PNode,
       else:
         result = addImplicitGeneric(newTypeS(tyAnything, c))
  
-  else: nil
+  else: discard
 
   # result = liftingWalk(paramType)
 
@@ -939,7 +939,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
   result = nil
   if gCmd == cmdIdeTools: suggestExpr(c, n)
   case n.kind
-  of nkEmpty: nil
+  of nkEmpty: discard
   of nkTypeOfExpr:
     # for ``type(countup(1,3))``, see ``tests/ttoseq``.
     checkSonsLen(n, 1)
@@ -977,7 +977,7 @@ proc semTypeNode(c: PContext, n: PNode, prev: PType): PType =
             result = freshType(result, prev)
             result.flags.incl(tfNotNil)
           else:
-            LocalError(n.info, errGenerated, "invalid type")
+            localError(n.info, errGenerated, "invalid type")
         of 2:
           let negated = semTypeNode(c, n.sons[1], prev)
           result = makeNotType(c, negated)
@@ -1137,7 +1137,7 @@ proc processMagicType(c: PContext, m: PSym) =
   of mSet: setMagicType(m, tySet, 0) 
   of mSeq: setMagicType(m, tySequence, 0)
   of mOrdinal: setMagicType(m, tyOrdinal, 0)
-  of mPNimrodNode: nil
+  of mPNimrodNode: discard
   else: localError(m.info, errTypeExpected)
   
 proc semGenericConstraints(c: PContext, x: PType): PType =
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim
index b08119d4a..ac14179cd 100644
--- a/compiler/semtypinst.nim
+++ b/compiler/semtypinst.nim
@@ -22,7 +22,7 @@ proc checkPartialConstructedType(info: TLineInfo, t: PType) =
 
 proc checkConstructedType*(info: TLineInfo, typ: PType) =
   var t = typ.skipTypes({tyDistinct})
-  if t.kind in tyTypeClasses: nil
+  if t.kind in tyTypeClasses: discard
   elif tfAcyclic in t.flags and skipTypes(t, abstractInst).kind != tyObject: 
     localError(info, errInvalidPragmaX, "acyclic")
   elif t.kind == tyVar and t.sons[0].kind == tyVar: 
@@ -364,7 +364,7 @@ proc replaceTypeVarsTAux(cl: var TReplTypeVars, t: PType): PType =
   of tyGenericInst:
     result = instCopyType(cl, t)
     for i in 1 .. <result.sonsLen:
-      result.sons[i] = ReplaceTypeVarsT(cl, result.sons[i])
+      result.sons[i] = replaceTypeVarsT(cl, result.sons[i])
     propagateToOwner(result, result.lastSon)
   
   else:
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 7066c5afd..1fe667a3c 100644
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -381,7 +381,7 @@ proc procTypeRel(c: var TCandidate, f, a: PType): TTypeRelation =
     when useEffectSystem:
       if not compatibleEffects(f, a): return isNone
   of tyNil: result = f.allowsNil
-  else: nil
+  else: discard
 
 proc typeRangeRel(f, a: PType): TTypeRelation {.noinline.} =
   let
@@ -477,7 +477,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
   of tyAnything:
     return if f.kind == tyAnything: isGeneric
            else: isNone
-  else: nil
+  else: discard
 
   case f.kind
   of tyEnum:
@@ -530,7 +530,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
       result = typeRel(c, f.sons[1], a.sons[1])
       if result < isGeneric: result = isNone
       elif lengthOrd(fRange) != lengthOrd(a): result = isNone
-    else: nil
+    else: discard
   of tyOpenArray, tyVarargs:
     case a.kind
     of tyOpenArray, tyVarargs:
@@ -551,7 +551,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
         result = isConvertible
       elif typeRel(c, base(f), a.sons[0]) >= isGeneric: 
         result = isConvertible
-    else: nil
+    else: discard
   of tySequence:
     case a.kind
     of tySequence:
@@ -563,7 +563,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
         elif tfNotNil in f.flags and tfNotNil notin a.flags:
           result = isNilConversion
     of tyNil: result = f.allowsNil
-    else: nil
+    else: discard
   of tyOrdinal:
     if isOrdinalType(a):
       var x = if a.kind == tyOrdinal: a.sons[0] else: a
@@ -607,7 +607,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
       elif tfNotNil in f.flags and tfNotNil notin a.flags:
         result = isNilConversion
     of tyNil: result = f.allowsNil
-    else: nil
+    else: discard
   of tyRef: 
     case a.kind
     of tyRef:
@@ -616,7 +616,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
       elif tfNotNil in f.flags and tfNotNil notin a.flags:
         result = isNilConversion
     of tyNil: result = f.allowsNil
-    else: nil
+    else: discard
   of tyProc:
     result = procTypeRel(c, f, a)
     if result != isNone and tfNotNil in f.flags and tfNotNil notin a.flags:
@@ -632,7 +632,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
     of tyProc:
       if a.callConv != ccClosure: result = isConvertible
     of tyPtr, tyCString: result = isConvertible
-    else: nil
+    else: discard
   of tyString: 
     case a.kind
     of tyString: 
@@ -641,7 +641,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
       else:
         result = isEqual
     of tyNil: result = f.allowsNil
-    else: nil
+    else: discard
   of tyCString:
     # conversion from string to cstring is automatic:
     case a.kind
@@ -659,7 +659,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
           (skipTypes(a.sons[0], {tyRange}).kind in {tyInt..tyInt64}) and
           (a.sons[1].kind == tyChar): 
         result = isConvertible
-    else: nil
+    else: discard
 
   of tyEmpty:
     if a.kind == tyEmpty: result = isEqual
@@ -691,7 +691,7 @@ proc typeRel(c: var TCandidate, f, aOrig: PType, doBind = true): TTypeRelation =
     if x.kind == tyGenericInvokation or f.sons[0].kind != tyGenericBody:
       #InternalError("typeRel: tyGenericInvokation -> tyGenericInvokation")
       # simply no match for now:
-      nil
+      discard
     elif x.kind == tyGenericInst and 
           (f.sons[0] == x.sons[0]) and
           (sonsLen(x) - 1 == sonsLen(f)):
@@ -947,10 +947,10 @@ proc matchUserTypeClass*(c: PContext, m: var TCandidate,
     if e == nil: return nil
 
     case e.kind
-    of nkReturnStmt: nil
-    of nkTypeSection: nil
-    of nkConstDef: nil
-    else: nil
+    of nkReturnStmt: discard
+    of nkTypeSection: discard
+    of nkConstDef: discard
+    else: discard
   
   result = arg
   put(m.bindings, f, a)
@@ -976,7 +976,7 @@ proc paramTypesMatchAux(m: var TCandidate, f, argType: PType,
  
   var
     r: TTypeRelation
-    a = if c.InTypeClass > 0: argType.skipTypes({tyTypeDesc})
+    a = if c.inTypeClass > 0: argType.skipTypes({tyTypeDesc})
         else: argType
  
   case fMaybeStatic.kind
diff --git a/compiler/suggest.nim b/compiler/suggest.nim
index 1fde831b7..49611f649 100644
--- a/compiler/suggest.nim
+++ b/compiler/suggest.nim
@@ -103,7 +103,7 @@ proc suggestObject(c: PContext, n: PNode, outputs: var int) =
       suggestObject(c, n.sons[0], outputs)
       for i in countup(1, L-1): suggestObject(c, lastSon(n.sons[i]), outputs)
   of nkSym: suggestField(c, n.sym, outputs)
-  else: nil
+  else: discard
 
 proc nameFits(c: PContext, s: PSym, n: PNode): bool = 
   var op = n.sons[0]
diff --git a/compiler/transf.nim b/compiler/transf.nim
index 2332d0b48..f22433972 100644
--- a/compiler/transf.nim
+++ b/compiler/transf.nim
@@ -193,7 +193,7 @@ proc transformConstSection(c: PTransf, v: PNode): PTransNode =
 
 proc hasContinue(n: PNode): bool = 
   case n.kind
-  of nkEmpty..nkNilLit, nkForStmt, nkParForStmt, nkWhileStmt: nil
+  of nkEmpty..nkNilLit, nkForStmt, nkParForStmt, nkWhileStmt: discard
   of nkContinueStmt: result = true
   else: 
     for i in countup(0, sonsLen(n) - 1): 
@@ -536,7 +536,7 @@ proc getMergeOp(n: PNode): PSym =
     if (n.sons[0].kind == nkSym) and (n.sons[0].sym.kind == skProc) and
         (sfMerge in n.sons[0].sym.flags): 
       result = n.sons[0].sym
-  else: nil
+  else: discard
 
 proc flattenTreeAux(d, a: PNode, op: PSym) = 
   var op2 = getMergeOp(a)
diff --git a/compiler/types.nim b/compiler/types.nim
index 36c9f1934..d7310596f 100644
--- a/compiler/types.nim
+++ b/compiler/types.nim
@@ -345,7 +345,7 @@ proc canFormAcycleAux(marker: var TIntSet, typ: PType, startId: int): bool =
     #  # damn inheritance may introduce cycles:
     #  result = true
   of tyProc: result = typ.callConv == ccClosure
-  else: nil
+  else: discard
 
 proc canFormAcycle(typ: PType): bool =
   var marker = initIntSet()
@@ -432,10 +432,10 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
     if t.len == 0: result = "typedesc"
     else: result = "typedesc[" & typeToString(t.sons[0]) & "]"
   of tyStatic:
-    InternalAssert t.len > 0
+    internalAssert t.len > 0
     result = "static[" & typeToString(t.sons[0]) & "]"
   of tyTypeClass:
-    InternalAssert t.sym != nil and t.sym.owner != nil
+    internalAssert t.sym != nil and t.sym.owner != nil
     return t.sym.owner.name.s
   of tyBuiltInTypeClass:
     return "TypeClass"
@@ -446,7 +446,7 @@ proc typeToString(typ: PType, prefer: TPreferedDesc = preferName): string =
   of tyNot:
     result = "not " & typeToString(t.sons[0])
   of tyExpr:
-    InternalAssert t.len == 0
+    internalAssert t.len == 0
     result = "expr"
   of tyFromExpr:
     result = renderTree(t.n)
diff --git a/doc/manual.txt b/doc/manual.txt
index f6dd1f521..c90373233 100644
--- a/doc/manual.txt
+++ b/doc/manual.txt
@@ -1333,7 +1333,7 @@ Examples:
     # has default calling convention
     echo "x: ", mouseX, " y: ", mouseY
   
-  proc setOnMouseMove(mouseMoveEvent: TOnMouseMove) = nil
+  proc setOnMouseMove(mouseMoveEvent: TOnMouseMove) = discard
   
   # ok, 'onMouseMove' has the default calling convention, which is compatible
   # to 'closure':
diff --git a/doc/tut1.txt b/doc/tut1.txt
index 2e7f9d27f..1ba3253c8 100644
--- a/doc/tut1.txt
+++ b/doc/tut1.txt
@@ -324,12 +324,12 @@ the compiler that for every other value nothing should be done:
   case n
   of 0..2, 4..7: echo("The number is in the set: {0, 1, 2, 4, 5, 6, 7}")
   of 3, 8: echo("The number is 3 or 8")
-  else: nil
+  else: discard
 
-The ``nil`` statement is a *do nothing* statement. The compiler knows that a
-case statement with an else part cannot fail and thus the error disappears. Note
-that it is impossible to cover all possible string values: that is why there is
-no such check for string cases.
+The empty ``discard`` statement is a *do nothing* statement. The compiler knows
+that a case statement with an else part cannot fail and thus the error 
+disappears. Note that it is impossible to cover all possible string values: 
+that is why there is no such check for string cases.
 
 In general the case statement is used for subrange types or enumerations where
 it is of great help that the compiler checks that you covered any possible
diff --git a/doc/tut2.txt b/doc/tut2.txt
index f8fa4aef3..581239cc7 100644
--- a/doc/tut2.txt
+++ b/doc/tut2.txt
@@ -614,7 +614,7 @@ simple proc for logging:
 
 .. code-block:: nimrod
   const
-    debug = True
+    debug = true
 
   proc log(msg: string) {.inline.} =
     if debug: stdout.writeln(msg)
@@ -631,7 +631,7 @@ Turning the ``log`` proc into a template solves this problem:
 
 .. code-block:: nimrod
   const
-    debug = True
+    debug = true
 
   template log(msg: string) =
     if debug: stdout.writeln(msg)
@@ -674,16 +674,15 @@ via a special ``:`` syntax:
 
   template withFile(f: expr, filename: string, mode: TFileMode,
                     body: stmt): stmt {.immediate.} =
-    block:
-      let fn = filename
-      var f: TFile
-      if open(f, fn, mode):
-        try:
-          body
-        finally:
-          close(f)
-      else:
-        quit("cannot open: " & fn)
+    let fn = filename
+    var f: TFile
+    if open(f, fn, mode):
+      try:
+        body
+      finally:
+        close(f)
+    else:
+      quit("cannot open: " & fn)
       
   withFile(txt, "ttempl3.txt", fmWrite):
     txt.writeln("line 1")
@@ -784,7 +783,7 @@ regular expressions:
   macro case_token(n: stmt): stmt =
     # creates a lexical analyzer from regular expressions
     # ... (implementation is an exercise for the reader :-)
-    nil
+    discard
 
   case_token: # this colon tells the parser it is a macro statement
   of r"[A-Za-z_]+[A-Za-z_0-9]*":
diff --git a/lib/packages/docutils/highlite.nim b/lib/packages/docutils/highlite.nim
index b41a37309..db7a63928 100644
--- a/lib/packages/docutils/highlite.nim
+++ b/lib/packages/docutils/highlite.nim
@@ -73,7 +73,7 @@ proc initGeneralTokenizer*(g: var TGeneralTokenizer, buf: string) =
   g.pos = pos
 
 proc deinitGeneralTokenizer*(g: var TGeneralTokenizer) = 
-  nil
+  discard
 
 proc nimGetKeyword(id: string): TTokenClass = 
   for k in nimrodKeywords:
@@ -102,7 +102,7 @@ proc nimNumberPostfix(g: var TGeneralTokenizer, position: int): int =
       if g.buf[pos] in {'0'..'9'}: inc(pos)
       if g.buf[pos] in {'0'..'9'}: inc(pos)
     else: 
-      nil
+      discard
   result = pos
 
 proc nimNumber(g: var TGeneralTokenizer, position: int): int = 
diff --git a/lib/packages/docutils/rst.nim b/lib/packages/docutils/rst.nim
index e6ffadcbd..bb018bc1e 100644
--- a/lib/packages/docutils/rst.nim
+++ b/lib/packages/docutils/rst.nim
@@ -535,7 +535,7 @@ proc match(p: TRstParser, start: int, expr: string): bool =
         case p.tok[j].symbol[0]
         of 'a'..'z', 'A'..'Z': result = len(p.tok[j].symbol) == 1
         of '0'..'9': result = allCharsInSet(p.tok[j].symbol, {'0'..'9'})
-        else: nil
+        else: discard
     else: 
       var c = expr[i]
       var length = 0
@@ -640,7 +640,7 @@ proc parseUrl(p: var TRstParser, father: PRstNode) =
     var n = newRstNode(rnStandaloneHyperlink)
     while true: 
       case p.tok[p.idx].kind
-      of tkWord, tkAdornment, tkOther: nil
+      of tkWord, tkAdornment, tkOther: discard
       of tkPunct: 
         if p.tok[p.idx+1].kind notin {tkWord, tkAdornment, tkOther, tkPunct}:
           break
@@ -806,7 +806,7 @@ proc parseInline(p: var TRstParser, father: PRstNode) =
         return
     add(father, newLeaf(p))
     inc(p.idx)
-  else: nil
+  else: discard
   
 proc getDirective(p: var TRstParser): string = 
   if p.tok[p.idx].kind == tkWhite and p.tok[p.idx+1].kind == tkWord: 
@@ -1339,7 +1339,7 @@ proc parseSection(p: var TRstParser, result: PRstNode) =
     of rnDirective: a = parseDotDot(p)
     of rnEnumList: a = parseEnumList(p)
     of rnLeaf: rstMessage(p, meNewSectionExpected)
-    of rnParagraph: nil
+    of rnParagraph: discard
     of rnDefList: a = parseDefinitionList(p)
     of rnFieldList: 
       if p.idx > 0: dec(p.idx)
@@ -1351,7 +1351,7 @@ proc parseSection(p: var TRstParser, result: PRstNode) =
     of rnOptionList: a = parseOptionList(p)
     else:
       #InternalError("rst.parseSection()")
-      nil
+      discard
     if a == nil and k != rnDirective: 
       a = newRstNode(rnParagraph)
       parseParagraph(p, a)
@@ -1624,7 +1624,7 @@ proc resolveSubs(p: var TRstParser, n: PRstNode): PRstNode =
       add(result, n)
       add(result, y)
   of rnLeaf: 
-    nil
+    discard
   of rnContents: 
     p.hasToc = true
   else: 
diff --git a/lib/packages/docutils/rstgen.nim b/lib/packages/docutils/rstgen.nim
index a56f62448..5c09d521e 100644
--- a/lib/packages/docutils/rstgen.nim
+++ b/lib/packages/docutils/rstgen.nim
@@ -165,7 +165,7 @@ proc nextSplitPoint*(s: string, start: int): int =
     of 'a'..'z': 
       if result + 1 < len(s) + 0: 
         if s[result + 1] in {'A'..'Z'}: return 
-    else: nil
+    else: discard
     inc(result)
   dec(result)                 # last valid index
   
diff --git a/lib/pure/json.nim b/lib/pure/json.nim
index 360a3a5e7..7424bbae9 100644
--- a/lib/pure/json.nim
+++ b/lib/pure/json.nim
@@ -626,7 +626,7 @@ proc len*(n: PJsonNode): int =
   case n.kind
   of JArray: result = n.elems.len
   of JObject: result = n.fields.len
-  else: nil
+  else: discard
 
 proc `[]`*(node: PJsonNode, name: string): PJsonNode =
   ## Gets a field from a `JObject`. Returns nil if the key is not found.
@@ -646,6 +646,7 @@ proc hasKey*(node: PJsonNode, key: string): bool =
   assert(node.kind == JObject)
   for k, item in items(node.fields):
     if k == key: return true
+
 proc existsKey*(node: PJsonNode, key: string): bool {.deprecated.} = node.hasKey(key)
   ## Deprecated for `hasKey`
 
diff --git a/lib/pure/osproc.nim b/lib/pure/osproc.nim
index fe4303d8a..7b59deec7 100644
--- a/lib/pure/osproc.nim
+++ b/lib/pure/osproc.nim
@@ -329,7 +329,7 @@ when defined(Windows) and not defined(useNimRtl):
       handle: THandle
       atTheEnd: bool
 
-  proc hsClose(s: PStream) = nil # nothing to do here
+  proc hsClose(s: PStream) = discard # nothing to do here
   proc hsAtEnd(s: PStream): bool = return PFileHandleStream(s).atTheEnd
 
   proc hsReadData(s: PStream, buffer: pointer, bufLen: int): int =
diff --git a/lib/pure/parseutils.nim b/lib/pure/parseutils.nim
index 6423b3ab0..484ba5184 100644
--- a/lib/pure/parseutils.nim
+++ b/lib/pure/parseutils.nim
@@ -370,7 +370,7 @@ iterator interpolatedFragments*(s: string): tuple[kind: TInterpolatedKind,
           of '\0':
             raise newException(EInvalidValue, 
               "Expected closing '}': " & s[i..s.len])
-          else: nil
+          else: discard
           inc j
         inc i, 2 # skip ${
         kind = ikExpr
diff --git a/lib/pure/sockets.nim b/lib/pure/sockets.nim
index de445dd36..b56153cc0 100644
--- a/lib/pure/sockets.nim
+++ b/lib/pure/sockets.nim
@@ -1523,7 +1523,7 @@ proc skip*(socket: TSocket) {.tags: [FReadIO], deprecated.} =
   ## **Deprecated since version 0.9.2**: This function is not safe for use.
   const bufSize = 1000
   var buf = alloc(bufSize)
-  while recv(socket, buf, bufSize) == bufSize: nil
+  while recv(socket, buf, bufSize) == bufSize: discard
   dealloc(buf)
 
 proc skip*(socket: TSocket, size: int, timeout = -1) =
diff --git a/lib/pure/streams.nim b/lib/pure/streams.nim
index 302742eb4..e944dd2fc 100644
--- a/lib/pure/streams.nim
+++ b/lib/pure/streams.nim
@@ -281,7 +281,7 @@ proc newFileStream*(filename: string, mode: TFileMode): PFileStream =
 
 
 when true:
-  nil
+  discard
 else:
   type
     TFileHandle* = cint ## Operating system file handle
diff --git a/lib/pure/strutils.nim b/lib/pure/strutils.nim
index 20109cfa2..de8dc5e51 100644
--- a/lib/pure/strutils.nim
+++ b/lib/pure/strutils.nim
@@ -304,7 +304,7 @@ proc countLines*(s: string): int {.noSideEffect,
       if s[i+1] == '\l': inc i
       inc result
     of '\l': inc result
-    else: nil
+    else: discard
     inc i
 
 proc split*(s: string, seps: set[char] = Whitespace): seq[string] {.
diff --git a/lib/pure/times.nim b/lib/pure/times.nim
index be3e5d6da..6186fcad8 100644
--- a/lib/pure/times.nim
+++ b/lib/pure/times.nim
@@ -698,7 +698,7 @@ proc format*(info: TTimeInfo, f: string): string =
       of "ZZZ":
         result.add(info.tzname)
       of "":
-        nil # Do nothing.
+        discard
       else:
         raise newException(EInvalidValue, "Invalid format string: " & currentF)
       
diff --git a/lib/system/gc.nim b/lib/system/gc.nim
index 0fb9bb482..820093b3e 100644
--- a/lib/system/gc.nim
+++ b/lib/system/gc.nim
@@ -1029,11 +1029,7 @@ when not defined(useNimRtl):
         dec(gch.recGcLock)
 
   proc GC_setStrategy(strategy: TGC_Strategy) =
-    case strategy
-    of gcThroughput: nil
-    of gcResponsiveness: nil
-    of gcOptimizeSpace: nil
-    of gcOptimizeTime: nil
+    discard
 
   proc GC_enableMarkAndSweep() =
     gch.cycleThreshold = InitialCycleThreshold
diff --git a/web/news.txt b/web/news.txt
index c518bfc95..ce5f80fd2 100644
--- a/web/news.txt
+++ b/web/news.txt
@@ -3,7 +3,7 @@ News
 ====
 
 
-2013-XX-XX Version 0.9.4 released
+2014-XX-XX Version 0.9.4 released
 =================================
 
 
@@ -37,6 +37,7 @@ Changes affecting backwards compatibility
   passed to shell, instead of just adding double quotes.
 - ``macros.dumpTree`` and ``macros.dumpLisp`` have been made ``immediate``,
   ``dumpTreeImm`` and ``dumpLispImm`` are now deprecated.
+- The ``nil`` statement has been deprecated, use an empty ``discard`` instead.
 
 
 Compiler Additions
@@ -68,7 +69,7 @@ Language Additions
   fields at compile-time.
 - The overload resolution now supports ``static[T]`` params that must be
   evaluatable at compile-time.
-- Support for user-defined type classes have been added.
+- Support for user-defined type classes has been added.
 
 
 Tools improvements