> On Jul 28, 2017, at 12:06 AM, David Hart via swift-users > <swift-users@swift.org> wrote: > > Hello, > > Indeed, I had reduced the code too much. John McCall was kind enough to have > a look and here’s the offending code: > > func layoutHorizontally(leftRect: inout CGRect, rightRect: inout CGRect) { > let totalWidth = imageRect.size.width + titleRect.size.width + > contentSpacing > rightRect.origin.x = leftRect.maxX + contentSpacing > } > > The problem is that imageRect and titleRect are referenced both directly and > in the inout parameters. > > But there’s something I’m not understanding. I went back to the ownership > manifesto and re-read the law of exclusivity to make sure I understand it: > > If a storage reference expression evaluates to a storage reference that is > implemented by a variable, then the formal access duration of that access may > not overlap the formal access duration of any other access to the same > variable unless both accesses are reads. > > So I tried to write a test to trigger the runtime error, but was unsuccessful: > > class MyClass { > var p: CGRect = .zero > } > > func trigger(a: MyClass, b: MyClass) { > a.p = b.p > } > > let m = MyClass() > trigger(a: m, b: m) > > Here, a storage reference expression (a.p) evaluates to a storage reference > that is implemented by a variable (the p property of an instance m of > MyClass) and its formal access duration (the trigger function) overlaps the > formal access duration of another access to the same variable (through the > b.p storage reference expression) and both accesses are not reads (a.p is on > the LHS of an assignment). > > Why does this not trigger the Law of Exclusivity?
`b.p` is loaded before `a.p` is written to, so the accesses do not overlap even when a === b. Something like swap(&a.p, &b.p) (using the Swift 3 global definition of 'swap') would trigger an exclusivity trap when a === b, since the access to storage passed as an inout argument needs to last for the duration of the call. -Joe
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users