summary refs log tree commit diff stats
path: root/tests/vm/topenarrays.nim
blob: 375d2523d38b6c4a47f4cd2ae42b89511c778135 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
proc mutate(a: var openarray[int]) =
  var i = 0
  for x in a.mitems:
    x = i
    inc i

proc mutate(a: var openarray[char]) =
  var i = 1
  for ch in a.mitems:
    ch = 'a'


static:
  var a = [10, 20, 30]
  assert a.toOpenArray(1, 2).len == 2

  mutate(a)
  assert a.toOpenArray(0, 2) == [0, 1, 2]
  assert a.toOpenArray(0, 0) == [0]
  assert a.toOpenArray(1, 2) == [1, 2]
  assert "Hello".toOpenArray(1, 4) == "ello"
  var str = "Hello"
  str.toOpenArray(2, 4).mutate()
  assert str.toOpenArray(0, 4).len == 5
  assert str.toOpenArray(0, 0).len == 1
  assert str.toOpenArray(0, 0).high == 0
  assert str == "Heaaa"
  assert str.toOpenArray(0, 4) == "Heaaa"

  var arr: array[3..4, int] = [1, 2]
  assert arr.toOpenArray(3, 4) == [1, 2]
  assert arr.toOpenArray(3, 4).len == 2
  assert arr.toOpenArray(3, 3).high == 0

  assert arr.toOpenArray(3, 4).toOpenArray(0, 0) == [1]


proc doThing(s: static openArray[int]) = discard

doThing([10, 20, 30].toOpenArray(0, 0))

# bug #19969
proc f(): array[1, byte] =
  var a: array[1, byte]
  result[0..0] = a.toOpenArray(0, 0)

doAssert static(f()) == [byte(0)]


# bug #15952
proc main1[T](a: openArray[T]) = discard
proc main2[T](a: var openArray[T]) = discard

proc main =
  var a = [1,2,3,4,5]
  main1(a.toOpenArray(1,3))
  main2(a.toOpenArray(1,3))
static: main()
main()

# bug #16306
{.experimental: "views".}
proc test(x: openArray[int]): tuple[id: int] =
  let y: openArray[int] = toOpenArray(x, 0, 2)
  result = (y[0],)
template fn=
  doAssert test([0,1,2,3,4,5]).id == 0
fn() # ok
static: fn()


block: # bug #22095
  type
    StUint = object
      limbs: array[4, uint64]

  func shlAddMod(a: var openArray[uint64]) =  
    a[0] = 10

  func divRem(r: var openArray[uint64]) =
    shlAddMod(r.toOpenArray(0, 3))

  func fn(): StUint =
    divRem(result.limbs)

  const
    z = fn()

  doAssert z.limbs[0] == 10