Dedup elaborated predicates with const generic parameter in AutoTrait #108397
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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