diff options
Diffstat (limited to 'tests/varres')
-rw-r--r-- | tests/varres/tnewseq_on_result_vart.nim | 9 | ||||
-rw-r--r-- | tests/varres/tprevent_forloopvar_mutations.nim | 16 | ||||
-rw-r--r-- | tests/varres/tvarres0.nim | 111 | ||||
-rw-r--r-- | tests/varres/tvarres1.nim | 3 | ||||
-rw-r--r-- | tests/varres/tvarres2.nim | 3 | ||||
-rw-r--r-- | tests/varres/tvarres3.nim | 2 | ||||
-rw-r--r-- | tests/varres/tvarres_via_forwarding.nim | 12 | ||||
-rw-r--r-- | tests/varres/tvartup.nim | 3 | ||||
-rw-r--r-- | tests/varres/twrong_parameter.nim | 16 |
9 files changed, 167 insertions, 8 deletions
diff --git a/tests/varres/tnewseq_on_result_vart.nim b/tests/varres/tnewseq_on_result_vart.nim new file mode 100644 index 000000000..4a700468f --- /dev/null +++ b/tests/varres/tnewseq_on_result_vart.nim @@ -0,0 +1,9 @@ + +discard """ + errormsg: "address of 'result' may not escape its stack frame" + line: 9 +""" +# bug #5113 + +proc makeSeqVar(size: Natural): var seq[int] = + newSeq(result, size) diff --git a/tests/varres/tprevent_forloopvar_mutations.nim b/tests/varres/tprevent_forloopvar_mutations.nim new file mode 100644 index 000000000..c9aeb94d8 --- /dev/null +++ b/tests/varres/tprevent_forloopvar_mutations.nim @@ -0,0 +1,16 @@ +discard """ + errormsg: "type mismatch: got <int>" + nimout: '''tprevent_forloopvar_mutations.nim(16, 3) Error: type mismatch: got <int> +but expected one of: +proc inc[T, V: Ordinal](x: var T; y: V = 1) + first type mismatch at position: 1 + required type for x: var T: Ordinal + but expression 'i' is immutable, not 'var' + +expression: inc i +''' +""" + +for i in 0..10: + echo i + 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) diff --git a/tests/varres/tvarres1.nim b/tests/varres/tvarres1.nim index 849805768..e58d7f083 100644 --- a/tests/varres/tvarres1.nim +++ b/tests/varres/tvarres1.nim @@ -1,7 +1,7 @@ discard """ + errormsg: "'bla' escapes its stack frame; context: 'bla'" file: "tvarres1.nim" line: 12 - errormsg: "address of 'bla' may not escape its stack frame" """ var @@ -14,4 +14,3 @@ proc p(): var int = p() = 45 echo g - diff --git a/tests/varres/tvarres2.nim b/tests/varres/tvarres2.nim index 53a57d882..4ec0bb05b 100644 --- a/tests/varres/tvarres2.nim +++ b/tests/varres/tvarres2.nim @@ -1,7 +1,7 @@ discard """ + errormsg: "expression has no address" file: "tvarres2.nim" line: 11 - errormsg: "expression has no address" """ var @@ -13,4 +13,3 @@ proc p(): var int = p() = 45 echo g - diff --git a/tests/varres/tvarres3.nim b/tests/varres/tvarres3.nim index 9fcd79bfc..9a46bfb4e 100644 --- a/tests/varres/tvarres3.nim +++ b/tests/varres/tvarres3.nim @@ -6,7 +6,7 @@ var g = 5 proc p(): var int = - var bla = addr(g) #: array [0..7, int] + var bla = addr(g) #: array[0..7, int] result = bla[] p() = 45 diff --git a/tests/varres/tvarres_via_forwarding.nim b/tests/varres/tvarres_via_forwarding.nim new file mode 100644 index 000000000..fb7201ad2 --- /dev/null +++ b/tests/varres/tvarres_via_forwarding.nim @@ -0,0 +1,12 @@ +discard """ + errormsg: "'y' escapes its stack frame; context: 'forward(y)'" + line: 10 +""" + +proc forward(x: var int): var int = result = x + +proc foo(): var int = + var y = 9 + result = forward(y) + +echo foo() diff --git a/tests/varres/tvartup.nim b/tests/varres/tvartup.nim index 1957a3e35..a8f15b232 100644 --- a/tests/varres/tvartup.nim +++ b/tests/varres/tvartup.nim @@ -1,5 +1,4 @@ discard """ - file: "tvartup.nim" output: "2 3" """ # Test the new tuple unpacking @@ -9,5 +8,3 @@ proc divmod(a, b: int): tuple[di, mo: int] = var (x, y) = divmod(15, 6) echo x, " ", y - -#OUT 2 3 diff --git a/tests/varres/twrong_parameter.nim b/tests/varres/twrong_parameter.nim new file mode 100644 index 000000000..58d01fd7e --- /dev/null +++ b/tests/varres/twrong_parameter.nim @@ -0,0 +1,16 @@ +discard """ + errormsg: "'x' is not the first parameter; context: 'x.field[0]'" + line: 10 +""" + +type + MyObject = object + field: array[2, int] + +proc forward(abc: int; x: var MyObject): var int = result = x.field[0] + +proc foo(): var int = + var y: MyObject + result = forward(45, y) + +echo foo() |