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"]
|