forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathformal_access.swift
67 lines (56 loc) · 1.81 KB
/
formal_access.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
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
// RUN: %target-run-simple-swift | %FileCheck %s
// REQUIRES: executable_test
class C: CustomStringConvertible {
var value: Int
init(_ v: Int) { value = v }
var description: String { return String(value) }
}
var global = [C(1), C(2)]
print("Begin")
print("1. global[0] == \(global[0])")
// CHECK: Begin
// CHECK-NEXT: 1. global[0] == 1
func doit(_ local: inout C) {
print("2. local == \(local)")
print("2. global[0] == \(global[0])")
// CHECK-NEXT: 2. local == 1
// CHECK-NEXT: 2. global[0] == 1
// There's a connection between 'local' and 'global[0]'.
local = C(4)
print("3. local == \(local)")
print("3. global[0] == \(global[0])")
// CHECK-NEXT: 3. local == 4
// CHECK-NEXT: 3. global[0] == 4
// This assignment is to a different index and so is
// not allowed to cause unspecified behavior.
global[1] = C(5)
print("4. local == \(local)")
print("4. global[0] == \(global[0])")
// CHECK-NEXT: 4. local == 4
// CHECK-NEXT: 4. global[0] == 4
// The connection is not yet broken.
local = C(2)
print("5. local == \(local)")
print("5. global[0] == \(global[0])")
// CHECK-NEXT: 5. local == 2
// CHECK-NEXT: 5. global[0] == 2
// This assignment structurally changes 'global' while a
// simultaneous modification is occurring to it. This is
// allowed to have unspecified behavior but not to crash.
global.append(C(3))
print("6. local == \(local)")
print("6. global[0] == \(global[0])")
// CHECK-NEXT: 6. local == 2
// CHECK-NEXT: 6. global[0] == 2
// Note that here the connection is broken.
local = C(7)
print("7. local == \(local)")
print("7. global[0] == \(global[0])")
// CHECK-NEXT: 7. local == 7
// CHECK-NEXT: 7. global[0] == 2
}
doit(&global[0])
print("8. global[0] == \(global[0])")
print("End")
// CHECK-NEXT: 8. global[0] == 2
// CHECK-NEXT: End