resolve: Assign pub
and pub(crate)
visibilities to macro_rules
items
This commit is contained in:
parent
1190f7cdf7
commit
099b3d86f9
@ -1073,7 +1073,12 @@ impl<'a> Resolver<'a> {
|
||||
let ident = ident.modern();
|
||||
self.macro_names.insert(ident);
|
||||
let def = Def::Macro(def_id, MacroKind::Bang);
|
||||
let vis = ty::Visibility::Invisible; // Doesn't matter for legacy bindings
|
||||
let is_macro_export = attr::contains_name(&item.attrs, "macro_export");
|
||||
let vis = if is_macro_export {
|
||||
ty::Visibility::Public
|
||||
} else {
|
||||
ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))
|
||||
};
|
||||
let binding = (def, vis, item.span, expansion).to_name_binding(self.arenas);
|
||||
self.set_binding_parent_module(binding, self.current_module);
|
||||
let legacy_binding = self.arenas.alloc_legacy_binding(LegacyBinding {
|
||||
@ -1081,9 +1086,8 @@ impl<'a> Resolver<'a> {
|
||||
});
|
||||
*current_legacy_scope = LegacyScope::Binding(legacy_binding);
|
||||
self.all_macros.insert(ident.name, def);
|
||||
if attr::contains_name(&item.attrs, "macro_export") {
|
||||
if is_macro_export {
|
||||
let module = self.graph_root;
|
||||
let vis = ty::Visibility::Public;
|
||||
self.define(module, ident, MacroNS,
|
||||
(def, vis, item.span, expansion, IsMacroExport));
|
||||
} else {
|
||||
|
@ -1,15 +1,14 @@
|
||||
// edition:2018
|
||||
|
||||
// For the time being `macro_rules` items are treated as *very* private...
|
||||
|
||||
#![feature(decl_macro, uniform_paths)]
|
||||
#![allow(non_camel_case_types)]
|
||||
|
||||
mod m1 {
|
||||
// Non-exported legacy macros are treated as `pub(crate)`.
|
||||
macro_rules! legacy_macro { () => () }
|
||||
|
||||
// ... so they can't be imported by themselves, ...
|
||||
use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
use legacy_macro as _; // OK
|
||||
pub(crate) use legacy_macro as _; // OK
|
||||
pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
}
|
||||
|
||||
mod m2 {
|
||||
@ -17,7 +16,7 @@ mod m2 {
|
||||
|
||||
type legacy_macro = u8;
|
||||
|
||||
// ... but don't prevent names from other namespaces from being imported, ...
|
||||
// Legacy macro imports don't prevent names from other namespaces from being imported.
|
||||
use legacy_macro as _; // OK
|
||||
}
|
||||
|
||||
@ -27,19 +26,17 @@ mod m3 {
|
||||
fn f() {
|
||||
macro_rules! legacy_macro { () => () }
|
||||
|
||||
// ... but still create ambiguities with other names in the same namespace.
|
||||
// Legacy macro imports create ambiguities with other names in the same namespace.
|
||||
use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous
|
||||
//~| ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
}
|
||||
}
|
||||
|
||||
mod exported {
|
||||
// Exported macros are treated as private as well,
|
||||
// some better rules need to be figured out later.
|
||||
// Exported legacy macros are treated as `pub`.
|
||||
#[macro_export]
|
||||
macro_rules! legacy_macro { () => () }
|
||||
|
||||
use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
pub use legacy_macro as _; // OK
|
||||
}
|
||||
|
||||
fn main() {}
|
||||
|
@ -1,39 +1,15 @@
|
||||
error[E0364]: `legacy_macro` is private, and cannot be re-exported
|
||||
--> $DIR/macro-rules.rs:12:9
|
||||
--> $DIR/macro-rules.rs:11:13
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: consider marking `legacy_macro` as `pub` in the imported module
|
||||
--> $DIR/macro-rules.rs:12:9
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0364]: `legacy_macro` is private, and cannot be re-exported
|
||||
--> $DIR/macro-rules.rs:31:13
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous
|
||||
LL | pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: consider marking `legacy_macro` as `pub` in the imported module
|
||||
--> $DIR/macro-rules.rs:31:13
|
||||
--> $DIR/macro-rules.rs:11:13
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is ambiguous
|
||||
LL | pub use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0364]: `legacy_macro` is private, and cannot be re-exported
|
||||
--> $DIR/macro-rules.rs:42:9
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: consider marking `legacy_macro` as `pub` in the imported module
|
||||
--> $DIR/macro-rules.rs:42:9
|
||||
|
|
||||
LL | use legacy_macro as _; //~ ERROR `legacy_macro` is private, and cannot be re-exported
|
||||
| ^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0659]: `legacy_macro` is ambiguous (name vs any other name during import resolution)
|
||||
--> $DIR/macro-rules.rs:31:13
|
||||
|
|
||||
@ -52,7 +28,7 @@ LL | macro legacy_macro() {}
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^
|
||||
= help: use `self::legacy_macro` to refer to this macro unambiguously
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
Some errors occurred: E0364, E0659.
|
||||
For more information about an error, try `rustc --explain E0364`.
|
||||
|
Loading…
Reference in New Issue
Block a user