diff options
author | Andreas Rumpf <rumpf_a@web.de> | 2019-08-29 19:09:54 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-29 19:09:54 +0200 |
commit | 2a3b0563141f2cfdee4cbeef85167c25610ff71f (patch) | |
tree | 2a32c413877f8e83d4f92e3a922b4aaef83250c9 | |
parent | d0e5bd2305db719b0c9acb6a017c8aa579a2f246 (diff) | |
download | Nim-2a3b0563141f2cfdee4cbeef85167c25610ff71f.tar.gz |
fixes #12042 (#12083)
* fixes #12042 * make tests green again
-rw-r--r-- | compiler/ccgcalls.nim | 12 | ||||
-rw-r--r-- | compiler/ccgexprs.nim | 2 | ||||
-rw-r--r-- | compiler/semstmts.nim | 2 | ||||
-rw-r--r-- | tests/openarray/tptrarrayderef.nim | 15 |
4 files changed, 28 insertions, 3 deletions
diff --git a/compiler/ccgcalls.nim b/compiler/ccgcalls.nim index 2ae56863b..4efd33d1e 100644 --- a/compiler/ccgcalls.nim +++ b/compiler/ccgcalls.nim @@ -79,9 +79,19 @@ proc genBoundsCheck(p: BProc; arr, a, b: TLoc) proc openArrayLoc(p: BProc, n: PNode): Rope = var a: TLoc - let q = skipConv(n) + var q = skipConv(n) + var skipped = false + while q.kind == nkStmtListExpr and q.len > 0: + skipped = true + q = q.lastSon if getMagic(q) == mSlice: # magic: pass slice to openArray: + if skipped: + q = skipConv(n) + while q.kind == nkStmtListExpr and q.len > 0: + for i in 0..q.len-2: + genStmts(p, q[i]) + q = q.lastSon var b, c: TLoc initLocExpr(p, q[1], a) initLocExpr(p, q[2], b) diff --git a/compiler/ccgexprs.nim b/compiler/ccgexprs.nim index a882a3cee..ea4cd4aca 100644 --- a/compiler/ccgexprs.nim +++ b/compiler/ccgexprs.nim @@ -2268,7 +2268,7 @@ proc genMagicExpr(p: BProc, e: PNode, d: var TLoc, op: TMagic) = of mAccessEnv: unaryExpr(p, e, d, "$1.ClE_0") of mSlice: localError(p.config, e.info, "invalid context for 'toOpenArray'; " & - " 'toOpenArray' is only valid within a call expression") + "'toOpenArray' is only valid within a call expression") else: when defined(debugMagics): echo p.prc.name.s, " ", p.prc.id, " ", p.prc.flags, " ", p.prc.ast[genericParamsPos].kind diff --git a/compiler/semstmts.nim b/compiler/semstmts.nim index b22dc7952..5a0aac40e 100644 --- a/compiler/semstmts.nim +++ b/compiler/semstmts.nim @@ -293,7 +293,7 @@ proc fitRemoveHiddenConv(c: PContext, typ: PType, n: PNode): PNode = result.info = n.info result.typ = typ if not floatRangeCheck(result.floatVal, typ): - localError(c.config, n.info, errFloatToString % [$n.floatVal, typeToString(typ)]) + localError(c.config, n.info, errFloatToString % [$result.floatVal, typeToString(typ)]) else: changeType(c, r1, typ, check=true) result = r1 diff --git a/tests/openarray/tptrarrayderef.nim b/tests/openarray/tptrarrayderef.nim index b75bc08c4..5e77430d1 100644 --- a/tests/openarray/tptrarrayderef.nim +++ b/tests/openarray/tptrarrayderef.nim @@ -1,6 +1,7 @@ discard """ output: '''[1, 2, 3, 4] 3 +['1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C'] OK ''' """ @@ -66,4 +67,18 @@ var doAssert y1 == ([1, 2], 3) doAssert y2 == [1, 2, 3, 4] +template newOpenArray(x: var string, size: int): openArray[char] = + var z = 1 + toOpenArray(x, z, size) + +template doSomethingAndCreate(x: var string): openArray[char] = + let size = 12 + newOpenArray(x, size) + +proc sinkk(x: openArray[char]) = + echo x + +var xArrayDeref = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" +sinkk doSomethingAndCreate(xArrayDeref) + echo "OK" |