diff options
| author | kennytm <kennytm@gmail.com> | 2018-06-02 05:10:29 +0800 |
|---|---|---|
| committer | kennytm <kennytm@gmail.com> | 2018-06-02 05:11:33 +0800 |
| commit | c9cb806689a9691e2a29836e2c597751cdbcfdc8 (patch) | |
| tree | 38c136f550f405fcbb0d6db0ef04101d561311ef /src/libsyntax | |
| parent | aa094a43cc041c8483b7c80fb0ec4be233dd01b7 (diff) | |
| download | rust-c9cb806689a9691e2a29836e2c597751cdbcfdc8.tar.gz rust-c9cb806689a9691e2a29836e2c597751cdbcfdc8.zip | |
Deny #[cfg] and #[cfg_attr] on generic parameters.
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/attr.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax/config.rs | 16 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 2 |
4 files changed, 40 insertions, 3 deletions
diff --git a/src/libsyntax/attr.rs b/src/libsyntax/attr.rs index 076b6d17658..2389ed799cf 100644 --- a/src/libsyntax/attr.rs +++ b/src/libsyntax/attr.rs @@ -17,7 +17,7 @@ pub use self::IntType::*; use ast; use ast::{AttrId, Attribute, Name, Ident, Path, PathSegment}; use ast::{MetaItem, MetaItemKind, NestedMetaItem, NestedMetaItemKind}; -use ast::{Lit, LitKind, Expr, ExprKind, Item, Local, Stmt, StmtKind}; +use ast::{Lit, LitKind, Expr, ExprKind, Item, Local, Stmt, StmtKind, GenericParam}; use codemap::{BytePos, Spanned, respan, dummy_spanned}; use syntax_pos::Span; use errors::{Applicability, Handler}; @@ -1444,6 +1444,22 @@ impl HasAttrs for Stmt { } } +impl HasAttrs for GenericParam { + fn attrs(&self) -> &[ast::Attribute] { + match self { + GenericParam::Lifetime(lifetime) => lifetime.attrs(), + GenericParam::Type(ty) => ty.attrs(), + } + } + + fn map_attrs<F: FnOnce(Vec<Attribute>) -> Vec<Attribute>>(self, f: F) -> Self { + match self { + GenericParam::Lifetime(lifetime) => GenericParam::Lifetime(lifetime.map_attrs(f)), + GenericParam::Type(ty) => GenericParam::Type(ty.map_attrs(f)), + } + } +} + macro_rules! derive_has_attrs { ($($ty:path),*) => { $( impl HasAttrs for $ty { @@ -1463,5 +1479,5 @@ macro_rules! derive_has_attrs { derive_has_attrs! { Item, Expr, Local, ast::ForeignItem, ast::StructField, ast::ImplItem, ast::TraitItem, ast::Arm, - ast::Field, ast::FieldPat, ast::Variant_ + ast::Field, ast::FieldPat, ast::Variant_, ast::LifetimeDef, ast::TyParam } diff --git a/src/libsyntax/config.rs b/src/libsyntax/config.rs index 36911683a0e..33643789139 100644 --- a/src/libsyntax/config.rs +++ b/src/libsyntax/config.rs @@ -278,6 +278,22 @@ impl<'a> StripUnconfigured<'a> { pattern }) } + + // deny #[cfg] on generic parameters until we decide what to do with it. + // see issue #51279. + pub fn disallow_cfg_on_generic_param(&mut self, param: &ast::GenericParam) { + for attr in param.attrs() { + let offending_attr = if attr.check_name("cfg") { + "cfg" + } else if attr.check_name("cfg_attr") { + "cfg_attr" + } else { + continue; + }; + let msg = format!("#[{}] cannot be applied on a generic parameter", offending_attr); + self.sess.span_diagnostic.span_err(attr.span, &msg); + } + } } impl<'a> fold::Folder for StripUnconfigured<'a> { diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 83e7dd84cbf..29030783ca6 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -1412,6 +1412,11 @@ impl<'a, 'b> Folder for InvocationCollector<'a, 'b> { } } + fn fold_generic_param(&mut self, param: ast::GenericParam) -> ast::GenericParam { + self.cfg.disallow_cfg_on_generic_param(¶m); + noop_fold_generic_param(param, self) + } + fn fold_attribute(&mut self, at: ast::Attribute) -> Option<ast::Attribute> { // turn `#[doc(include="filename")]` attributes into `#[doc(include(file="filename", // contents="file contents")]` attributes diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 9b84713b0f9..785aedd3f33 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -598,7 +598,7 @@ declare_features! ( // allow `'_` placeholder lifetimes (accepted, underscore_lifetimes, "1.26.0", Some(44524), None), // Allows attributes on lifetime/type formal parameters in generics (RFC 1327) - (accepted, generic_param_attrs, "1.26.0", Some(48848), None), + (accepted, generic_param_attrs, "1.27.0", Some(48848), None), // Allows cfg(target_feature = "..."). (accepted, cfg_target_feature, "1.27.0", Some(29717), None), // Allows #[target_feature(...)] |
