Auto merge of #83713 - spastorino:revert-pub-macro-rules, r=nikomatsakis

Revert "Rollup merge of #82296 - spastorino:pubrules, r=nikomatsakis"

This reverts commit e2561c58a4, reversing
changes made to 2982ba50fc.

As discussed in #83641 this feature is not complete and in particular doesn't work cross macros and given that this is not going to be included in edition 2021 nobody seems to be trying to fix the underlying problem. When can add this again I guess, whenever somebody has the time to make it work cross crates.

r? `@nikomatsakis`
This commit is contained in:
bors 2021-04-28 05:52:47 +00:00
commit 855c2d130f
14 changed files with 37 additions and 182 deletions

View File

@ -686,7 +686,6 @@ macro_rules! gate_all {
// 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).

View File

@ -628,9 +628,6 @@ pub fn set(&self, features: &mut Features, span: Span) {
/// 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),

View File

@ -134,6 +134,8 @@ macro_rules! 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

View File

@ -1478,7 +1478,15 @@ fn complain_if_pub_macro(&self, vis: &Visibility, macro_rules: bool) {
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(

View File

@ -1230,13 +1230,13 @@ fn define_macro(&mut self, item: &ast::Item) -> MacroRulesScopeRef<'a> {
};
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 @@ fn define_macro(&mut self, item: &ast::Item) -> MacroRulesScopeRef<'a> {
}),
))
} 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

View File

@ -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());
}

View File

@ -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

View File

@ -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() {}

View File

@ -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 <https://github.com/rust-lang/rust/issues/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 <https://github.com/rust-lang/rust/issues/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 <https://github.com/rust-lang/rust/issues/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 <https://github.com/rust-lang/rust/issues/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`.

View File

@ -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() {}

View File

@ -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

View File

@ -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() {}

View File

@ -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`.

View File

@ -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() {}