summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/vmgen.nim13
-rw-r--r--lib/pure/unittest.nim11
-rw-r--r--lib/windows/windows.nim19
-rw-r--r--tests/assert/tunittests.nim2
-rw-r--r--tests/template/utemplates.nim2
-rw-r--r--todo.txt1
6 files changed, 20 insertions, 28 deletions
diff --git a/compiler/vmgen.nim b/compiler/vmgen.nim
index af1991bad..aea05bb2c 100644
--- a/compiler/vmgen.nim
+++ b/compiler/vmgen.nim
@@ -204,10 +204,13 @@ proc gen(c: PCtx; n: PNode) =
 proc genx(c: PCtx; n: PNode): TRegister =
   var tmp: TDest = -1
   gen(c, n, tmp)
+  internalAssert tmp >= 0
   result = TRegister(tmp)
 
 proc clearDest(n: PNode; dest: var TDest) {.inline.} =
-  if isEmptyType(n.typ): dest = -1
+  # stmt is different from 'void' in meta programming contexts.
+  # So we only set dest to -1 if 'void':
+  if n.typ.isNil or n.typ.kind == tyEmpty: dest = -1
 
 proc isNotOpr(n: PNode): bool =
   n.kind in nkCallKinds and n.sons[0].kind == nkSym and
@@ -442,7 +445,6 @@ proc genCall(c: PCtx; n: PNode; dest: var TDest) =
   else:
     c.gABC(n, opcIndCallAsgn, dest, x, n.len)
   c.freeTempRange(x, n.len)
-  clearDest(n, dest)
 
 proc needsAsgnPatch(n: PNode): bool = 
   n.kind in {nkBracketExpr, nkDotExpr, nkCheckedFieldExpr}
@@ -590,6 +592,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
     unused(n, dest)
     var d = c.genx(n.sons[1]).TDest
     c.genAddSubInt(n, d, if m == mInc: opcAddInt else: opcSubInt)
+    c.genAsgnPatch(n.sons[1], d)
     c.freeTemp(d.TRegister)
   of mOrd, mChr, mArrToSeq: c.gen(n.sons[1], dest)
   of mNew, mNewFinalize:
@@ -685,6 +688,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
     var d = c.genx(n.sons[1])
     var tmp = c.genx(n.sons[2])
     c.gABC(n, if m == mSetLengthStr: opcSetLenStr else: opcSetLenSeq, d, tmp)
+    c.genAsgnPatch(n.sons[1], d)
     c.freeTemp(tmp)
   of mSwap: 
     unused(n, dest)
@@ -838,6 +842,7 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
   of mNGenSym: genBinaryABC(c, n, dest, opcGenSym)
   of mMinI, mMaxI, mMinI64, mMaxI64, mAbsF64, mMinF64, mMaxF64, mAbsI, mAbsI64:
     c.genCall(n, dest)
+    clearDest(n, dest)
   of mExpandToAst:
     if n.len != 2:
       globalError(n.info, errGenerated, "expandToAst requires 1 argument")
@@ -845,7 +850,10 @@ proc genMagic(c: PCtx; n: PNode; dest: var TDest) =
     if arg.kind in nkCallKinds:
       #if arg[0].kind != nkSym or arg[0].sym.kind notin {skTemplate, skMacro}:
       #      "ExpandToAst: expanded symbol is no macro or template"
+      if dest < 0: dest = c.getTemp(n.typ)
       c.genCall(arg, dest)
+      # do not call clearDest(n, dest) here as getAst has a meta-type as such
+      # produces a value
     else:
       globalError(n.info, "expandToAst requires a call expression")
   else:
@@ -1248,6 +1256,7 @@ proc gen(c: PCtx; n: PNode; dest: var TDest) =
       genMagic(c, n, dest)
     else:
       genCall(c, n, dest)
+      clearDest(n, dest)
   of nkCharLit..nkInt64Lit:
     if isInt16Lit(n):
       if dest < 0: dest = c.getTemp(n.typ)
