Hi swift-dev,

PR-9995 enables exclusivity runtime checks:
https://github.com/apple/swift/pull/9995

These checks catch violations of exclusivity that can't be discovered 
statically [0], printing the message:

"Simultaneous accesses to 0x*, but modification requires exclusive access."

The error message is followed by a backtrace and details on the source 
locations of the two conflicting accesses.

In Swift 3 mode, this runtime diagnostic is a warning. In Swift 4 mode it is an 
error, meaning the program aborts immediately after reporting the first failure.

To disable the runtime checks, use -enforce-exclusivity=unchecked, which 
enables static
checks only.

This feature is explained in the Swift evolution proposal: Enforce Exclusive 
Access to Memory:
https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md

Note that exclusivity is not yet fully enforced for noescape closures. The 
current checks are conservative in this respect. Enforcement will be 
strengthened to handle this case in the near future, pending review of the 
proposal ammendment: "Restrictions on recursive uses of non-escaping closures".
https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md#restrictions-on-recursive-uses-of-non-escaping-closures

[0] dynamic exclusivity violation

struct MyStruct {
  var i: Int = 0

  mutating func mutateS(_ f: ()->Int) {
    i += f()
  }
}

class MyClass {
  var s: MyStruct
  
  init() { s = MyStruct() }
}

func foo(_ o: MyClass) {
  o.s.mutateS({ o.s.i })
}

-Andy
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to