diff options
author | Timothee Cour <timothee.cour2@gmail.com> | 2020-12-03 07:55:43 -0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-12-03 16:55:43 +0100 |
commit | c731f7ab149a539782b0b000853ecef058bc3dde (patch) | |
tree | 790ade7d8279afd322bd600149ec5356fda2834e /tests | |
parent | b1554cfeb54dcbd456d3ecc85f6db44c1133d8e0 (diff) | |
download | Nim-c731f7ab149a539782b0b000853ecef058bc3dde.tar.gz |
fixes #15939, fixes #15464, fixes #16169, fixes #16226 VM now supports `addr(mystring[ind])` (index + index assignment) (#15987)
* fix #15939, fix #15464 VM now supports `addr(mystring[ind])` (index + index assignment), var char return etc * cleanups * cstring tests * add test for bug #15464 * improve test coverage
Diffstat (limited to 'tests')
-rw-r--r-- | tests/misc/taddr.nim | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/tests/misc/taddr.nim b/tests/misc/taddr.nim index d743d4b4a..bac26896d 100644 --- a/tests/misc/taddr.nim +++ b/tests/misc/taddr.nim @@ -196,10 +196,76 @@ template test14339() = # bug #14339 when not defined(js): # pending bug #16003 doAssert a.val == 5 +template testStatic15464() = # bug #15464 + proc access(s: var seq[char], i: int): var char = s[i] + proc access(s: var string, i: int): var char = s[i] + static: + var s = @['a', 'b', 'c'] + access(s, 2) = 'C' + doAssert access(s, 2) == 'C' + static: + var s = "abc" + access(s, 2) = 'C' + doAssert access(s, 2) == 'C' + +proc test15464() = # bug #15464 (v2) + proc access(s: var seq[char], i: int): var char = s[i] + proc access(s: var string, i: int): var char = s[i] + block: + var s = @['a', 'b', 'c'] + access(s, 2) = 'C' + doAssert access(s, 2) == 'C' + block: + var s = "abc" + access(s, 2) = 'C' + doAssert access(s, 2) == 'C' + +block: # bug #15939 + block: + const foo = "foo" + proc proc1(s: var string) = + if s[^1] notin {'a'..'z'}: + s = "" + proc proc2(f: string): string = + result = f + proc1(result) + const bar = proc2(foo) + doAssert bar == "foo" + +proc test15939() = # bug #15939 (v2) + template fn(a) = + let pa = a[0].addr + doAssert pa != nil + doAssert pa[] == 'a' + pa[] = 'x' + doAssert pa[] == 'x' + doAssert a == "xbc" + when not defined js: # otherwise overflows + let pa2 = cast[ptr char](cast[int](pa) + 1) + doAssert pa2[] == 'b' + pa2[] = 'B' + doAssert a == "xBc" + + # mystring[ind].addr + var a = "abc" + fn(a) + + # mycstring[ind].addr + template cstringTest = + var a2 = "abc" + var b2 = a2.cstring + fn(b2) + when nimvm: cstringTest() + else: # can't take address of cstring element in js + when not defined(js): cstringTest() + template main = # xxx wrap all other tests here like that so they're also tested in VM test14420() test14339() + test15464() + test15939() +testStatic15464() static: main() main() |