Ignore type bindings in generic_predicates_for_param

This allows us to handle more cases without a query cycle, which
includes certain cases that rustc accepted. That in turn means we avoid
triggering salsa-rs/salsa#257 on valid code (it will still happen if the
user writes an actual cycle).

We actually accept more definitions than rustc now; that's because rustc
only ignores bindings when looking up super traits, whereas we now also
ignore them when looking for predicates to disambiguate associated type
shorthand. We could introduce a separate query for super traits if
necessary, but for now I think this should be fine.
This commit is contained in:
Florian Diebold 2021-03-20 20:07:36 +01:00
parent 0623bb4d71
commit d8f8b495ad
6 changed files with 52 additions and 19 deletions

View file

@ -2068,7 +2068,10 @@ impl Type {
match pred {
WhereClause::Implemented(trait_ref) => {
cb(type_.clone());
walk_substs(db, type_, &trait_ref.substitution, cb);
// skip the self type. it's likely the type we just got the bounds from
for ty in trait_ref.substitution.iter().skip(1) {
walk_type(db, &type_.derived(ty.clone()), cb);
}
}
_ => (),
}