summary refs log tree commit diff stats
path: root/tests/views/tviews1.nim
blob: 9785d25e5e5154d3be14c72c2b4d1bbb4b392175 (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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
discard """
  output: '''11
22
33
3
2
3
3
15
(oa: [1, 3, 4])'''
  targets: "c cpp"
"""

{.experimental: "views".}

proc take(a: openArray[int]) =
  echo a.len

proc main(s: seq[int]) =
  var x: openArray[int] = s
  for i in 0 .. high(x):
    echo x[i]
  take(x)

  take(x.toOpenArray(0, 1))
  let y = x
  take y
  take x

main(@[11, 22, 33])

var x: int

proc foo(x: var int): var int =
  once: x = 42
  return x

var y: var int = foo(x)
y = 15
echo foo(x)
# bug #16132

# bug #18690

type
  F = object
    oa: openArray[int]

let s1 = @[1,3,4,5,6]
var test = F(oa: toOpenArray(s1, 0, 2))
echo test

type
  Foo = object
    x: string
    y: seq[int]
    data: array[10000, byte]

  View[T] = object
    x: lent T

proc mainB =
  let f = Foo(y: @[1, 2, 3])
  let foo = View[Foo](x: f)
  assert foo.x.x == ""
  assert foo.x.y == @[1, 2, 3]

mainB()


# bug #15897
type Outer = ref object 
  value: int
type Inner = object
  owner: var Outer
  
var o = Outer(value: 1234)
var v = Inner(owner: o).owner.value
doAssert v == 1234

block: # bug #21674
  type
    Lent = object
      data: lent int

  proc foo(s: Lent) =
    var m = 12
    discard cast[lent int](m)

  proc main =
    var m1 = 123
    var x = Lent(data: m1)
    foo(x)

  main()

block: # bug #22117
  proc main: int =
    var a = 10
    defer: discard a # extend a's lifetime

    var aref: var int = a
      #└──── 'aref' borrows from location 'a' which does not live long enough

    result = aref

  doAssert main() == 10

type
  Slice*[T] = object
    first, last: int
    p: ptr UncheckedArray[T]

var i = 0

converter autoToOpenArray*[T](s: Slice[T]): openArray[T] =
  inc i
  result = toOpenArray(s.p, s.first, s.last)

proc acceptOpenArray(s: openArray[byte]) = discard

proc bug22597 = # bug #22597
  acceptOpenArray(Slice[byte]())
  doAssert i == 1

bug22597()

block: # bug #20048
  type
    Test = object
      tokens: openArray[string]

  func init(Self: typedesc[Test], tokens: openArray[string]): Self = Self(tokens: tokens)

  let data = Test.init(["123"])
  doAssert @(data.tokens) == @["123"]