From 3db22039dceb36fc15e770c24ec99e2db1ca586d Mon Sep 17 00:00:00 2001 From: Michael Hewson Date: Wed, 17 Oct 2018 18:54:13 -0400 Subject: [PATCH] Remove this check for object-safety during selection of trait object candidates I don't really understand what it's for, but see the comment here: https://github.com/rust-lang/rust/pull/50173#discussion_r204222336 where arielb1 said > Does this check do anything these days? I think `$0: Trait` is always considered ambiguous and nikomatsakis agreed we may be able to get rid of it --- src/librustc/traits/select.rs | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/librustc/traits/select.rs b/src/librustc/traits/select.rs index 0742f377f18c2..126c158f846bd 100644 --- a/src/librustc/traits/select.rs +++ b/src/librustc/traits/select.rs @@ -2111,17 +2111,6 @@ impl<'cx, 'gcx, 'tcx> SelectionContext<'cx, 'gcx, 'tcx> { data.principal().with_self_ty(this.tcx(), self_ty) } ty::Infer(ty::TyVar(_)) => { - // Object-safety candidates are only applicable to object-safe - // traits. Including this check is useful because it helps - // inference in cases of traits like `BorrowFrom`, which are - // not object-safe, and which rely on being able to infer the - // self-type from one of the other inputs. Without this check, - // these cases wind up being considered ambiguous due to a - // (spurious) ambiguity introduced here. - let predicate_trait_ref = obligation.predicate.to_poly_trait_ref(); - if !this.tcx().is_object_safe(predicate_trait_ref.def_id()) { - return; - } debug!("assemble_candidates_from_object_ty: ambiguous"); candidates.ambiguous = true; // could wind up being an object type return;