summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorAraq <rumpf_a@web.de>2013-08-31 02:07:52 +0200
committerAraq <rumpf_a@web.de>2013-08-31 02:07:52 +0200
commit6cc06cd35dc3aab58eb78757e76d5b72e5646c52 (patch)
tree11d4f8986208af2a0b7a225ac1ba85b29828ead3
parent4d9b2f671ad1c8109c8478c9a78e05e25def5f78 (diff)
downloadNim-6cc06cd35dc3aab58eb78757e76d5b72e5646c52.tar.gz
fixes #569; C++ codegen works again
-rw-r--r--compiler/ccgexprs.nim19
-rw-r--r--lib/system/ansi_c.nim2
-rw-r--r--lib/system/gc.nim2
-rw-r--r--lib/system/gc_ms.nim2
-rw-r--r--tests/run/tvarious1.nim17
5 files changed, 26 insertions, 16 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 3475093cb..6b3906226 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -303,10 +303,11 @@ proc genAssignment(p: BProc, dest, src: TLoc, flags: TAssignmentFlags) =
       linefmt(p, cpsStmts, "$1 = $2;$n", rdLoc(dest), rdLoc(src))
   of tyObject:
     # XXX: check for subtyping?
-    if needsComplexAssignment(dest.t):
-      if asgnComplexity(dest.t.n) <= 4:
-        discard getTypeDesc(p.module, dest.t)
-        genOptAsgnObject(p, dest, src, flags, dest.t.n)
+    if needsComplexAssignment(ty):
+      if asgnComplexity(ty.n) <= 4:
+        discard getTypeDesc(p.module, ty)
+        internalAssert ty.n != nil
+        genOptAsgnObject(p, dest, src, flags, ty.n)
       else:
         genGenericAsgn(p, dest, src, flags)
     else:
@@ -642,14 +643,7 @@ proc genTupleElem(p: BProc, e: PNode, d: var TLoc) =
   case e.sons[1].kind
   of nkIntLit..nkUInt64Lit: i = int(e.sons[1].intVal)
   else: internalError(e.info, "genTupleElem")
-  when false:
-    if ty.n != nil:
-      var field = ty.n.sons[i].sym
-      if field == nil: InternalError(e.info, "genTupleElem")
-      if field.loc.r == nil: InternalError(e.info, "genTupleElem")
-      appf(r, ".$1", [field.loc.r])
-  else:
-    appf(r, ".Field$1", [toRope(i)])
+  appf(r, ".Field$1", [toRope(i)])
   putIntoDest(p, d, ty.sons[i], r)
 
 proc genRecordField(p: BProc, e: PNode, d: var TLoc) =
@@ -840,6 +834,7 @@ proc genAndOr(p: BProc, e: PNode, d: var TLoc, m: TMagic) =
 proc genEcho(p: BProc, n: PNode) =
   # this unusal way of implementing it ensures that e.g. ``echo("hallo", 45)``
   # is threadsafe.
+  discard lists.IncludeStr(p.module.headerFiles, "<stdio.h>")
   var args: PRope = nil
   var a: TLoc
   for i in countup(1, n.len-1):
diff --git a/lib/system/ansi_c.nim b/lib/system/ansi_c.nim
index 06da34926..13e8496d2 100644
--- a/lib/system/ansi_c.nim
+++ b/lib/system/ansi_c.nim
@@ -58,7 +58,7 @@ else:
 
 proc c_longjmp(jmpb: C_JmpBuf, retval: cint) {.
   header: "<setjmp.h>", importc: "longjmp".}
-proc c_setjmp(jmpb: var C_JmpBuf): cint {.
+proc c_setjmp(jmpb: C_JmpBuf): cint {.
   header: "<setjmp.h>", importc: "setjmp".}
 
 proc c_signal(sig: cint, handler: proc (a: cint) {.noconv.}) {.
diff --git a/lib/system/gc.nim b/lib/system/gc.nim
index 36c008bef..f5b68b9db 100644
--- a/lib/system/gc.nim
+++ b/lib/system/gc.nim
@@ -759,7 +759,7 @@ else:
     # Used to traverse the stack and registers assuming
     # that 'setjmp' will save registers in the C stack.
     type PStackSlice = ptr array [0..7, pointer]
-    var registers: C_JmpBuf
+    var registers {.noinit.}: C_JmpBuf
     if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
       var max = cast[TAddress](gch.stackBottom)
       var sp = cast[TAddress](addr(registers))
diff --git a/lib/system/gc_ms.nim b/lib/system/gc_ms.nim
index 9ebc27a9f..2e3596985 100644
--- a/lib/system/gc_ms.nim
+++ b/lib/system/gc_ms.nim
@@ -449,7 +449,7 @@ else:
     # Used to traverse the stack and registers assuming
     # that 'setjmp' will save registers in the C stack.
     type PStackSlice = ptr array [0..7, pointer]
-    var registers: C_JmpBuf
+    var registers {.noinit.}: C_JmpBuf
     if c_setjmp(registers) == 0'i32: # To fill the C stack with registers.
       var max = cast[TAddress](gch.stackBottom)
       var sp = cast[TAddress](addr(registers))
diff --git a/tests/run/tvarious1.nim b/tests/run/tvarious1.nim
index d30d91234..9dd4af606 100644
--- a/tests/run/tvarious1.nim
+++ b/tests/run/tvarious1.nim
@@ -1,7 +1,8 @@
 discard """
   file: "tlenopenarray.nim"
   output: '''1
-0'''
+0
+Whopie'''
 """
 
 echo len([1_000_000]) #OUT 1
@@ -12,3 +13,17 @@ type
 proc `[]`(v: TVector; idx: int): int = TArray(v)[idx]
 var v: TVector
 echo v[2]
+
+# bug #569
+
+import queues
+
+type
+  TWidget = object
+    names: TQueue[string]
+
+var w = TWidget(names: initQueue[string]())
+
+add(w.names, "Whopie")
+
+for n in w.names: echo(n)