]> git.lizzy.rs Git - rust.git/blobdiff - src/librustc/traits/object_safety.rs
forbid all self-referencing predicates
[rust.git] / src / librustc / traits / object_safety.rs
index df87d624e3a6635144ff210a21da2f36432b1eea..60808fbc741fb9898bde442a1f568641256b68d9 100644 (file)
@@ -82,7 +82,7 @@ pub fn astconv_object_safety_violations(self, trait_def_id: DefId)
         let mut violations = vec![];
 
         for def_id in traits::supertrait_def_ids(self, trait_def_id) {
-            if self.supertraits_reference_self(def_id) {
+            if self.predicates_reference_self(def_id, true) {
                 violations.push(ObjectSafetyViolation::SupertraitSelf);
             }
         }
@@ -117,7 +117,7 @@ fn object_safety_violations_for_trait(self, trait_def_id: DefId)
         if self.trait_has_sized_self(trait_def_id) {
             violations.push(ObjectSafetyViolation::SizedSelf);
         }
-        if self.supertraits_reference_self(trait_def_id) {
+        if self.predicates_reference_self(trait_def_id, false) {
             violations.push(ObjectSafetyViolation::SupertraitSelf);
         }
 
@@ -128,12 +128,20 @@ fn object_safety_violations_for_trait(self, trait_def_id: DefId)
         violations
     }
 
-    fn supertraits_reference_self(self, trait_def_id: DefId) -> bool {
+    fn predicates_reference_self(
+        self,
+        trait_def_id: DefId,
+        supertraits_only: bool) -> bool
+    {
         let trait_ref = ty::Binder(ty::TraitRef {
             def_id: trait_def_id,
             substs: Substs::identity_for_item(self, trait_def_id)
         });
-        let predicates = self.item_super_predicates(trait_def_id);
+        let predicates = if supertraits_only {
+            self.item_super_predicates(trait_def_id)
+        } else {
+            self.item_predicates(trait_def_id)
+        };
         predicates
             .predicates
             .into_iter()