Rollup merge of #112965 - compiler-errors:circular-wf, r=aliemjay
Don't emit same goal as input during `wf::unnormalized_obligations` r? `@aliemjay` cc `@lcnr` I accidentally pruned the logic to handle `WF(?0)` when writing `wf::unnormalized_obligations`. idk if you wanted to construct a test first, but this is an obvious fix. Copied the comment from above. Fixes rust-lang/trait-system-refactor-initiative#36
This commit is contained in:
commit
766db8161b
6 changed files with 27 additions and 5 deletions
|
@ -1049,6 +1049,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
|||
}
|
||||
|
||||
ty::PredicateKind::Clause(ty::ClauseKind::WellFormed(ty)) => {
|
||||
let ty = self.resolve_vars_if_possible(ty);
|
||||
match self.tcx.sess.opts.unstable_opts.trait_solver {
|
||||
TraitSolver::Classic => {
|
||||
// WF predicates cannot themselves make
|
||||
|
|
|
@ -77,12 +77,19 @@ pub fn unnormalized_obligations<'tcx>(
|
|||
param_env: ty::ParamEnv<'tcx>,
|
||||
arg: GenericArg<'tcx>,
|
||||
) -> Option<Vec<traits::PredicateObligation<'tcx>>> {
|
||||
debug_assert_eq!(arg, infcx.resolve_vars_if_possible(arg));
|
||||
|
||||
// However, if `arg` IS an unresolved inference variable, returns `None`,
|
||||
// because we are not able to make any progress at all. This is to prevent
|
||||
// "livelock" where we say "$0 is WF if $0 is WF".
|
||||
if arg.is_non_region_infer() {
|
||||
return None;
|
||||
}
|
||||
|
||||
if let ty::GenericArgKind::Lifetime(..) = arg.unpack() {
|
||||
return Some(vec![]);
|
||||
}
|
||||
|
||||
debug_assert_eq!(arg, infcx.resolve_vars_if_possible(arg));
|
||||
|
||||
let mut wf = WfPredicates {
|
||||
infcx,
|
||||
param_env,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue