-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathkeypath-mutation.swift
35 lines (30 loc) · 1.02 KB
/
keypath-mutation.swift
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
// RUN: %target-typecheck-verify-swift
struct User {
var id: Int
var name: String
}
func setting<Root, Value>(_ kp: WritableKeyPath<Root, Value>, _ root: Root, _ value: Value) -> Root {
var copy = root
// Should not warn about lack of mutation
copy[keyPath: kp] = value
return copy
}
func referenceSetting<Root, Value>(_ kp: ReferenceWritableKeyPath<Root, Value>, _ root: Root, _ value: Value) -> Root {
// Should warn about lack of mutation, since a RefKeyPath doesn't modify its
// base.
// expected-warning@+1 {{was never mutated}}
var copy = root
copy[keyPath: kp] = value
// Should not warn about lack of use of `immCopy`
let immCopy = root
immCopy[keyPath: kp] = value
return copy
}
func referenceUsage<Root, Value>(_ kp: ReferenceWritableKeyPath<Root, Value>, _ root: Root, _ value: Value) -> Root {
// Should warn about lack of mutation, since a RefKeyPath doesn't modify its
// base.
// expected-warning@+1 {{was never mutated}}
var copy = root
copy[keyPath: kp] = value
return copy
}