From 3dd830b70ccb2d6937857e07470a5c15dd574ddd Mon Sep 17 00:00:00 2001 From: Bastian Kauschke Date: Mon, 11 May 2020 20:23:15 +0200 Subject: [PATCH] ptr eq for `Predicate` --- src/librustc_middle/ty/mod.rs | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/librustc_middle/ty/mod.rs b/src/librustc_middle/ty/mod.rs index 6bb47a8f30e..9e845668909 100644 --- a/src/librustc_middle/ty/mod.rs +++ b/src/librustc_middle/ty/mod.rs @@ -1016,14 +1016,23 @@ pub fn instantiate_supertrait( } } -#[derive(Clone, Copy, PartialEq, Eq, Hash, RustcEncodable, RustcDecodable, Lift)] +#[derive(Clone, Copy, Hash, RustcEncodable, RustcDecodable, Lift)] #[derive(HashStable)] pub struct Predicate<'tcx> { kind: &'tcx PredicateKind<'tcx>, } -impl Predicate<'tcx> { - pub fn kind(&self) -> &'tcx PredicateKind<'tcx> { +impl<'tcx> PartialEq for Predicate<'tcx> { + fn eq(&self, other: &Self) -> bool { + // `self.kind` is always interned. + ptr::eq(self.kind, other.kind) + } +} + +impl<'tcx> Eq for Predicate<'tcx> {} + +impl<'tcx> Predicate<'tcx> { + pub fn kind(self) -> &'tcx PredicateKind<'tcx> { self.kind } } @@ -1098,7 +1107,7 @@ impl<'tcx> Predicate<'tcx> { /// substitution in terms of what happens with bound regions. See /// lengthy comment below for details. pub fn subst_supertrait( - &self, + self, tcx: TyCtxt<'tcx>, trait_ref: &ty::PolyTraitRef<'tcx>, ) -> ty::Predicate<'tcx> { @@ -1369,7 +1378,7 @@ fn to_predicate(&self, tcx: TyCtxt<'tcx>) -> Predicate<'tcx> { } impl<'tcx> Predicate<'tcx> { - pub fn to_opt_poly_trait_ref(&self) -> Option> { + pub fn to_opt_poly_trait_ref(self) -> Option> { match self.kind() { &PredicateKind::Trait(ref t, _) => Some(t.to_poly_trait_ref()), PredicateKind::Projection(..) @@ -1384,7 +1393,7 @@ pub fn to_opt_poly_trait_ref(&self) -> Option> { } } - pub fn to_opt_type_outlives(&self) -> Option> { + pub fn to_opt_type_outlives(self) -> Option> { match self.kind() { &PredicateKind::TypeOutlives(data) => Some(data), PredicateKind::Trait(..) -- 2.44.0