From 0cfdb33720c2c1585595124ea6529f1ae059decd Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 26 Oct 2015 09:16:01 -0700 Subject: [PATCH 1/3] Revert "Add UFCS privacy test." This reverts commit b3e1aca40f889a565bfa2607b82b80fe7cbcefea. --- src/test/compile-fail/privacy-ufcs.rs | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 src/test/compile-fail/privacy-ufcs.rs diff --git a/src/test/compile-fail/privacy-ufcs.rs b/src/test/compile-fail/privacy-ufcs.rs deleted file mode 100644 index ccb379c717928..0000000000000 --- a/src/test/compile-fail/privacy-ufcs.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2015 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -// Test to ensure private traits are inaccessible with UFCS angle-bracket syntax. - -mod foo { - trait Bar { - fn baz() {} - } - - impl Bar for i32 {} -} - -fn main() { - ::baz(); //~ERROR method `baz` is inaccessible - //~^NOTE: trait `Bar` is private -} From cb0ce69026e895b41e7512d4665be05e212e8a7f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 26 Oct 2015 09:16:05 -0700 Subject: [PATCH 2/3] Revert "Remove unnecessary trait accessibility check." This reverts commit f4f95eb3a9f2c3c38679db84aabbb7cdb46d2641. --- src/librustc_privacy/lib.rs | 8 ++++++-- src/test/run-pass/issue-16264.rs | 27 --------------------------- 2 files changed, 6 insertions(+), 29 deletions(-) delete mode 100644 src/test/run-pass/issue-16264.rs diff --git a/src/librustc_privacy/lib.rs b/src/librustc_privacy/lib.rs index 608558ac2bdb9..ea20d2b423861 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/run-pass/issue-16264.rs deleted file mode 100644 index 67701de638693..0000000000000 --- a/src/test/run-pass/issue-16264.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2015 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 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -use outer::Foo; - -mod outer { - pub use self::inner::Foo; - - mod inner { - pub trait Foo { - fn bar(&self) {} - } - impl Foo for i32 {} - } -} - -fn main() { - let x: i32 = 0; - x.bar(); -} From 31fa9167c0046b3f225864d3e7317120694bfb8f Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 26 Oct 2015 09:17:09 -0700 Subject: [PATCH 3/3] test: Add regression test for "source trait is private" --- src/test/compile-fail/privacy-ufcs.rs | 24 ++++++++++++++++ src/test/compile-fail/trait-not-accessible.rs | 28 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/test/compile-fail/privacy-ufcs.rs create mode 100644 src/test/compile-fail/trait-not-accessible.rs diff --git a/src/test/compile-fail/privacy-ufcs.rs b/src/test/compile-fail/privacy-ufcs.rs new file mode 100644 index 0000000000000..ccb379c717928 --- /dev/null +++ b/src/test/compile-fail/privacy-ufcs.rs @@ -0,0 +1,24 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +// Test to ensure private traits are inaccessible with UFCS angle-bracket syntax. + +mod foo { + trait Bar { + fn baz() {} + } + + impl Bar for i32 {} +} + +fn main() { + ::baz(); //~ERROR method `baz` is inaccessible + //~^NOTE: trait `Bar` is private +} diff --git a/src/test/compile-fail/trait-not-accessible.rs b/src/test/compile-fail/trait-not-accessible.rs new file mode 100644 index 0000000000000..21668fcfeae71 --- /dev/null +++ b/src/test/compile-fail/trait-not-accessible.rs @@ -0,0 +1,28 @@ +// Copyright 2015 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +mod m { + trait Priv { + fn f(&self) {} + } + impl Priv for super::S {} + pub trait Pub: Priv {} +} + +struct S; +impl m::Pub for S {} + +fn g(arg: T) { + arg.f(); //~ ERROR: source trait is private +} + +fn main() { + g(S); +}