diff options
Diffstat (limited to 'tests/ccgbugs/tcodegenbug1.nim')
-rw-r--r-- | tests/ccgbugs/tcodegenbug1.nim | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/tests/ccgbugs/tcodegenbug1.nim b/tests/ccgbugs/tcodegenbug1.nim index ebdc57144..d2ab97ede 100644 --- a/tests/ccgbugs/tcodegenbug1.nim +++ b/tests/ccgbugs/tcodegenbug1.nim @@ -1,9 +1,13 @@ discard """ + matrix: "--mm:refc" output: '''obj = (inner: (kind: Just, id: 7)) obj.inner.id = 7 id = 7 obj = (inner: (kind: Just, id: 7)) -2''' +2 +(a: "a", b: "b", c: "") +caught +(a: "a", b: "b", c: "")''' """ # bug #6960 @@ -129,12 +133,53 @@ import macros func myfunc(obj: MyObject): MyResult {.raises: [].} = template index: auto = case obj.kind: - of Float: $obj.index + of Float: $obj.index of Fixed: "Fixed" macro to_str(a: untyped): string = - result = newStrLitNode(a.repr) + result = newStrLitNode(a.repr) result.val[0] = index result.val[1] = to_str(obj.kind + Ola) let x = MyObject(someInt: 10, kind: Fixed) echo myfunc(x).val.len + +# bug #14126 + +type X = object + a, b, c: string + +proc f(): X = + result.a = "a" + result.b = "b" + raise (ref ValueError)() + +proc ohmanNoNRVO = + var x: X + x.a = "1" + x.b = "2" + x.c = "3" + + try: + x = f() + except: + discard + + echo x + # once NVRO is sorted out, x.c == "3" + doAssert x.c == "", "shouldn't modify x if f raises" + +ohmanNoNRVO() + +proc ohmanNoNRVO2(x: var X) = + x.a = "1" + x.c = "3" + x = f() + +var xgg: X +try: + ohmanNoNRVO2(xgg) +except: + echo "caught" +echo xgg +# once NVRO is sorted out, xgg.c == "3" +doAssert xgg.c == "", "this assert will fail" |