diff --git a/compiler/ast.nim b/compiler/ast.nim index da3f3e7d753b..2e710fd21acd 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 ec28eb1ec3a1..ef3ceae62f9a 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 b92895b1928a..958d8c14e7f5 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 42a78c8e31aa..ae233d3224ff 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 63459babe0dc..05c060595373 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 d5811e91e5fe..3d37e6269d86 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 17fccfabe4de..49a577798664 100644 --- a/tests/misc/taddr.nim +++ b/tests/misc/taddr.nim @@ -102,17 +102,6 @@ block: let a2 = (11,) 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] diff --git a/tests/vm/tconstobj.nim b/tests/vm/tconstobj.nim index 93d0e1d7d07f..7dc20a0ba1fb 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