| // 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 |