summary refs log tree commit diff stats
path: root/tests/ccgbugs/tcodegenbug1.nim
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ccgbugs/tcodegenbug1.nim')
-rw-r--r--tests/ccgbugs/tcodegenbug1.nim118
1 files changed, 118 insertions, 0 deletions
diff --git a/tests/ccgbugs/tcodegenbug1.nim b/tests/ccgbugs/tcodegenbug1.nim
index a5cfc77cc..d2ab97ede 100644
--- a/tests/ccgbugs/tcodegenbug1.nim
+++ b/tests/ccgbugs/tcodegenbug1.nim
@@ -1,3 +1,39 @@
+discard """
+  matrix: "--mm:refc"
+  output: '''obj = (inner: (kind: Just, id: 7))
+obj.inner.id = 7
+id = 7
+obj = (inner: (kind: Just, id: 7))
+2
+(a: "a", b: "b", c: "")
+caught
+(a: "a", b: "b", c: "")'''
+"""
+
+# bug #6960
+
+import sugar
+type
+  Kind = enum None, Just, Huge
+  Inner = object
+    case kind: Kind
+    of None: discard
+    of Just: id: int
+    of Huge: a,b,c,d,e,f: string
+  Outer = object
+    inner: Inner
+
+
+proc shouldDoNothing(id: int): Inner =
+  dump id
+  Inner(kind: Just, id: id)
+
+var obj = Outer(inner: Inner(kind: Just, id: 7))
+dump obj
+dump obj.inner.id
+obj.inner = shouldDoNothing(obj.inner.id)
+dump obj
+
 import os
 
 type
@@ -65,3 +101,85 @@ type
 
 # have a proc taking TFlags as param and returning object having TFlags field
 proc foo(flags: TFlags): TObj = nil
+
+
+# bug #5137
+type
+  MyInt {.importc: "int".} = object
+  MyIntDistinct = distinct MyInt
+
+proc bug5137(d: MyIntDistinct) =
+  discard d.MyInt
+
+#-------------------------------------
+# bug #8979
+
+type
+  MyKind = enum
+    Fixed, Float
+
+  MyObject = object
+    someInt: int
+    case kind: MyKind
+      of Float: index: string
+      of Fixed: nil
+
+  MyResult = object
+    val: array[0..1, string]
+    vis: set[0..1]
+
+import macros
+
+func myfunc(obj: MyObject): MyResult {.raises: [].} =
+  template index: auto =
+    case obj.kind:
+      of Float: $obj.index
+      of Fixed: "Fixed"
+  macro to_str(a: untyped): string =
+    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"