mirror of
https://github.com/rust-lang/rust.git
synced 2025-06-05 11:48:30 +00:00
Error if pub use
references a private item.
[breaking-change] Closes #23266
This commit is contained in:
parent
73afbef3aa
commit
170ccd615f
@ -24,7 +24,9 @@ register_diagnostics! {
|
|||||||
E0258, // import conflicts with existing submodule
|
E0258, // import conflicts with existing submodule
|
||||||
E0259, // an extern crate has already been imported into this module
|
E0259, // an extern crate has already been imported into this module
|
||||||
E0260, // name conflicts with an external crate that has been imported into this module
|
E0260, // name conflicts with an external crate that has been imported into this module
|
||||||
E0317 // user-defined types or type parameters cannot shadow the primitive types
|
E0317, // user-defined types or type parameters cannot shadow the primitive types
|
||||||
|
E0364, // item is private
|
||||||
|
E0365 // item is private
|
||||||
}
|
}
|
||||||
|
|
||||||
__build_diagnostic_array! { DIAGNOSTICS }
|
__build_diagnostic_array! { DIAGNOSTICS }
|
||||||
|
@ -857,6 +857,19 @@ impl NameBindings {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_public(&self, namespace: Namespace) -> bool {
|
||||||
|
match namespace {
|
||||||
|
TypeNS => {
|
||||||
|
let type_def = self.type_def.borrow();
|
||||||
|
type_def.as_ref().unwrap().modifiers.contains(PUBLIC)
|
||||||
|
}
|
||||||
|
ValueNS => {
|
||||||
|
let value_def = self.value_def.borrow();
|
||||||
|
value_def.as_ref().unwrap().modifiers.contains(PUBLIC)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Interns the names of the primitive types.
|
/// Interns the names of the primitive types.
|
||||||
@ -1334,22 +1347,33 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
|||||||
let mut type_result = UnknownResult;
|
let mut type_result = UnknownResult;
|
||||||
|
|
||||||
// Search for direct children of the containing module.
|
// Search for direct children of the containing module.
|
||||||
build_reduced_graph::populate_module_if_necessary(self, &containing_module);
|
build_reduced_graph::populate_module_if_necessary(self, &target_module);
|
||||||
|
|
||||||
match containing_module.children.borrow().get(&source) {
|
match target_module.children.borrow().get(&source) {
|
||||||
None => {
|
None => {
|
||||||
// Continue.
|
// Continue.
|
||||||
}
|
}
|
||||||
Some(ref child_name_bindings) => {
|
Some(ref child_name_bindings) => {
|
||||||
|
// pub_err makes sure we don't give the same error twice.
|
||||||
|
let mut pub_err = false;
|
||||||
if child_name_bindings.defined_in_namespace(ValueNS) {
|
if child_name_bindings.defined_in_namespace(ValueNS) {
|
||||||
debug!("(resolving single import) found value binding");
|
debug!("(resolving single import) found value binding");
|
||||||
value_result = BoundResult(containing_module.clone(),
|
value_result = BoundResult(target_module.clone(),
|
||||||
(*child_name_bindings).clone());
|
(*child_name_bindings).clone());
|
||||||
|
if directive.is_public && !child_name_bindings.is_public(ValueNS) {
|
||||||
|
let msg = format!("`{}` is private", token::get_name(source));
|
||||||
|
span_err!(self.session, directive.span, E0364, "{}", &msg);
|
||||||
|
pub_err = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if child_name_bindings.defined_in_namespace(TypeNS) {
|
if child_name_bindings.defined_in_namespace(TypeNS) {
|
||||||
debug!("(resolving single import) found type binding");
|
debug!("(resolving single import) found type binding");
|
||||||
type_result = BoundResult(containing_module.clone(),
|
type_result = BoundResult(target_module.clone(),
|
||||||
(*child_name_bindings).clone());
|
(*child_name_bindings).clone());
|
||||||
|
if !pub_err && directive.is_public && !child_name_bindings.is_public(TypeNS) {
|
||||||
|
let msg = format!("`{}` is private", token::get_name(source));
|
||||||
|
span_err!(self.session, directive.span, E0365, "{}", &msg);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user