-
Couldn't load subscription status.
- Fork 13.9k
Dedup elaborated predicates with const generic parameter in AutoTrait #108397
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
Conversation
|
r? @nagisa (rustbot has picked a reviewer for you, use r? to override) |
4510389 to
ee75156
Compare
|
☔ The latest upstream changes (presumably #108250) made this pull request unmergeable. Please resolve the merge conflicts. |
e24273d to
108cad1
Compare
|
r? @lcnr |
|
r? @BoxyUwU |
|
I'll play with the ball, too r? compiler |
|
@megakorre Could you update the snippet issue: #107715 in the PR description to Fixes #107715 so GitHub can prominently link to this PR from the issue (I almost missed that there is a fix) and autoclose it when this PR gets merged? That would be great, thanks! |
|
Closing this as the issue this is referencing is already closed/fixed. |
Fixes #107715
Explanation
The
param_envpassed in toevaluate_predicatesin the added test case has the constantNsubstituted for the value of the referencing constant1. But the call toelaborate_predicatesproduces non normalized obligations (without the constant being substituted).This means we will call
SelectionContext.selectwith aparam_envwith multiple Predicates that willrelateand cause a ambiguity. And eventually run in to a panic!.Other normalization workarounds already happens in the
AutoTraitFinderin the
add_user_predmethod to work around lifetime differences.But that method is called before
elaborate_predicateswhich is what ends up adding the non normalized predicate.This PR adds extra de-duplication with normalization that ends up removing the redundant predicate that causes the error here.
The first place I tried to put this de-duplication was in the Elaborator (this).
But the normalize utility I'm calling is not available from
rustc_inferand the comments inAutoTraitFinderseems to suggest that the need to normalize the predicates like this is unique to it's use.Existing Regression
running
cargo-rustc-bisectfinds that the test example was working befored49e7e7(PR: #103279).The removal of the code here makes the test pass. Not because the predicates then gets normalized the same. The
param_envwill still have extra predicates in it. But without the extra eval in therelate_constscodeSelectionContext.selectwill only pick on off the 2 bounds and there will not be a ambiguity.Making sure there are not multiple duplicates in the
param_envseems more in line with the rest ofAutoTraitFinder.generic_const_exprs
With
generic_const_exprsturned on the example works before and after this PR. The predicates get normalized to leaving the const un-evaluated in all cases.So I left a comment that this de-duping can probably be removed when that feature is stable. this code has a similar comment.
Questions:
generic_const_exprsenabled. That functionality was not broken before this so maybe its not needed? 🤷🏻 But the functionality of this is different in that case