<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On May 7, 2016, at 6:43 PM, Matthew Johnson via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">If I read Andrew’s post correctly it sounds like it may also be of use to the optimizer in some cases.</span><br style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px; -webkit-text-stroke-width: 0px;" class=""></div></blockquote></div><div class=""><br class=""></div>I’ll just requote Dave’s example, which made perfect sense to me (so I’m not sure why there’s an argument):<div class=""><br class=""><div class=""></div></div><blockquote type="cite" class=""><div class=""><div class="">To me that means, if the behavior of “f” only depends on<br class="">data reachable through this array, and f makes no mutations, then in<br class="">this code, the two calls to f() are guaranteed have the same effect.<br class=""><br class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;func g&lt;T&gt;(a: [T]) {<br class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var vc = MyViewController(a)<br class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vc.f() // #1<br class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h()<br class="">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vc.f() // #2<br class="">&nbsp;&nbsp;&nbsp;&nbsp;}<br class=""><br class="">But clearly, the only way that can be the case is if T is actually<br class="">immutable (and contains no references to mutable data), because<br class="">otherwise anybody can write:<br class=""><br class="">&nbsp;&nbsp;&nbsp;class X { ... }<br class="">&nbsp;&nbsp;&nbsp;let global: [X] = [ X() ]<br class="">&nbsp;&nbsp;&nbsp;func h() { global[0].mutatingMethod() }<br class="">&nbsp;&nbsp;&nbsp;g(global)<br class=""><br class="">Conclusion: your definition of PureValue, as written, implies conforming<br class="">reference types must be immutable. &nbsp;I'm not saying that's necessarily<br class="">what you meant, but if it isn't, you need to try to define it again.</div></div></blockquote><div class=""><br class=""></div><div class="">Yes, of course. If a PureValue contains a reference it must be immutable or only mutated when uniquely referenced.</div><div class=""><br class=""></div><div class="">There are other ways to communicate what the optimizer needs. I think the more interesting question is how users should express the value semantics of their types.</div><div class=""><br class=""></div><div class="">-Andy</div></body></html>