Auto merge of #83713 - spastorino:revert-pub-macro-rules, r=nikomatsakis
Revert "Rollup merge of #82296 - spastorino:pubrules, r=nikomatsakis" This reverts commite2561c58a4
, reversing changes made to2982ba50fc
. 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:
commit
855c2d130f
@ -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).
|
||||
|
@ -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),
|
||||
|
||||
|
@ -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
|
||||
|
@ -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(
|
||||
|
@ -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
|
||||
|
16
src/test/ui/did_you_mean/pub-macro-rules.rs
Normal file
16
src/test/ui/did_you_mean/pub-macro-rules.rs
Normal 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());
|
||||
}
|
8
src/test/ui/did_you_mean/pub-macro-rules.stderr
Normal file
8
src/test/ui/did_you_mean/pub-macro-rules.stderr
Normal 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
|
||||
|
@ -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() {}
|
@ -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`.
|
@ -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() {}
|
@ -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
|
||||
|
@ -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() {}
|
@ -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`.
|
@ -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() {}
|
Loading…
Reference in New Issue
Block a user