about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-03-06 02:29:34 +0000
committerbors <bors@rust-lang.org>2016-03-06 02:29:34 +0000
commit45f0ce71c19d8da081714dc917f11a8cc02d15be (patch)
tree80b760addf4deae8de33b8c783ea53e374fb36f5 /src/test
parent52e0bda644823089f16795cc9e071cf827b4810b (diff)
parentd908ff1759bf27a8a8a99f113a246b8abc61f425 (diff)
downloadrust-45f0ce71c19d8da081714dc917f11a8cc02d15be.tar.gz
rust-45f0ce71c19d8da081714dc917f11a8cc02d15be.zip
Auto merge of #31920 - jseyfried:fix_spurious_privacy_error, r=nikomatsakis
This PR allows using methods from traits that are visible but are defined in an inaccessible module (fixes #18241). For example,
```rust
mod foo {
    pub use foo::bar::Tr;
    mod bar { // This module is inaccessible from `g`
        pub trait Tr { fn f(&self) {} }
    }
}
fn g<T: foo::Tr>(t: T) {
    t.f(); // Currently, this is a privacy error even though `foo::Tr` is visible
}
```

After this PR, it will continue to be a privacy error to use a method from a trait that is not visible. This can happen when a public trait inherits from a private trait (in violation of the `public_in_private` lint) -- see @petrochenkov's example in #28504.
r? @nikomatsakis
Diffstat (limited to 'src/test')
-rw-r--r--src/test/compile-fail/trait-not-accessible.rs2
-rw-r--r--src/test/compile-fail/trait-privacy.rs30
2 files changed, 31 insertions, 1 deletions
diff --git a/src/test/compile-fail/trait-not-accessible.rs b/src/test/compile-fail/trait-not-accessible.rs
index 21668fcfeae..5feef0a24eb 100644
--- a/src/test/compile-fail/trait-not-accessible.rs
+++ b/src/test/compile-fail/trait-not-accessible.rs
@@ -20,7 +20,7 @@ struct S;
 impl m::Pub for S {}
 
 fn g<T: m::Pub>(arg: T) {
-    arg.f(); //~ ERROR: source trait is private
+    arg.f(); //~ ERROR: source trait `m::Priv` is private
 }
 
 fn main() {
diff --git a/src/test/compile-fail/trait-privacy.rs b/src/test/compile-fail/trait-privacy.rs
new file mode 100644
index 00000000000..a0d0014a064
--- /dev/null
+++ b/src/test/compile-fail/trait-privacy.rs
@@ -0,0 +1,30 @@
+// 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.
+
+#![feature(rustc_attrs)]
+#![allow(dead_code)]
+
+mod foo {
+    pub use self::bar::T;
+    mod bar {
+        pub trait T {
+            fn f(&self) {}
+        }
+        impl T for () {}
+    }
+}
+
+fn g() {
+    use foo::T;
+    ().f(); // Check that this does not trigger a privacy error
+}
+
+#[rustc_error]
+fn main() {} //~ ERROR compilation successful