summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorClyybber <darkmine956@gmail.com>2020-04-30 02:01:07 +0200
committerGitHub <noreply@github.com>2020-04-30 02:01:07 +0200
commitd6e1b5c070bf58449bf4af210ec099418d496aa5 (patch)
treec51d54904abc29c8cdad0c1d3f5417b04d9a11ab
parentbd57f0cd3268843808c52614864a609703d9e611 (diff)
downloadNim-d6e1b5c070bf58449bf4af210ec099418d496aa5.tar.gz
Fix #14160 (#14161)
* Fix #14160

* Add testcase
-rw-r--r--compiler/ccgexprs.nim8
-rw-r--r--tests/ccgbugs/t14160.nim15
2 files changed, 22 insertions, 1 deletions
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index 806eca744..0b9958ee4 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -2450,6 +2450,8 @@ proc genStmtList(p: BProc, n: PNode) =
   genStmtListExprImpl:
     genStmts(p, n[^1])
 
+from parampatterns import isLValue
+
 proc upConv(p: BProc, n: PNode, d: var TLoc) =
   var a: TLoc
   initLocExpr(p, n[0], a)
@@ -2468,7 +2470,11 @@ proc upConv(p: BProc, n: PNode, d: var TLoc) =
       linefmt(p, cpsStmts, "if (!#isObj($1, $2)){ #raiseObjectConversionError(); $3}$n",
               [r, checkFor, raiseInstr(p)])
   if n[0].typ.kind != tyObject:
-    putIntoDest(p, d, n,
+    if n.isLValue:
+      putIntoDest(p, d, n,
+                "(*(($1*) (&($2))))" % [getTypeDesc(p.module, n.typ), rdLoc(a)], a.storage)
+    else:
+      putIntoDest(p, d, n,
                 "(($1) ($2))" % [getTypeDesc(p.module, n.typ), rdLoc(a)], a.storage)
   else:
     putIntoDest(p, d, n, "(*($1*) ($2))" %
diff --git a/tests/ccgbugs/t14160.nim b/tests/ccgbugs/t14160.nim
new file mode 100644
index 000000000..be7088e29
--- /dev/null
+++ b/tests/ccgbugs/t14160.nim
@@ -0,0 +1,15 @@
+type
+  TPassContext = object of RootObj
+  PPassContext = ref TPassContext
+
+  PCtx = ref object of TPassContext
+    a: int
+
+  ModuleGraph = object
+    vm: RootRef
+
+proc main() =
+  var g = ModuleGraph(vm: new(Pctx))
+  PCtx(g.vm) = nil #This generates invalid C code
+
+main()