-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Settle desired semantics of divergence for purposes of coercion #40800
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
It sounds to me like your original rules are more intuitive and less likely to lead to weird behaviour (e.g. under the current rules, |
@dhardy yes. I suspect the impact is quite minimal, but hard to know until we put in the implementation effort. I should probably write up some mentoring instructions; I know I don't have time to pursue it myself. |
Ah, I see. One of these days I should put in the effort of learning the Rust codebase. |
@nikomatsakis What's the status of this at the moment? Has any more work been done towards it or do you have any solid ideas about what needs to be done? |
@arielb1 and I were talking and I've been kind of failing to find the time to write up our conclusions. In the case of this question, we were wondering if would be possible to remove the "coerce into |
I'm happy to do whatever needs to be done to get |
Whereabouts might this "right place" be? I had a look but couldn't see where this coercion happens :/ |
In #40224, I adopted the rule that one can coerce into the type
!
if your expression is considered to diverge (in short, returns, breaks, or must evaluate some expression of type!
).However, the code doens't quite implement that rule. As described in this comment, it actually uses the
self.diverges
flag of theFnCtxt
, which today tracks a property that is different in a subtle way. The property we are checking is: if the coercion of the expression E happens in the context of an expression F, it is permitted to coerce to!
if the expression F has diverged by the time that E finishes evaluating.So in particular, under the rules I originally envisioned, this would not be allowed (see
src/test/compile-fail/coerce-to-bang.rs
for more examples):But under the rules as implemented, it is allowed. It's not clear which rules we would prefer. I think I lean towards my original rules: they mean that whether an expression
E
can be coerced to a typeT
is purely a function ofE
(modulo free variables of course). But implementing that will require refactoring the compiler.In my
diverging-types-and-reachability
branch, I changed how things work so that divergence is propagated upward, and "reachability" is passed downward. Divergence is thus a property purely of the expression at hand, whereas reachability is computed based on context. We use the combination of the two to drive unreachable warnings -- in particular, when you have reachable code which evaluates a diverging expression, the next thing to be evaluated triggered a warning. The precise setup I had in that branch doesn't work, sadly, because it only computed divergence after all types were known. Some refactoring needed.Moreover, there are some other places I cut corners in the existing code, and I'm using this same FIXME to track them: in particular, in cast expressions, I am ignoring whether they diverge for the purposes of this check. That's just laziness.
The text was updated successfully, but these errors were encountered: