# Pre-RFC: explicit proper tail calls

**URL:** <https://internals.rust-lang.org/t/pre-rfc-explicit-proper-tail-calls/3797>\
**Category:** language design\
**Created:** [August 1, 2016, 10:35pm UTC](https://internals.rust-lang.org/t/pre-rfc-explicit-proper-tail-calls/3797 "2016-08-01T22:35:45Z")\
**Posts on this page:** 1\
**Showing post:** 14

<div class="post-metadata">

**Author:** ![scottmcm](https://sea2.discourse-cdn.com/flex002/user_avatar/internals.rust-lang.org/scottmcm/32/2355_2.png) [@scottmcm](https://internals.rust-lang.org/u/scottmcm)\
**Post date:** [November 27, 2016, 11:10pm UTC](https://internals.rust-lang.org/t/pre-rfc-explicit-proper-tail-calls/3797/14 "2016-11-27T23:10:35Z")

</div>

> [@notriddle](#):
>
> Probably not. become statements would diverge, and divergent statements can coerce to anything else.

Oh, thanks. I'd totally misunderstood how return actually worked.

Hmm, I guess I made a false implication from this note in [the book](https://doc.rust-lang.org/stable/book/functions.html#early-returns) that's right before a return-with-a-semicolon example:

> but with a semicolon, it would return () instead

Interesting that "!" and "!;" have the same type, but "i32" and "i32;" don't. (And it's not that `Never` infects everything after it; it seems "!" and "!;()" don't have the same type either.) That's a bit odd, but I guess not something that can be fixed now.

---

_[View the full topic](https://internals.rust-lang.org/t/pre-rfc-explicit-proper-tail-calls/3797)._
