<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=""><br class=""><div><blockquote type="cite" class=""><div class="">On Dec 10, 2015, at 2:58 PM, Adrian Kashivskyy 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=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I think non-void functions should warn about their return value being unused <b class="">by default</b>, thus eliminating the need to attribute&nbsp;them with @warn_unused_result.<br class=""><br class=""><b class="">Motivation</b><br class=""><br class="">It is a rare case for a result of a function to be unused – and most often it's caused by programmer having too little knowledge of the API. This, in my opinion, is a reasonable area of improvement for the compiler.<div class=""><br class=""></div><div class="">I also noticed that many of stdlib's functions are marked with this attribute, which supports my point of this being the default behavior.<br class=""><br class=""><b class="">Example code<br class=""></b><br class="">The following should be default behavior:<br class=""><br class=""><blockquote type="cite" class=""></blockquote><blockquote type="cite" class=""></blockquote><blockquote type="cite" class="">func square(x: Int) -&gt; Int { return x * x }<br class="">square(2) //&nbsp;warning: result of call to 'square' unused<br class=""></blockquote><br class="">Currently, unless annotated by @warn_unused_result, the compiler will not trigger any warnings.<div class=""><br class=""></div><div class=""><b class="">Supporting old behavior</b><br class=""><div class=""><br class=""></div><div class="">If, sometimes, it is okay to not use the result, an opposite @suppress_unused_result attribute could be used instead.</div><div class=""><br class=""></div><div class=""></div><blockquote type="cite" class=""><div class="">@suppress_unused_result func square(x: Int) -&gt; Int { return x * x }</div><div class="">square(2) // no warning<br class=""></div></blockquote><div class=""><br class=""><b class="">Impact on existing code</b><br class=""><br class="">The existing bare @warn_unused_result attributes will become redundant and can be easily removed by migrator. However, if an existing attribute uses message or&nbsp;mutable_variant argument, it may be left intact, since it provides non-obvious informational value.</div><div class=""><br class=""></div><div class="">Implementing the above proposal would definitely make the code clearer and intentional, without compromising any major use cases.</div><div class=""><br class=""></div><div class="">I would be happy to hear your thought on this.</div><div class="">&nbsp;<br class=""><br class="">Regards,<br class="">Adrian Kashivskyy<br class=""><br class=""></div></div></div>
<img src="https://u2002410.ct.sendgrid.net/wf/open?upn=JfMPa-2F7wwZPzsZ3QKA8NjtONIYX4SjbWuUxtpfsTY2iZ3Zs-2Be90AgLlGL6gAQhZmfgNvlZ4yrZAwp9IIO5lea5V1uUxpuwXRZXvNRjKjie4lkVxq1h8gK-2FwTXnvX-2FOnrNaY8I2PKKG9civ8pz5qGIp889z3PcsC90QQyJMmE1sRXUQk25rJbN779QJ-2Fg0bj3bWAPxT3U-2BZR2Dwkyjs0Yk4HRTOrvMbrYaTxYpJiJ-2FUU-3D" alt="" width="1" height="1" border="0" style="height:1px !important;width:1px !important;border-width:0 !important;margin-top:0 !important;margin-bottom:0 !important;margin-right:0 !important;margin-left:0 !important;padding-top:0 !important;padding-bottom:0 !important;padding-right:0 !important;padding-left:0 !important;" class="">
</div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""><div class="">strong +1 from me. &nbsp;@warn_unused_result is almost always the right answer in the standard library, and the few cases where it isn’t are very easy to notice (when the call has side-effects and the return value is incidental).</div><div class=""><br class=""></div><div class="">
-Dave<div class=""><br class=""></div><br class="Apple-interchange-newline">

</div>
<br class=""></div></body></html>