From 73dec4a804c0dd63405f01f38664e6026a56df31 Mon Sep 17 00:00:00 2001 From: Vadim Petrochenkov Date: Fri, 21 Jun 2019 01:59:30 +0300 Subject: [PATCH] resolve: Check stability for local macros as well --- src/librustc_resolve/macros.rs | 21 ++++++++++----------- src/test/ui/macros/macro-stability.rs | 2 +- src/test/ui/macros/macro-stability.stderr | 10 +++++++++- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/librustc_resolve/macros.rs b/src/librustc_resolve/macros.rs index dcdf0be41c2..724b30800fa 100644 --- a/src/librustc_resolve/macros.rs +++ b/src/librustc_resolve/macros.rs @@ -236,21 +236,20 @@ impl<'a> base::Resolver for Resolver<'a> { }; invoc.expansion_data.mark.set_expn_info(ext.expn_info(span, &format)); + if let Some((feature, issue)) = ext.unstable_feature { + let features = self.session.features_untracked(); + if !span.allows_unstable(feature) && + features.declared_lib_features.iter().all(|(feat, _)| *feat != feature) { + let msg = format!("macro {}! is unstable", path); + emit_feature_err(&self.session.parse_sess, feature, span, + GateIssue::Library(Some(issue)), &msg); + } + } + if let Res::Def(_, def_id) = res { if after_derive { self.session.span_err(span, "macro attributes must be placed before `#[derive]`"); } - if let Some((feature, issue)) = ext.unstable_feature { - // Do not stability-check macros in the same crate. - let features = self.session.features_untracked(); - if !def_id.is_local() && - !span.allows_unstable(feature) && - features.declared_lib_features.iter().all(|(feat, _)| *feat != feature) { - let msg = format!("macro {}! is unstable", path); - emit_feature_err(&self.session.parse_sess, feature, span, - GateIssue::Library(Some(issue)), &msg); - } - } self.macro_defs.insert(invoc.expansion_data.mark, def_id); let normal_module_def_id = self.macro_def_scope(invoc.expansion_data.mark).normal_ancestor_id; diff --git a/src/test/ui/macros/macro-stability.rs b/src/test/ui/macros/macro-stability.rs index 7d1ee6a43b6..e6a81c96696 100644 --- a/src/test/ui/macros/macro-stability.rs +++ b/src/test/ui/macros/macro-stability.rs @@ -7,6 +7,6 @@ macro_rules! local_unstable { () => () } fn main() { - local_unstable!(); + local_unstable!(); //~ ERROR: macro local_unstable! is unstable unstable_macro!(); //~ ERROR: macro unstable_macro! is unstable } diff --git a/src/test/ui/macros/macro-stability.stderr b/src/test/ui/macros/macro-stability.stderr index a0e0c351a48..d609c3bc765 100644 --- a/src/test/ui/macros/macro-stability.stderr +++ b/src/test/ui/macros/macro-stability.stderr @@ -1,3 +1,11 @@ +error[E0658]: macro local_unstable! is unstable + --> $DIR/macro-stability.rs:10:5 + | +LL | local_unstable!(); + | ^^^^^^^^^^^^^^^^^^ + | + = help: add #![feature(local_unstable)] to the crate attributes to enable + error[E0658]: macro unstable_macro! is unstable --> $DIR/macro-stability.rs:11:5 | @@ -6,6 +14,6 @@ LL | unstable_macro!(); | = help: add #![feature(unstable_macros)] to the crate attributes to enable -error: aborting due to previous error +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`.