]> git.lizzy.rs Git - rust.git/commitdiff
Convert tests to cross-crate, fix a RefCell bug I found in the process.
authorNiko Matsakis <niko@alum.mit.edu>
Wed, 1 Oct 2014 11:51:46 +0000 (07:51 -0400)
committerNiko Matsakis <niko@alum.mit.edu>
Thu, 9 Oct 2014 21:19:53 +0000 (17:19 -0400)
src/librustc/middle/typeck/coherence/overlap.rs
src/test/auxiliary/go_trait.rs [new file with mode: 0644]
src/test/compile-fail/coherence-blanket-conflicts-with-specific-cross-crate.rs [new file with mode: 0644]
src/test/run-pass/traits-conditional-model-fn.rs

index 88e09c306006083dca903b179a1f711fdcbc3a1a..ccfa31df8264674ec182c60cc272079fd8b4c00f 100644 (file)
@@ -35,8 +35,16 @@ struct OverlapChecker<'cx, 'tcx:'cx> {
 impl<'cx, 'tcx> OverlapChecker<'cx, 'tcx> {
     fn check_for_overlapping_impls(&self) {
         debug!("check_for_overlapping_impls");
-        let trait_impls = self.tcx.trait_impls.borrow();
-        for trait_def_id in trait_impls.keys() {
+
+        // Collect this into a vector to avoid holding the
+        // refcell-lock during the
+        // check_for_overlapping_impls_of_trait() check, since that
+        // check can populate this table further with impls from other
+        // crates.
+        let trait_def_ids: Vec<ast::DefId> =
+            self.tcx.trait_impls.borrow().keys().map(|&d| d).collect();
+
+        for trait_def_id in trait_def_ids.iter() {
             self.check_for_overlapping_impls_of_trait(*trait_def_id);
         }
     }
diff --git a/src/test/auxiliary/go_trait.rs b/src/test/auxiliary/go_trait.rs
new file mode 100644 (file)
index 0000000..4902766
--- /dev/null
@@ -0,0 +1,51 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Common code used for tests that model the Fn/FnMut/FnOnce hierarchy.
+
+pub trait Go {
+    fn go(&self, arg: int);
+}
+
+pub fn go<G:Go>(this: &G, arg: int) {
+    this.go(arg)
+}
+
+pub trait GoMut {
+    fn go_mut(&mut self, arg: int);
+}
+
+pub fn go_mut<G:GoMut>(this: &mut G, arg: int) {
+    this.go_mut(arg)
+}
+
+pub trait GoOnce {
+    fn go_once(self, arg: int);
+}
+
+pub fn go_once<G:GoOnce>(this: G, arg: int) {
+    this.go_once(arg)
+}
+
+impl<G> GoMut for G
+    where G : Go
+{
+    fn go_mut(&mut self, arg: int) {
+        go(&*self, arg)
+    }
+}
+
+impl<G> GoOnce for G
+    where G : GoMut
+{
+    fn go_once(mut self, arg: int) {
+        go_mut(&mut self, arg)
+    }
+}
diff --git a/src/test/compile-fail/coherence-blanket-conflicts-with-specific-cross-crate.rs b/src/test/compile-fail/coherence-blanket-conflicts-with-specific-cross-crate.rs
new file mode 100644 (file)
index 0000000..2e163bc
--- /dev/null
@@ -0,0 +1,29 @@
+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// aux-build:go_trait.rs
+
+extern crate go_trait;
+
+use go_trait::{Go,GoMut};
+use std::fmt::Show;
+use std::default::Default;
+
+struct MyThingy;
+
+impl Go for MyThingy {
+    fn go(&self, arg: int) { }
+}
+
+impl GoMut for MyThingy { //~ ERROR conflicting implementations
+    fn go_mut(&mut self, arg: int) { }
+}
+
+fn main() { }
index 11e144e7dfe4ea3a365333baa130add7bd6d49e4..92ba5aad05958f7f142c11027d5bb63f92f76ac6 100644 (file)
 // most one of `Go`, `GoMut`, or `GoOnce`, and then the others follow
 // automatically.
 
-use std::rc::Rc;
-use std::cell::Cell;
-
-trait Go {
-    fn go(&self, arg: int);
-}
-
-fn go<G:Go>(this: &G, arg: int) {
-    this.go(arg)
-}
+// aux-build:go_trait.rs
 
-trait GoMut {
-    fn go_mut(&mut self, arg: int);
-}
+extern crate go_trait;
 
-fn go_mut<G:GoMut>(this: &mut G, arg: int) {
-    this.go_mut(arg)
-}
-
-trait GoOnce {
-    fn go_once(self, arg: int);
-}
+use go_trait::{Go, GoMut, GoOnce, go, go_mut, go_once};
 
-fn go_once<G:GoOnce>(this: G, arg: int) {
-    this.go_once(arg)
-}
-
-impl<G> GoMut for G
-    where G : Go
-{
-    fn go_mut(&mut self, arg: int) {
-        go(&*self, arg)
-    }
-}
-
-impl<G> GoOnce for G
-    where G : GoMut
-{
-    fn go_once(mut self, arg: int) {
-        go_mut(&mut self, arg)
-    }
-}
+use std::rc::Rc;
+use std::cell::Cell;
 
 ///////////////////////////////////////////////////////////////////////////