-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Dedup elaborated predicates with const generic parameter in AutoTrait #108397
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_env
passed in toevaluate_predicates
in the added test case has the constantN
substituted for the value of the referencing constant1
. But the call toelaborate_predicates
produces non normalized obligations (without the constant being substituted).This means we will call
SelectionContext.select
with aparam_env
with multiple Predicates that willrelate
and cause a ambiguity. And eventually run in to a panic!.Other normalization workarounds already happens in the
AutoTraitFinder
in the
add_user_pred
method to work around lifetime differences.But that method is called before
elaborate_predicates
which 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_infer
and the comments inAutoTraitFinder
seems to suggest that the need to normalize the predicates like this is unique to it's use.Existing Regression
running
cargo-rustc-bisect
finds 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_env
will still have extra predicates in it. But without the extra eval in therelate_consts
codeSelectionContext.select
will only pick on off the 2 bounds and there will not be a ambiguity.Making sure there are not multiple duplicates in the
param_env
seems more in line with the rest ofAutoTraitFinder
.generic_const_exprs
With
generic_const_exprs
turned 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_exprs
enabled. That functionality was not broken before this so maybe its not needed? 🤷🏻 But the functionality of this is different in that case