summary refs log tree commit diff stats
path: root/tests/varres
diff options
context:
space:
mode:
Diffstat (limited to 'tests/varres')
-rw-r--r--tests/varres/tprevent_forloopvar_mutations.nim9
-rw-r--r--tests/varres/tvarres0.nim111
2 files changed, 115 insertions, 5 deletions
diff --git a/tests/varres/tprevent_forloopvar_mutations.nim b/tests/varres/tprevent_forloopvar_mutations.nim
index 398191658..c9aeb94d8 100644
--- a/tests/varres/tprevent_forloopvar_mutations.nim
+++ b/tests/varres/tprevent_forloopvar_mutations.nim
@@ -1,11 +1,10 @@
 discard """
-  errmsg: "type mismatch: got <int>"
-  line: 17
-  nimout: '''type mismatch: got <int>
+  errormsg: "type mismatch: got <int>"
+  nimout: '''tprevent_forloopvar_mutations.nim(16, 3) Error: type mismatch: got <int>
 but expected one of:
-proc inc[T: Ordinal | uint | uint64](x: var T; y = 1)
+proc inc[T, V: Ordinal](x: var T; y: V = 1)
   first type mismatch at position: 1
-  required type for x: var T: Ordinal or uint or uint64
+  required type for x: var T: Ordinal
   but expression 'i' is immutable, not 'var'
 
 expression: inc i
diff --git a/tests/varres/tvarres0.nim b/tests/varres/tvarres0.nim
index fd10a73bd..94bdb4a06 100644
--- a/tests/varres/tvarres0.nim
+++ b/tests/varres/tvarres0.nim
@@ -4,6 +4,7 @@ discard """
 123
 1234
 12345
+123456
 '''
 """
 
@@ -28,3 +29,113 @@ getF().a = 1234
 echo getF().a
 getF() = Foo(a: 12345)
 echo getF().a
+(addr getF())[] = Foo(a: 123456)
+echo getF().a
+
+
+block: # #13848
+  template fun() =
+    block:
+      var m = 1
+
+      proc identity(o: var int): var int =
+        result = o
+        result += 5
+
+      identity(m) += 3
+      doAssert m == 5+4
+
+    block:
+      var m = 10
+      proc identity2(o: var int): var int =
+        result = m
+        result += 100
+
+      var ignored = 27
+      identity2(ignored) += 7
+      doAssert m == 10 + 100 + 7
+
+    block:
+      iterator test3(o: var int): var int = yield o
+      var m = 1
+      for m2 in test3(m): m2+=3
+      doAssert m == 4
+
+  static: fun()
+  fun()
+
+  template fun2() =
+    block:
+      var m = 1
+      var m2 = 1
+      iterator test3(o: var int): (var int, var int) =
+        yield (o, m2)
+
+      for ti in test3(m):
+        ti[0]+=3
+        ti[1]+=4
+
+      doAssert (m, m2) == (4, 5)
+  fun2()
+  # static: fun2() # BUG: Error: attempt to access a nil address kind: rkInt
+
+  template fun3() =
+    block:
+      proc test4[T1](o: var T1): var int = o[1]
+      block:
+        var m = @[1,2]
+        test4(m) += 10
+        doAssert m[1] == 2+10
+      block:
+        var m = [1,2]
+        test4(m) += 10
+        doAssert m[1] == 2+10
+      block:
+        var m = (1, 2)
+        test4(m) += 10
+        doAssert m[1] == 2+10
+
+      proc test5[T1](o: var T1): var int = o.x
+      block:
+        type Foo = object
+          x: int
+        var m = Foo(x: 2)
+        test5(m) += 10
+        doAssert m.x == 2+10
+      block:
+        type Foo = ref object
+          x: int
+        var m = Foo(x: 2)
+        test5(m) += 10
+        doAssert m.x == 2+10
+
+      proc test6[T1](o: T1): var int = o.x
+      block:
+        type Foo = ref object
+          x: int
+        var m = Foo(x: 2)
+        test6(m) += 10
+        doAssert m.x == 2+10
+
+  fun3()
+  static: fun3()
+
+  when false:
+    # BUG:
+    # c: SIGSEGV
+    # cpp: error: call to implicitly-deleted default constructor of 'tyTuple__ILZebuYefUeQLAzY85QkHA'
+    proc test7[T](o: var T): (var int,) =
+      (o[1], )
+    var m = @[1,2]
+    test7(m)[0] += 10
+
+block:
+  # example from #13848
+  type
+    MyType[T] = object
+      a,b: T
+    MyTypeAlias = MyType[float32]
+
+  var m: MyTypeAlias
+  proc identity(o: var MyTypeAlias): var MyTypeAlias = o
+  discard identity(m)