1
1
// RUN: %empty-directory(%t)
2
- // RUN: %target-build-swift %s -emit-executable -enable-experimental-feature BorrowAndMutateAccessors -o %t/a.out
2
+ // RUN: %target-build-swift %s -emit-executable -enable-experimental-feature BorrowAndMutateAccessors -Xfrontend -disable-experimental-parser-round-trip - o %t/a.out
3
3
// RUN: %target-codesign %t/a.out
4
4
// RUN: %target-run %t/a.out
5
5
6
6
// REQUIRES: swift_feature_BorrowAndMutateAccessors
7
7
// REQUIRES: executable_test
8
8
9
9
public struct Container < Element: ~ Copyable > : ~ Copyable {
10
- var _storage : UnsafeBufferPointer < Element >
10
+ var _storage : UnsafeMutableBufferPointer < Element >
11
11
var _count : Int
12
12
13
13
var first : Element {
14
14
@_unsafeSelfDependentResult
15
15
borrow {
16
16
return _storage. baseAddress. unsafelyUnwrapped. pointee
17
17
}
18
+ @_unsafeSelfDependentResult
19
+ mutate {
20
+ return & _storage. baseAddress . unsafelyUnwrapped . pointee
21
+ }
18
22
}
19
23
20
24
public subscript( index: Int ) -> Element {
@@ -23,24 +27,41 @@ public struct Container<Element: ~Copyable >: ~Copyable {
23
27
precondition ( index >= 0 && index < _count, " Index out of bounds " )
24
28
return _storage. baseAddress. unsafelyUnwrapped. advanced ( by: index) . pointee
25
29
}
30
+ @_unsafeSelfDependentResult
31
+ mutate {
32
+ precondition ( index >= 0 && index < _count, " Index out of bounds " )
33
+ return & _storage. baseAddress. unsafelyUnwrapped. advanced ( by: index) . pointee
34
+ }
26
35
}
27
36
}
28
37
29
38
extension Container : Copyable where Element: Copyable { }
30
39
31
40
func test( ) {
32
41
let n = 10_000
33
- let arr = Array ( 0 ... n)
34
- let sum = arr. withUnsafeBufferPointer { ubpointer in
35
- let container = Container ( _storage: ubpointer, _count: arr. count)
42
+ var arr = Array ( 0 ... n)
43
+ let count = arr. count
44
+ let sum = arr. withUnsafeMutableBufferPointer { ubpointer in
45
+ let container = Container ( _storage: ubpointer, _count: count)
36
46
var sum = 0
37
47
for i in 0 ..< container. _count {
38
48
sum &+= container [ i]
39
49
}
40
50
return sum
41
51
}
42
52
let expectedSum = n * ( n + 1 ) / 2
43
- assert ( sum == expectedSum)
53
+ assert ( sum == expectedSum)
54
+ let mutated_sum = arr. withUnsafeMutableBufferPointer { ubpointer in
55
+ var container = Container ( _storage: ubpointer, _count: count)
56
+ var sum = 0
57
+ for i in 0 ..< container. _count {
58
+ container [ i] &+= 1
59
+ sum += container [ i]
60
+ }
61
+ return sum
62
+ }
63
+ let mutatedExpectedSum = ( n + 1 ) * ( n + 2 ) / 2
64
+ assert ( mutated_sum == mutatedExpectedSum)
44
65
}
45
66
46
67
test ( )
0 commit comments