diff options
| author | bors <bors@rust-lang.org> | 2018-09-10 17:18:27 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-09-10 17:18:27 +0000 |
| commit | 551244f05b92f90fe327f8f0a6d9a6e674eaab1b (patch) | |
| tree | 543082618303a887b253f103c1c7183d73bbe34d /src/libsyntax | |
| parent | 3c3e372e1827d29d6e364e9710366ca5631c4fca (diff) | |
| parent | 615eaba14b51adb177a2e249354ae7c35d51e403 (diff) | |
| download | rust-551244f05b92f90fe327f8f0a6d9a6e674eaab1b.tar.gz rust-551244f05b92f90fe327f8f0a6d9a6e674eaab1b.zip | |
Auto merge of #54093 - petrochenkov:noinner, r=alexcrichton
Feature gate non-builtin attributes in inner attribute position Closes item 3 from https://github.com/rust-lang/rust/pull/50911#issuecomment-411605393
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 31 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 3 |
2 files changed, 26 insertions, 8 deletions
diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 3bb19121ee3..7b4e1814a33 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -1074,6 +1074,21 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { self.collect(kind, InvocationKind::Attr { attr, traits, item }) } + fn find_attr_invoc(&self, attrs: &mut Vec<ast::Attribute>) -> Option<ast::Attribute> { + let attr = attrs.iter() + .position(|a| !attr::is_known(a) && !is_builtin_attr(a)) + .map(|i| attrs.remove(i)); + if let Some(attr) = &attr { + if !self.cx.ecfg.enable_custom_inner_attributes() && + attr.style == ast::AttrStyle::Inner && attr.path != "test" { + emit_feature_err(&self.cx.parse_sess, "custom_inner_attributes", + attr.span, GateIssue::Language, + "non-builtin inner attributes are unstable"); + } + } + attr + } + /// If `item` is an attr invocation, remove and return the macro attribute and derive traits. fn classify_item<T>(&mut self, mut item: T) -> (Option<ast::Attribute>, Vec<Path>, T) where T: HasAttrs, @@ -1087,7 +1102,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { return attrs; } - attr = find_attr_invoc(&mut attrs); + attr = self.find_attr_invoc(&mut attrs); traits = collect_derives(&mut self.cx, &mut attrs); attrs }); @@ -1108,7 +1123,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { return attrs; } - attr = find_attr_invoc(&mut attrs); + attr = self.find_attr_invoc(&mut attrs); attrs }); @@ -1145,12 +1160,6 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { } } -pub fn find_attr_invoc(attrs: &mut Vec<ast::Attribute>) -> Option<ast::Attribute> { - attrs.iter() - .position(|a| !attr::is_known(a) && !is_builtin_attr(a)) - .map(|i| attrs.remove(i)) -} - impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { fn fold_expr(&mut self, expr: P<ast::Expr>) -> P<ast::Expr> { let mut expr = self.cfg.configure_expr(expr).into_inner(); @@ -1582,6 +1591,12 @@ impl<'feat> ExpansionConfig<'feat> { fn proc_macro_expr = proc_macro_expr, fn proc_macro_non_items = proc_macro_non_items, } + + fn enable_custom_inner_attributes(&self) -> bool { + self.features.map_or(false, |features| { + features.custom_inner_attributes || features.custom_attribute || features.rustc_attrs + }) + } } // A Marker adds the given mark to the syntax context. diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index e912482cf58..3e880bb6cf6 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -518,6 +518,9 @@ declare_features! ( // #![test_runner] // #[test_case] (active, custom_test_frameworks, "1.30.0", Some(50297), None), + + // Non-builtin attributes in inner attribute position + (active, custom_inner_attributes, "1.30.0", Some(38356), None), ); declare_features! ( |
