<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">Those UnsafeMutablePointer&lt;T&gt;(…) calls aren’t correct. When an array is implicitly converted to a pointer in Swift, the pointer is only valid for the <i class="">immediate</i>&nbsp;call that it’s being passed to. In this case, that’s the UnsafeMutablePointer initializer, and after that the pointer is invalid. So it’s possible that either the same space is being reused for both pointers, or that it’s <i class="">not</i>&nbsp;uniquing the array because it thinks it only has to make an UnsafePointer&lt;T&gt;, or both.</div><div class=""><br class=""></div><div class="">As Brent says, passing the arrays directly to the method using inout semantics (&amp;) should get you the behavior you want.</div><div class=""><br class=""></div><div class="">(Yes, there should be a diagnostic for this. I’m pretty sure we have a bug already, so no need to file. The Swift 3 pointer APIs make this a little harder to do by accident, too.)</div><div class=""><br class=""></div><div class="">Jordan</div><div class=""><br class=""></div><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 5, 2016, at 08:14, Raphael Sebbe via swift-users &lt;<a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Do you see a reason why the copy isn't happening in this specific case? Is it a bug, or a mistake in my code?<div class=""><br class=""></div><div class="">Thank you,</div><div class=""><br class=""></div><div class="">Raphael</div></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Thu, Aug 4, 2016 at 4:18 PM Brent Royal-Gordon &lt;<a href="mailto:brent@architechies.com" class="">brent@architechies.com</a>&gt; wrote:<br class=""></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">&gt; On Aug 4, 2016, at 1:25 AM, Raphael Sebbe via swift-users &lt;<a href="mailto:swift-users@swift.org" target="_blank" class="">swift-users@swift.org</a>&gt; wrote:<br class="">
&gt;<br class="">
&gt; My understanding is that the compiler doesn't make a real copy in the acopy =&nbsp; self instruction, and then provides that contents to the mx_gels_ function which modifies the memory contents.<br class="">
&gt;<br class="">
&gt;<br class="">
&gt; public func solve(rhs b: Matrix&lt;T&gt;) -&gt; Matrix&lt;T&gt;? {<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;// ...<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;var acopy = self<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;// ...<br class="">
&gt;<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;<a href="http://t.mx" class="">T.mx</a>_gels_(&amp;trans, &amp;m, &amp;n, &amp;nrhs, UnsafeMutablePointer&lt;T&gt;(acopy.values), &amp;lda, UnsafeMutablePointer&lt;T&gt;(x.values), &amp;ldb, UnsafeMutablePointer&lt;T&gt;(workspace), &amp;lwork, &amp;status);<br class="">
&gt;<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;// ...<br class="">
&gt;&nbsp; &nbsp; &nbsp; &nbsp;}<br class="">
&gt;<br class="">
&gt;<br class="">
&gt; Is this expected? I mean, I can force a real copy of course, but value semantics would suggest the code above is correct and wouldn't need that. Shouldn't the cast trigger the copy somehow? Or is there a better way of expressing this operation? Thx.<br class="">
<br class="">
The `acopy = self` line only copies the reference to the internal buffer. However, converting the array into a pointer will—or at least, if done properly, *should*—force the array to create and switch to using a unique copy of its buffer in preparation for writes through the UnsafeMutablePointer. I believe that happens here: &lt;<a href="https://github.com/apple/swift/blob/master/stdlib/public/core/Pointer.swift#L79" rel="noreferrer" target="_blank" class="">https://github.com/apple/swift/blob/master/stdlib/public/core/Pointer.swift#L79</a>&gt;<br class="">
<br class="">
(I say "should" because I'm not sure you're actually creating those pointers correctly. I believe you ought to be able to just say `&amp;acopy.values` and `&amp;x.values`, and that should be a more reliable way to do it.)<br class="">
<br class="">
--<br class="">
Brent Royal-Gordon<br class="">
Architechies<br class="">
<br class="">
</blockquote></div>
_______________________________________________<br class="">swift-users mailing list<br class=""><a href="mailto:swift-users@swift.org" class="">swift-users@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-users<br class=""></div></blockquote></div><br class=""></body></html>