]> git.lizzy.rs Git - rust.git/commitdiff
fix stupid bug
authorAriel Ben-Yehuda <ariel.byd@gmail.com>
Mon, 3 Dec 2018 22:37:06 +0000 (00:37 +0200)
committerAriel Ben-Yehuda <ariel.byd@gmail.com>
Fri, 14 Dec 2018 17:14:22 +0000 (19:14 +0200)
src/librustc_typeck/coherence/inherent_impls_overlap.rs

index 8051056e4ba8dda09c351ddb2dcfc0565f80b896..c273c8f64567756a3e84c6410bde3752f95c653a 100644 (file)
@@ -94,7 +94,9 @@ fn check_for_overlapping_inherent_impls(&self, ty_def_id: DefId) {
 
         for (i, &impl1_def_id) in impls.iter().enumerate() {
             for &impl2_def_id in &impls[(i + 1)..] {
-                let mut used_to_be_allowed = traits::overlapping_impls(
+                // First, check if the impl was forbidden under the
+                // old rules. In that case, just have an error.
+                let used_to_be_allowed = traits::overlapping_impls(
                     self.tcx,
                     impl1_def_id,
                     impl2_def_id,
@@ -105,52 +107,60 @@ fn check_for_overlapping_inherent_impls(&self, ty_def_id: DefId) {
                             impl1_def_id,
                             impl2_def_id,
                             overlap,
-                            Some(FutureCompatOverlapErrorKind::Issue43355),
+                            None,
                         );
                         false
                     },
                     || true,
                 );
 
-                if used_to_be_allowed {
-                    used_to_be_allowed = traits::overlapping_impls(
-                        self.tcx,
-                        impl1_def_id,
-                        impl2_def_id,
-                        IntercrateMode::Fixed,
-                        TraitObjectMode::NoSquash,
-                        |overlap| {
-                            self.check_for_common_items_in_impls(
-                                impl1_def_id,
-                                impl2_def_id,
-                                overlap,
-                                None,
-                            );
-                            false
-                        },
-                        || true,
-                    );
+                if !used_to_be_allowed {
+                    continue;
                 }
 
-                if used_to_be_allowed {
-                    traits::overlapping_impls(
-                        self.tcx,
-                        impl1_def_id,
-                        impl2_def_id,
-                        IntercrateMode::Fixed,
-                        TraitObjectMode::SquashAutoTraitsIssue33140,
-                        |overlap| {
-                            self.check_for_common_items_in_impls(
-                                impl1_def_id,
-                                impl2_def_id,
-                                overlap,
-                                Some(FutureCompatOverlapErrorKind::Issue33140),
-                            );
-                            false
-                        },
-                        || true,
-                    );
+                // Then, check if the impl was forbidden under only
+                // #43355. In that case, emit an #43355 error.
+                let used_to_be_allowed = traits::overlapping_impls(
+                    self.tcx,
+                    impl1_def_id,
+                    impl2_def_id,
+                    IntercrateMode::Fixed,
+                    TraitObjectMode::NoSquash,
+                    |overlap| {
+                        self.check_for_common_items_in_impls(
+                            impl1_def_id,
+                            impl2_def_id,
+                            overlap,
+                            Some(FutureCompatOverlapErrorKind::Issue43355),
+                        );
+                        false
+                    },
+                    || true,
+                );
+
+                if !used_to_be_allowed {
+                    continue;
                 }
+
+                // Then, check if the impl was forbidden under
+                // #33140. In that case, emit a #33140 error.
+                traits::overlapping_impls(
+                    self.tcx,
+                    impl1_def_id,
+                    impl2_def_id,
+                    IntercrateMode::Fixed,
+                    TraitObjectMode::SquashAutoTraitsIssue33140,
+                    |overlap| {
+                        self.check_for_common_items_in_impls(
+                            impl1_def_id,
+                            impl2_def_id,
+                            overlap,
+                            Some(FutureCompatOverlapErrorKind::Issue33140),
+                        );
+                        false
+                    },
+                    || true,
+                );
             }
         }
     }