about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_privacy/lib.rs8
-rw-r--r--src/test/compile-fail/trait-not-accessible.rs (renamed from src/test/run-pass/issue-16264.rs)23
2 files changed, 18 insertions, 13 deletions
diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs
index a004a068be4..ed8ec27705a 100644
--- a/src/librustc_privacy/lib.rs
+++ b/src/librustc_privacy/lib.rs
@@ -852,8 +852,12 @@ impl<'a, 'tcx> PrivacyVisitor<'a, 'tcx> {
             ty::ImplContainer(_) => {
                 self.check_static_method(span, method_def_id, name)
             }
-            // Trait methods are always accessible if the trait is in scope.
-            ty::TraitContainer(_) => {}
+            // Trait methods are always all public. The only controlling factor
+            // is whether the trait itself is accessible or not.
+            ty::TraitContainer(trait_def_id) => {
+                self.report_error(self.ensure_public(span, trait_def_id,
+                                                     None, "source trait"));
+            }
         }
     }
 }
diff --git a/src/test/run-pass/issue-16264.rs b/src/test/compile-fail/trait-not-accessible.rs
index 67701de6386..21668fcfeae 100644
--- a/src/test/run-pass/issue-16264.rs
+++ b/src/test/compile-fail/trait-not-accessible.rs
@@ -8,20 +8,21 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use outer::Foo;
+mod m {
+    trait Priv {
+        fn f(&self) {}
+    }
+    impl Priv for super::S {}
+    pub trait Pub: Priv {}
+}
 
-mod outer {
-    pub use self::inner::Foo;
+struct S;
+impl m::Pub for S {}
 
-    mod inner {
-        pub trait Foo {
-            fn bar(&self) {}
-        }
-        impl Foo for i32 {}
-    }
+fn g<T: m::Pub>(arg: T) {
+    arg.f(); //~ ERROR: source trait is private
 }
 
 fn main() {
-    let x: i32 = 0;
-    x.bar();
+    g(S);
 }