about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/test/compile-fail/autoderef-privacy.rs49
-rw-r--r--src/test/compile-fail/issue-22684.rs28
2 files changed, 77 insertions, 0 deletions
diff --git a/src/test/compile-fail/autoderef-privacy.rs b/src/test/compile-fail/autoderef-privacy.rs
new file mode 100644
index 00000000000..359cee760db
--- /dev/null
+++ b/src/test/compile-fail/autoderef-privacy.rs
@@ -0,0 +1,49 @@
+// Copyright 2016 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.
+
+// Check we do not select a private method or field when computing autoderefs
+
+#![feature(rustc_attrs)]
+#![allow(unused)]
+
+pub struct Bar2 { i: i32 }
+pub struct Baz2(i32);
+
+impl Bar2 {
+    fn f(&self) {}
+}
+
+mod foo {
+    pub struct Bar { i: i32 }
+    pub struct Baz(i32);
+
+    impl Bar {
+        fn f(&self) {}
+    }
+
+    impl ::std::ops::Deref for Bar {
+        type Target = ::Bar2;
+        fn deref(&self) -> &::Bar2 { unimplemented!() }
+    }
+
+    impl ::std::ops::Deref for Baz {
+        type Target = ::Baz2;
+        fn deref(&self) -> &::Baz2 { unimplemented!() }
+    }
+}
+
+fn f(bar: foo::Bar, baz: foo::Baz) {
+    let _ = bar.i;
+    let _ = baz.0;
+    let _ = bar.f();
+}
+
+#[rustc_error]
+fn main() {} //~ ERROR compilation successful
diff --git a/src/test/compile-fail/issue-22684.rs b/src/test/compile-fail/issue-22684.rs
new file mode 100644
index 00000000000..b7ffbefba6a
--- /dev/null
+++ b/src/test/compile-fail/issue-22684.rs
@@ -0,0 +1,28 @@
+// Copyright 2016 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.
+
+mod foo {
+    pub struct Foo;
+    impl Foo {
+        fn bar(&self) {}
+    }
+
+    pub trait Baz {
+        fn bar(&self) -> bool {}
+    }
+    impl Baz for Foo {}
+}
+
+fn main() {
+    use foo::Baz;
+
+    // Check that `bar` resolves to the trait method, not the inherent impl method.
+    let _: () = foo::Foo.bar(); //~ ERROR mismatched types
+}