On Sun, Oct 14, 2012 at 4:07 PM, Richard Smith <span dir="ltr"><<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div class="im">On Fri, Oct 12, 2012 at 7:07 PM, Argyrios Kyrtzidis <span dir="ltr"><<a href="mailto:kyrtzidis@apple.com" target="_blank">kyrtzidis@apple.com</a>></span> wrote:<br></div><div class="gmail_quote"><div class="im">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div>On Oct 4, 2012, at 4:56 PM, Richard Smith <<a href="mailto:richard@metafoo.co.uk" target="_blank">richard@metafoo.co.uk</a>> wrote:<br>
<br>
> As of r165273, clang produces 'unreachable' if we flow off the end of a value-returning function (without returning a value) in C++. This is undefined behavior, but we used to just return undef, instead of trying to exploit it. Please let me know if this causes problems for you, and we can weaken it to an acceptable level.<br>


<br>
</div>FYI, this caused some libc++ tests to crash (or not terminate). To highlight one example, there was this method:<br>
<br>
> template <class _CharT, class _Traits><br>
> inline _LIBCPP_INLINE_VISIBILITY<br>
> basic_filebuf<_CharT, _Traits>&<br>
> basic_filebuf<_CharT, _Traits>::operator=(basic_filebuf&& __rhs)<br>
> {<br>
>     close();<br>
>     swap(__rhs);<br>
> }<br>
<br>
Notice the absence of a "return *this".<br>
<br>
At the test (test/input.output/file.streams/fstreams/filebuf.assign/move_assign.pass.cpp) the method was used like this:<br>
<br>
 std::filebuf f2;<br>
 f2 = move(f);<br>
<br>
Notice that the returned value from 'operator=' is ignored.<br>
<br>
There was a crash with a stack trace showing bad access inside "libunwind.dylib`_Unwind_Resume"; the stack trace didn't provide much hint at what the culprit is.<br>
<br>
I don't think producing 'unreachable' always by default is a good idea; this is too aggressive to do at the frontend level and it makes debugging (on a "-O0 -g" build) a nightmare.</blockquote><div>

<br></div></div><div>Yeah, we were worried that this might be a problem for people who don't use -Wreturn-type. How would you feel about inserting a call to llvm.trap before the unreachable if we're building without optimizations? </div>

</div>
</blockquote></div><br><div>I've implemented this in r165914. We can tune this further if there are still debugability problems.</div>