diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs index 077ab06d82dde..da516f5cb4129 100644 --- a/compiler/rustc_ast_passes/src/feature_gate.rs +++ b/compiler/rustc_ast_passes/src/feature_gate.rs @@ -686,7 +686,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) { // involved, so we only emit errors where there are no other parsing errors. gate_all!(destructuring_assignment, "destructuring assignments are unstable"); } - gate_all!(pub_macro_rules, "`pub` on `macro_rules` items is unstable"); // All uses of `gate_all!` below this point were added in #65742, // and subsequently disabled (with the non-early gating readded). diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 7ae7e0094c6d1..304d7ede625a7 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -628,9 +628,6 @@ declare_features! ( /// Allows macro attributes to observe output of `#[derive]`. (active, macro_attributes_in_derive_output, "1.51.0", Some(81119), None), - /// Allows `pub` on `macro_rules` items. - (active, pub_macro_rules, "1.52.0", Some(78855), None), - /// Allows the use of type alias impl trait in function return positions (active, min_type_alias_impl_trait, "1.52.0", Some(63063), None), diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index c2ad339ed4126..fa8ef182aeddf 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -134,6 +134,8 @@ declare_features! ( which is available from cargo build scripts with `cargo:rustc-link-arg` now")), /// Allows using `#[main]` to replace the entrypoint `#[lang = "start"]` calls. (removed, main, "1.53.0", Some(29634), None, None), + (removed, pub_macro_rules, "1.53.0", Some(78855), None, + Some("removed due to being incomplete, in particular it does not work across crates")), // ------------------------------------------------------------------------- // feature-group-end: removed features diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs index 299b9a959c56f..acf3867cf8920 100644 --- a/compiler/rustc_parse/src/parser/item.rs +++ b/compiler/rustc_parse/src/parser/item.rs @@ -1478,7 +1478,15 @@ impl<'a> Parser<'a> { let vstr = pprust::vis_to_string(vis); let vstr = vstr.trim_end(); if macro_rules { - self.sess.gated_spans.gate(sym::pub_macro_rules, vis.span); + let msg = format!("can't qualify macro_rules invocation with `{}`", vstr); + self.struct_span_err(vis.span, &msg) + .span_suggestion( + vis.span, + "try exporting the macro", + "#[macro_export]".to_owned(), + Applicability::MaybeIncorrect, // speculative + ) + .emit(); } else { self.struct_span_err(vis.span, "can't qualify macro invocation with `pub`") .span_suggestion( diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index d77022a65e439..b5c95cfcb29cb 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -1230,13 +1230,13 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { }; let res = Res::Def(DefKind::Macro(ext.macro_kind()), def_id.to_def_id()); - let is_macro_export = self.r.session.contains_name(&item.attrs, sym::macro_export); self.r.macro_map.insert(def_id.to_def_id(), ext); self.r.local_macro_def_scopes.insert(def_id, parent_scope.module); - if macro_rules && matches!(item.vis.kind, ast::VisibilityKind::Inherited) { + if macro_rules { let ident = ident.normalize_to_macros_2_0(); self.r.macro_names.insert(ident); + let is_macro_export = self.r.session.contains_name(&item.attrs, sym::macro_export); let vis = if is_macro_export { ty::Visibility::Public } else { @@ -1261,11 +1261,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { }), )) } else { - if is_macro_export { - let what = if macro_rules { "`macro_rules` with `pub`" } else { "`macro` items" }; - let msg = format!("`#[macro_export]` cannot be used on {what}"); - self.r.session.span_err(item.span, &msg); - } let module = parent_scope.module; let vis = match item.kind { // Visibilities must not be resolved non-speculatively twice diff --git a/src/test/ui/did_you_mean/pub-macro-rules.rs b/src/test/ui/did_you_mean/pub-macro-rules.rs new file mode 100644 index 0000000000000..c5393703f7091 --- /dev/null +++ b/src/test/ui/did_you_mean/pub-macro-rules.rs @@ -0,0 +1,16 @@ +#[macro_use] mod bleh { + pub macro_rules! foo { //~ ERROR can't qualify macro_rules invocation + ($n:ident) => ( + fn $n () -> i32 { + 1 + } + ) + } + +} + +foo!(meh); + +fn main() { + println!("{}", meh()); +} diff --git a/src/test/ui/did_you_mean/pub-macro-rules.stderr b/src/test/ui/did_you_mean/pub-macro-rules.stderr new file mode 100644 index 0000000000000..0bde5783b8cc6 --- /dev/null +++ b/src/test/ui/did_you_mean/pub-macro-rules.stderr @@ -0,0 +1,8 @@ +error: can't qualify macro_rules invocation with `pub` + --> $DIR/pub-macro-rules.rs:2:5 + | +LL | pub macro_rules! foo { + | ^^^ help: try exporting the macro: `#[macro_export]` + +error: aborting due to previous error + diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs deleted file mode 100644 index 5504ec317ae59..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs +++ /dev/null @@ -1,10 +0,0 @@ -pub macro_rules! m1 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable - -#[cfg(FALSE)] -pub macro_rules! m2 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable - -pub(crate) macro_rules! m3 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable - -pub(in self) macro_rules! m4 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr deleted file mode 100644 index bfaec398d9a97..0000000000000 --- a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr +++ /dev/null @@ -1,39 +0,0 @@ -error[E0658]: `pub` on `macro_rules` items is unstable - --> $DIR/feature-gate-pub_macro_rules.rs:1:1 - | -LL | pub macro_rules! m1 { () => {} } - | ^^^ - | - = note: see issue #78855 for more information - = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable - -error[E0658]: `pub` on `macro_rules` items is unstable - --> $DIR/feature-gate-pub_macro_rules.rs:4:1 - | -LL | pub macro_rules! m2 { () => {} } - | ^^^ - | - = note: see issue #78855 for more information - = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable - -error[E0658]: `pub` on `macro_rules` items is unstable - --> $DIR/feature-gate-pub_macro_rules.rs:6:1 - | -LL | pub(crate) macro_rules! m3 { () => {} } - | ^^^^^^^^^^ - | - = note: see issue #78855 for more information - = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable - -error[E0658]: `pub` on `macro_rules` items is unstable - --> $DIR/feature-gate-pub_macro_rules.rs:8:1 - | -LL | pub(in self) macro_rules! m4 { () => {} } - | ^^^^^^^^^^^^ - | - = note: see issue #78855 for more information - = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable - -error: aborting due to 4 previous errors - -For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.rs b/src/test/ui/macros/macro-export-on-modularized-macros.rs deleted file mode 100644 index 467c6ba7b78e4..0000000000000 --- a/src/test/ui/macros/macro-export-on-modularized-macros.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![feature(decl_macro)] -#![feature(pub_macro_rules)] - -#[macro_export] -macro m1() {} //~ ERROR `#[macro_export]` cannot be used on `macro` items - -#[macro_export] -pub macro_rules! m2 { () => {} } -//~^ ERROR `#[macro_export]` cannot be used on `macro_rules` with `pub` - -fn main() {} diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.stderr b/src/test/ui/macros/macro-export-on-modularized-macros.stderr deleted file mode 100644 index 8bb031e12cba2..0000000000000 --- a/src/test/ui/macros/macro-export-on-modularized-macros.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: `#[macro_export]` cannot be used on `macro` items - --> $DIR/macro-export-on-modularized-macros.rs:5:1 - | -LL | macro m1() {} - | ^^^^^^^^^^^^^ - -error: `#[macro_export]` cannot be used on `macro_rules` with `pub` - --> $DIR/macro-export-on-modularized-macros.rs:8:1 - | -LL | pub macro_rules! m2 { () => {} } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to 2 previous errors - diff --git a/src/test/ui/macros/pub-macro-rules-fail.rs b/src/test/ui/macros/pub-macro-rules-fail.rs deleted file mode 100644 index bdb4c73f18b18..0000000000000 --- a/src/test/ui/macros/pub-macro-rules-fail.rs +++ /dev/null @@ -1,28 +0,0 @@ -#![feature(pub_macro_rules)] - -#[macro_use] -mod m { - pub macro_rules! mac { () => {} } - - // `pub` `macro_rules` cannot be redefined in the same module. - pub macro_rules! mac { () => {} } //~ ERROR the name `mac` is defined multiple times - - pub(self) macro_rules! private_mac { () => {} } -} - -const _: () = { - pub macro_rules! block_mac { () => {} } -}; - -mod n { - // Scope of `pub` `macro_rules` is not extended by `#[macro_use]`. - mac!(); //~ ERROR cannot find macro `mac` in this scope - - // `pub` `macro_rules` doesn't put the macro into the root module, unlike `#[macro_export]`. - crate::mac!(); //~ ERROR failed to resolve: maybe a missing crate `mac` - crate::block_mac!(); //~ ERROR failed to resolve: maybe a missing crate `block_mac` - - crate::m::private_mac!(); //~ ERROR macro `private_mac` is private -} - -fn main() {} diff --git a/src/test/ui/macros/pub-macro-rules-fail.stderr b/src/test/ui/macros/pub-macro-rules-fail.stderr deleted file mode 100644 index 588d79dd76a4b..0000000000000 --- a/src/test/ui/macros/pub-macro-rules-fail.stderr +++ /dev/null @@ -1,48 +0,0 @@ -error[E0428]: the name `mac` is defined multiple times - --> $DIR/pub-macro-rules-fail.rs:8:5 - | -LL | pub macro_rules! mac { () => {} } - | -------------------- previous definition of the macro `mac` here -... -LL | pub macro_rules! mac { () => {} } - | ^^^^^^^^^^^^^^^^^^^^ `mac` redefined here - | - = note: `mac` must be defined only once in the macro namespace of this module - -error[E0433]: failed to resolve: maybe a missing crate `mac`? - --> $DIR/pub-macro-rules-fail.rs:22:12 - | -LL | crate::mac!(); - | ^^^ maybe a missing crate `mac`? - -error[E0433]: failed to resolve: maybe a missing crate `block_mac`? - --> $DIR/pub-macro-rules-fail.rs:23:12 - | -LL | crate::block_mac!(); - | ^^^^^^^^^ maybe a missing crate `block_mac`? - -error: cannot find macro `mac` in this scope - --> $DIR/pub-macro-rules-fail.rs:19:5 - | -LL | mac!(); - | ^^^ - | - = note: consider importing this macro: - m::mac - -error[E0603]: macro `private_mac` is private - --> $DIR/pub-macro-rules-fail.rs:25:15 - | -LL | crate::m::private_mac!(); - | ^^^^^^^^^^^ private macro - | -note: the macro `private_mac` is defined here - --> $DIR/pub-macro-rules-fail.rs:10:5 - | -LL | pub(self) macro_rules! private_mac { () => {} } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to 5 previous errors - -Some errors have detailed explanations: E0428, E0433, E0603. -For more information about an error, try `rustc --explain E0428`. diff --git a/src/test/ui/macros/pub-macro-rules.rs b/src/test/ui/macros/pub-macro-rules.rs deleted file mode 100644 index cd4a845f7c07d..0000000000000 --- a/src/test/ui/macros/pub-macro-rules.rs +++ /dev/null @@ -1,20 +0,0 @@ -// check-pass - -#![feature(pub_macro_rules)] - -mod m { - // `pub` `macro_rules` can be used earlier in item order than they are defined. - foo!(); - - pub macro_rules! foo { () => {} } - - // `pub(...)` works too. - pub(super) macro_rules! bar { () => {} } -} - -// `pub` `macro_rules` are available by module path. -m::foo!(); - -m::bar!(); - -fn main() {}