Revert "Rollup merge of #82296 - spastorino:pubrules, r=nikomatsakis"
This reverts commit e2561c58a41023a14e0e583113dcf55e1ecb236a, reversing changes made to 2982ba50fc4bb629b8fe4108a81cb2f9b053510b.
This commit is contained in:
parent
5f1aeb52c2
commit
0e4d2fd447
@ -691,7 +691,6 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) {
|
|||||||
// involved, so we only emit errors where there are no other parsing errors.
|
// involved, so we only emit errors where there are no other parsing errors.
|
||||||
gate_all!(destructuring_assignment, "destructuring assignments are unstable");
|
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,
|
// All uses of `gate_all!` below this point were added in #65742,
|
||||||
// and subsequently disabled (with the non-early gating readded).
|
// and subsequently disabled (with the non-early gating readded).
|
||||||
|
@ -624,9 +624,6 @@ declare_features! (
|
|||||||
/// Allows macro attributes to observe output of `#[derive]`.
|
/// Allows macro attributes to observe output of `#[derive]`.
|
||||||
(active, macro_attributes_in_derive_output, "1.51.0", Some(81119), None),
|
(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
|
/// Allows the use of type alias impl trait in function return positions
|
||||||
(active, min_type_alias_impl_trait, "1.52.0", Some(63063), None),
|
(active, min_type_alias_impl_trait, "1.52.0", Some(63063), None),
|
||||||
|
|
||||||
|
@ -1478,7 +1478,15 @@ impl<'a> Parser<'a> {
|
|||||||
let vstr = pprust::vis_to_string(vis);
|
let vstr = pprust::vis_to_string(vis);
|
||||||
let vstr = vstr.trim_end();
|
let vstr = vstr.trim_end();
|
||||||
if macro_rules {
|
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 {
|
} else {
|
||||||
self.struct_span_err(vis.span, "can't qualify macro invocation with `pub`")
|
self.struct_span_err(vis.span, "can't qualify macro invocation with `pub`")
|
||||||
.span_suggestion(
|
.span_suggestion(
|
||||||
|
@ -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 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.macro_map.insert(def_id.to_def_id(), ext);
|
||||||
self.r.local_macro_def_scopes.insert(def_id, parent_scope.module);
|
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();
|
let ident = ident.normalize_to_macros_2_0();
|
||||||
self.r.macro_names.insert(ident);
|
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 {
|
let vis = if is_macro_export {
|
||||||
ty::Visibility::Public
|
ty::Visibility::Public
|
||||||
} else {
|
} else {
|
||||||
@ -1261,11 +1261,6 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> {
|
|||||||
}),
|
}),
|
||||||
))
|
))
|
||||||
} else {
|
} 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 module = parent_scope.module;
|
||||||
let vis = match item.kind {
|
let vis = match item.kind {
|
||||||
// Visibilities must not be resolved non-speculatively twice
|
// Visibilities must not be resolved non-speculatively twice
|
||||||
|
@ -903,7 +903,6 @@ symbols! {
|
|||||||
ptr_null,
|
ptr_null,
|
||||||
ptr_null_mut,
|
ptr_null_mut,
|
||||||
ptr_offset_from,
|
ptr_offset_from,
|
||||||
pub_macro_rules,
|
|
||||||
pub_restricted,
|
pub_restricted,
|
||||||
pure,
|
pure,
|
||||||
pushpop_unsafe,
|
pushpop_unsafe,
|
||||||
|
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…
x
Reference in New Issue
Block a user