summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--compiler/ast.nim2
-rw-r--r--compiler/ccgexprs.nim1
-rw-r--r--compiler/semfold.nim1
-rw-r--r--compiler/transf.nim5
-rw-r--r--compiler/trees.nim2
-rw-r--r--tests/arc/topt_no_cursor.nim2
-rw-r--r--tests/misc/taddr.nim11
-rw-r--r--tests/vm/tconstobj.nim20
8 files changed, 29 insertions, 15 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index da3f3e7d7..2e710fd21 100644
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -1122,7 +1122,7 @@ proc safeLen*(n: PNode): int {.inline.} =
 
 proc safeArrLen*(n: PNode): int {.inline.} =
   ## works for array-like objects (strings passed as openArray in VM).
-  if n.kind in {nkStrLit..nkTripleStrLit}:result = n.strVal.len
+  if n.kind in {nkStrLit..nkTripleStrLit}: result = n.strVal.len
   elif n.kind in {nkNone..nkFloat128Lit}: result = 0
   else: result = n.len
 
diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim
index ec28eb1ec..ef3ceae62 100644
--- a/compiler/ccgexprs.nim
+++ b/compiler/ccgexprs.nim
@@ -881,6 +881,7 @@ proc genFieldCheck(p: BProc, e: PNode, obj: Rope, field: PSym) =
               [rdLoc(test), strLit, raiseInstr(p)])
 
 proc genCheckedRecordField(p: BProc, e: PNode, d: var TLoc) =
+  assert e[0].kind == nkDotExpr
   if optFieldCheck in p.options:
     var a: TLoc
     genRecordFieldAux(p, e[0], d, a)
diff --git a/compiler/semfold.nim b/compiler/semfold.nim
index b92895b19..958d8c14e 100644
--- a/compiler/semfold.nim
+++ b/compiler/semfold.nim
@@ -685,6 +685,7 @@ proc getConstExpr(m: PSym, n: PNode; idgen: IdGenerator; g: ModuleGraph): PNode
   of nkBracketExpr: result = foldArrayAccess(m, n, idgen, g)
   of nkDotExpr: result = foldFieldAccess(m, n, idgen, g)
   of nkCheckedFieldExpr:
+    assert n[0].kind == nkDotExpr
     result = foldFieldAccess(m, n[0], idgen, g)
   of nkStmtListExpr:
     var i = 0
diff --git a/compiler/transf.nim b/compiler/transf.nim
index 42a78c8e3..ae233d322 100644
--- a/compiler/transf.nim
+++ b/compiler/transf.nim
@@ -1002,6 +1002,11 @@ proc transform(c: PTransf, n: PNode): PNode =
     return n
   of nkExceptBranch:
     result = transformExceptBranch(c, n)
+  of nkCheckedFieldExpr:
+    result = transformSons(c, n)
+    if result[0].kind != nkDotExpr:
+      # simplfied beyond a dot expression --> simplify further.
+      result = result[0]
   else:
     result = transformSons(c, n)
   when false:
diff --git a/compiler/trees.nim b/compiler/trees.nim
index 63459babe..05c060595 100644
--- a/compiler/trees.nim
+++ b/compiler/trees.nim
@@ -211,6 +211,6 @@ proc stupidStmtListExpr*(n: PNode): bool =
 proc dontInlineConstant*(orig, cnst: PNode): bool {.inline.} =
   # symbols that expand to a complex constant (array, etc.) should not be
   # inlined, unless it's the empty array:
-  result = orig.kind == nkSym and
+  result = orig.kind != cnst.kind and
            cnst.kind in {nkCurly, nkPar, nkTupleConstr, nkBracket, nkObjConstr} and
            cnst.len > ord(cnst.kind == nkObjConstr)
diff --git a/tests/arc/topt_no_cursor.nim b/tests/arc/topt_no_cursor.nim
index d5811e91e..3d37e6269 100644
--- a/tests/arc/topt_no_cursor.nim
+++ b/tests/arc/topt_no_cursor.nim
@@ -46,7 +46,7 @@ var
   lvalue
   lnext
   _
-`=copy`(lresult, [123])
+lresult = @[123]
 _ = (
   let blitTmp = lresult
   blitTmp, ";")
diff --git a/tests/misc/taddr.nim b/tests/misc/taddr.nim
index 17fccfabe..49a577798 100644
--- a/tests/misc/taddr.nim
+++ b/tests/misc/taddr.nim
@@ -103,17 +103,6 @@ block:
     doAssert byLent(a2) == (11,)
 
   block:
-    when (defined(c) or defined(cpp)) and defined(release):
-      discard # probably not a bug since optimizer is free to pass by value, and `unsafeAddr` is used
-    else:
-      var a = @[12]
-      doAssert byPtr(a)[] == @[12]
-      let a2 = [13]
-      doAssert byPtr(a2)[] == [13]
-      let a3 = 14
-      doAssert byPtr(a3)[] == 14
-
-  block:
     proc byLent2[T](a: seq[T]): lent T = a[1]
     var a = @[20,21,22]
     doAssert byLent2(a) == 21
diff --git a/tests/vm/tconstobj.nim b/tests/vm/tconstobj.nim
index 93d0e1d7d..7dc20a0ba 100644
--- a/tests/vm/tconstobj.nim
+++ b/tests/vm/tconstobj.nim
@@ -3,6 +3,7 @@ discard """
 (name: "hello")
 (-1, 0)
 (FirstName: "James", LastName: "Franco")
+[1, 2, 3]
 '''
 """
 
@@ -74,4 +75,21 @@ static: # issue #11861
 
 static: # issue #15662
   proc a(T: typedesc) = echo T.type
-  a((int, int))
\ No newline at end of file
+  a((int, int))
+
+# bug #16069
+type
+  E = enum
+    val1, val2
+  Obj = object
+    case k: E
+    of val1:
+      x: array[3, int]
+    of val2:
+      y: uint32
+
+const
+  foo = [1, 2, 3]
+  arr = Obj(k: val1, x: foo)
+
+echo arr.x