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 {
});
*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 {
// 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 {
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
}
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() {}
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
|
| ^^^^^^^^^^^^^^^^^^^^^^^
= 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`.