diff --git a/lib/pure/unittest.nim b/lib/pure/unittest.nim
index f847d24f4..f5640a1b4 100644
--- a/lib/pure/unittest.nim
+++ b/lib/pure/unittest.nim
@@ -37,8 +37,8 @@ var
   
   checkpoints: seq[string] = @[]
 
-template TestSetupIMPL*: stmt {.immediate, dirty.} = nil
-template TestTeardownIMPL*: stmt {.immediate, dirty.} = nil
+template TestSetupIMPL*: stmt {.immediate, dirty.} = discard
+template TestTeardownIMPL*: stmt {.immediate, dirty.} = discard
 
 proc shouldRun(testName: string): bool =
   result = true
@@ -126,7 +126,7 @@ macro check*(conditions: stmt): stmt {.immediate.} =
     for i in 1 .. <exp.len:
       if exp[i].kind notin nnkLiterals:
         inc counter
-        var arg = newIdentNode(":p" & ($counter))
+        var arg = newIdentNode(":p" & $counter)
         var argStr = exp[i].toStrLit
         if exp[i].kind in nnkCallKinds: inspectArgs(exp[i])
         argsAsgns.add getAst(asgn(arg, exp[i]))
@@ -146,7 +146,8 @@ macro check*(conditions: stmt): stmt {.immediate.} =
       
     var checkedStr = checked.toStrLit
     inspectArgs(checked)
-    result = getAst(rewrite(checked, checked.lineinfo, checkedStr, argsAsgns, argsPrintOuts))
+    result = getAst(rewrite(checked, checked.lineinfo, checkedStr,
+                            argsAsgns, argsPrintOuts))
 
   of nnkStmtList:
     result = newNimNode(nnkStmtList)
@@ -176,7 +177,7 @@ macro expect*(exceptions: varargs[expr], body: stmt): stmt {.immediate.} =
       checkpoint(lineInfoLit & ": Expect Failed, no exception was thrown.")
       fail()
     except errorTypes:
-      nil
+      discard
 
   var body = exp[exp.len - 1]
 
diff --git a/lib/windows/windows.nim b/lib/windows/windows.nim
index 9b55b47b9..dd743ffa4 100644
--- a/lib/windows/windows.nim
+++ b/lib/windows/windows.nim
@@ -21856,15 +21856,9 @@ proc InflateRect*(lprc: var TRect, dx, dy: int): WINBOOL{.stdcall,
     dynlib: "user32", importc: "InflateRect".}

 proc InitializeAcl*(pAcl: var TACL, nAclLength, dwAclRevision: DWORD): WINBOOL{.

     stdcall, dynlib: "advapi32", importc: "InitializeAcl".}

-proc InitializeCriticalSectionAndSpinCount*(

-    lpCriticalSection: var TRTLCriticalSection, dwSpinCount: DWORD): WINBOOL{.

-    stdcall, dynlib: "kernel32",

-    importc: "InitializeCriticalSectionAndSpinCount".}

 proc InitializeSid*(Sid: Pointer, pIdentifierAuthority: TSIDIdentifierAuthority,

                     nSubAuthorityCount: int8): WINBOOL{.stdcall,

     dynlib: "advapi32", importc: "InitializeSid".}

-proc InsertMenuItem*(p1: HMENU, p2: UINT, p3: WINBOOL, p4: TMenuItemInfo): WINBOOL{.

-    stdcall, dynlib: "user32", importc: "InsertMenuItemA".}

 proc InsertMenuItemA*(p1: HMENU, p2: UINT, p3: WINBOOL, p4: TMenuItemInfoA): WINBOOL{.

     stdcall, dynlib: "user32", importc: "InsertMenuItemA".}

   #function InsertMenuItemW(p1: HMENU; p2: UINT; p3: WINBOOL; const p4: TMenuItemInfoW): WINBOOL; stdcall; external 'user32' name 'InsertMenuItemW';

@@ -22362,11 +22356,6 @@ proc SetConsoleCursorInfo*(hConsoleOutput: THandle,
                            lpConsoleCursorInfo: TConsoleCursorInfo): WINBOOL{.

     stdcall, dynlib: "kernel32", importc: "SetConsoleCursorInfo".}

   #function SetConsoleWindowInfo(hConsoleOutput: THandle; bAbsolute: WINBOOL; const lpConsoleWindow: TSmallRect): WINBOOL; stdcall; external 'kernel32' name 'SetConsoleWindowInfo';

