11// 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
33// RUN: %target-codesign %t/a.out
44// RUN: %target-run %t/a.out
55
66// REQUIRES: swift_feature_BorrowAndMutateAccessors
77// REQUIRES: executable_test
88
99public struct Container < Element: ~ Copyable > : ~ Copyable {
10- var _storage : UnsafeBufferPointer < Element >
10+ var _storage : UnsafeMutableBufferPointer < Element >
1111 var _count : Int
1212
1313 var first : Element {
1414 @_unsafeSelfDependentResult
1515 borrow {
1616 return _storage. baseAddress. unsafelyUnwrapped. pointee
1717 }
18+ @_unsafeSelfDependentResult
19+ mutate {
20+ return & _storage. baseAddress . unsafelyUnwrapped . pointee
21+ }
1822 }
1923
2024 public subscript( index: Int ) -> Element {
@@ -23,24 +27,41 @@ public struct Container<Element: ~Copyable >: ~Copyable {
2327 precondition ( index >= 0 && index < _count, " Index out of bounds " )
2428 return _storage. baseAddress. unsafelyUnwrapped. advanced ( by: index) . pointee
2529 }
30+ @_unsafeSelfDependentResult
31+ mutate {
32+ precondition ( index >= 0 && index < _count, " Index out of bounds " )
33+ return & _storage. baseAddress. unsafelyUnwrapped. advanced ( by: index) . pointee
34+ }
2635 }
2736}
2837
2938extension Container : Copyable where Element: Copyable { }
3039
3140func test( ) {
3241 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)
3646 var sum = 0
3747 for i in 0 ..< container. _count {
3848 sum &+= container [ i]
3949 }
4050 return sum
4151 }
4252 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)
4465}
4566
4667test ( )
0 commit comments