diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-05-25 14:43:30 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-05-27 09:04:08 -0700 |
| commit | 49a65815f17d9d3ee1a8ea323aaaf96e1beb265a (patch) | |
| tree | 92ef76defab28fe3ec9c421da22f7306f21c70ba | |
| parent | 1cf1527b91db3c605e44fe9b90fc46ecf1d04c4f (diff) | |
| download | rust-49a65815f17d9d3ee1a8ea323aaaf96e1beb265a.tar.gz rust-49a65815f17d9d3ee1a8ea323aaaf96e1beb265a.zip | |
rustc: Account for typedefs in privacy
This ensures that a public typedef to a private item is ensured to be public in terms of linkage. This affects both the visibility of the library's symbols as well as other lints based on privacy (dead_code for example). Closes #14421 Closes #14422
| -rw-r--r-- | src/librustc/middle/privacy.rs | 17 | ||||
| -rw-r--r-- | src/test/auxiliary/issue-14421.rs | 34 | ||||
| -rw-r--r-- | src/test/auxiliary/issue-14422.rs | 34 | ||||
| -rw-r--r-- | src/test/run-pass/issue-14421.rs | 22 | ||||
| -rw-r--r-- | src/test/run-pass/issue-14422.rs | 21 |
5 files changed, 128 insertions, 0 deletions
diff --git a/src/librustc/middle/privacy.rs b/src/librustc/middle/privacy.rs index 2d13079ae7d..8f8c1c2cf11 100644 --- a/src/librustc/middle/privacy.rs +++ b/src/librustc/middle/privacy.rs @@ -297,6 +297,23 @@ impl<'a> Visitor<()> for EmbargoVisitor<'a> { } } + ast::ItemTy(ref ty, _) if public_first => { + match ty.node { + ast::TyPath(_, _, id) => { + match self.tcx.def_map.borrow().get_copy(&id) { + ast::DefPrimTy(..) => {}, + def => { + let did = def_id_of_def(def); + if is_local(did) { + self.exported_items.insert(did.node); + } + } + } + } + _ => {} + } + } + _ => {} } diff --git a/src/test/auxiliary/issue-14421.rs b/src/test/auxiliary/issue-14421.rs new file mode 100644 index 00000000000..7c69cba179c --- /dev/null +++ b/src/test/auxiliary/issue-14421.rs @@ -0,0 +1,34 @@ +// Copyright 2014 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. + +#![crate_type="lib"] +#![deny(warnings)] + +pub use src::aliases::B; +pub use src::hidden_core::make; + +mod src { + pub mod aliases { + use super::hidden_core::A; + pub type B = A<f32>; + } + + pub mod hidden_core { + use super::aliases::B; + + pub struct A<T>; + + pub fn make() -> B { A } + + impl<T> A<T> { + pub fn foo(&mut self) { println!("called foo"); } + } + } +} diff --git a/src/test/auxiliary/issue-14422.rs b/src/test/auxiliary/issue-14422.rs new file mode 100644 index 00000000000..04e1d993011 --- /dev/null +++ b/src/test/auxiliary/issue-14422.rs @@ -0,0 +1,34 @@ +// Copyright 2014 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. + +#![crate_type="lib"] +#![deny(warnings)] + +pub use src::aliases::B; +pub use src::hidden_core::make; + +mod src { + pub mod aliases { + use super::hidden_core::A; + pub type B = A; + } + + pub mod hidden_core { + use super::aliases::B; + + pub struct A; + + pub fn make() -> B { A } + + impl A { + pub fn foo(&mut self) { println!("called foo"); } + } + } +} diff --git a/src/test/run-pass/issue-14421.rs b/src/test/run-pass/issue-14421.rs new file mode 100644 index 00000000000..cf88131048e --- /dev/null +++ b/src/test/run-pass/issue-14421.rs @@ -0,0 +1,22 @@ +// Copyright 2014 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. + +// aux-build:issue-14421.rs + +extern crate bug_lib = "issue-14421"; + +use bug_lib::B; +use bug_lib::make; + +pub fn main() { + let mut an_A: B = make(); + an_A.foo(); +} + diff --git a/src/test/run-pass/issue-14422.rs b/src/test/run-pass/issue-14422.rs new file mode 100644 index 00000000000..b4d5a377b99 --- /dev/null +++ b/src/test/run-pass/issue-14422.rs @@ -0,0 +1,21 @@ +// Copyright 2014 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. + +// aux-build:issue-14422.rs + +extern crate bug_lib = "issue-14422"; + +use bug_lib::B; +use bug_lib::make; + +pub fn main() { + let mut an_A: B = make(); + an_A.foo(); +} |