-proc SetCriticalSectionSpinCount*(lpCriticalSection: var TRTLCriticalSection,

-                                  dwSpinCount: DWORD): DWORD{.stdcall,

-    dynlib: "kernel32", importc: "SetCriticalSectionSpinCount".}

-proc SetDeviceGammaRamp*(DC: HDC, Ramp: pointer): WINBOOL{.stdcall,

-    dynlib: "gdi32", importc: "SetDeviceGammaRamp".}

 proc SetDIBColorTable*(DC: HDC, p2, p3: UINT, RGBQuadSTructs: pointer): UINT{.

     stdcall, dynlib: "gdi32", importc: "SetDIBColorTable".}

 proc SetDIBits*(DC: HDC, Bitmap: HBITMAP, StartScan, NumScans: UINT,

@@ -22476,8 +22465,6 @@ proc TranslateMDISysAccel*(hWndClient: HWND, lpMsg: TMsg): WINBOOL{.stdcall,
 proc TranslateMessage*(lpMsg: TMsg): WINBOOL{.stdcall, dynlib: "user32",

     importc: "TranslateMessage".}

   #function TransparentDIBits(DC: HDC; p2, p3, p4, p5: Integer; const p6: Pointer; const p7: PBitmapInfo; p8: UINT; p9, p10, p11, p12: Integer; p13: UINT): WINBOOL;stdcall; external 'gdi32' name 'TransparentDIBits';

-proc TryEnterCriticalSection*(lpCriticalSection: var TRTLCriticalSection): WINBOOL{.

-    stdcall, dynlib: "kernel32", importc: "TryEnterCriticalSection".}

 proc UnhandledExceptionFilter*(ExceptionInfo: TExceptionPointers): int32{.

     stdcall, dynlib: "kernel32", importc: "UnhandledExceptionFilter".}

 proc UnionRect*(lprcDst: var TRect, lprcSrc1, lprcSrc2: TRect): WINBOOL{.

@@ -22847,12 +22834,6 @@ proc SUBLANGID*(lgid: int32): int32 =
   # return type might be wrong

   result = toU16(lgid) shr 10'i16

 

-proc LANGIDFROMLCID*(lcid: int32): int16 =

-  result = toU16(lcid)

-

-proc SORTIDFROMLCID*(lcid: int32): int16 =

-  result = toU16((lcid and 0x000FFFFF'i32) shr 16'i32)

-

 proc MAKELCID*(lgid, srtid: int32): DWORD =

   result = toU32(srtid shl 16'i32 or lgid and 0xffff'i32)

 

diff --git a/tests/assert/tunittests.nim b/tests/assert/tunittests.nim
index c77f691d9..cbbfe63c6 100644
--- a/tests/assert/tunittests.nim
+++ b/tests/assert/tunittests.nim
@@ -1 +1 @@
-import utemplates, uclosures
+import "../template/utemplates", "../closure/uclosures"
diff --git a/tests/template/utemplates.nim b/tests/template/utemplates.nim
index 68fbb23a6..38ad4f515 100644
--- a/tests/template/utemplates.nim
+++ b/tests/template/utemplates.nim
@@ -18,7 +18,7 @@ test "previous definitions can be further overloaded or hidden in local scopes":
   check t("test") == "string"
 
 test "templates can be redefined multiple times":
-  template customAssert(cond: bool, msg: string): stmt =
+  template customAssert(cond: bool, msg: string): stmt {.immediate, dirty.} =
     if not cond: fail(msg)
 
   template assertion_failed(body: stmt) {.immediate.} =
diff --git a/todo.txt b/todo.txt
index 88bd070ac..c29638e29 100644
--- a/todo.txt
+++ b/todo.txt
@@ -1,6 +1,7 @@
 version 0.9.4
 =============
 
+- ``--gc:none`` should complain about when you use the GC
 - ensure (ref T)(a, b) works as a type conversion and type constructor
 - Aporia doesn't compile under devel
 - document new templating symbol binding rules