diff options
| author | bors <bors@rust-lang.org> | 2016-03-06 02:29:34 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2016-03-06 02:29:34 +0000 |
| commit | 45f0ce71c19d8da081714dc917f11a8cc02d15be (patch) | |
| tree | 80b760addf4deae8de33b8c783ea53e374fb36f5 /src/test | |
| parent | 52e0bda644823089f16795cc9e071cf827b4810b (diff) | |
| parent | d908ff1759bf27a8a8a99f113a246b8abc61f425 (diff) | |
| download | rust-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.rs | 2 | ||||
| -rw-r--r-- | src/test/compile-fail/trait-privacy.rs | 30 |
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 |
