> On Dec 15, 2016, at 11:46 PM, Richard Wei via swift-users > <swift-users@swift.org> wrote: > > Hi, > > Swift 3.0.2 seems to have broken my code due to mutating self capture. But I > have to pass inout self to the closure. Any workaround? > > let blockSize = min(512, count) > let blockCount = (count+blockSize-1)/blockSize > device.sync { // Launch CUDA kernel > try! fill<<<(blockSize, blockCount)>>>[ > .pointer(to: &self), .value(value), .value(Int64(count)) > ] > }
This looks like a compiler bug. Assuming `sync`'s closure is not @escaping, it should be allowed to capture self. If you haven't yet, would you be able to file a bug at bugs.swift.org? Does making a shadow copy work as a workaround, something like: var tmpSelf = self device.sync {... &tmpSelf ...} self = tmpSelf Note that, independently, this part looks fishy: > try! fill<<<(blockSize, blockCount)>>>[ > .pointer(to: &self) UnsafePointers formed by passing an argument inout are not valid after the called function returns, so if this function is forming and returning a pointer, it will likely result in undefined behavior. You should use `withUnsafePointer(&self) { p in ... }` to get a usable pointer. -Joe _______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users