about summary refs log tree commit diff
path: root/src/librustc/hir
diff options
context:
space:
mode:
authorkennytm <kennytm@gmail.com>2018-05-01 01:18:41 +0800
committerGitHub <noreply@github.com>2018-05-01 01:18:41 +0800
commit909ba8aa78fb3ad4cf4dcee83bb3edc966dde90c (patch)
tree77b8616ec2890107e0c49a87e1f337cd71ca199b /src/librustc/hir
parentcbbdf998edc905bcf44ba212f068114b3a62f858 (diff)
parentbd4ebf28bdf6eb898971b194f5cf773c88281251 (diff)
downloadrust-909ba8aa78fb3ad4cf4dcee83bb3edc966dde90c.tar.gz
rust-909ba8aa78fb3ad4cf4dcee83bb3edc966dde90c.zip
Rollup merge of #50330 - japaric:used, r=nagisa
check that #[used] is used only on statics

this attribute has no effect on other items. This makes the implementation match what's described in the RFC.

cc #40289

r? @nagisa
Diffstat (limited to 'src/librustc/hir')
-rw-r--r--src/librustc/hir/check_attr.rs12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/librustc/hir/check_attr.rs b/src/librustc/hir/check_attr.rs
index 19f8d15662d..cad6ff8ae9f 100644
--- a/src/librustc/hir/check_attr.rs
+++ b/src/librustc/hir/check_attr.rs
@@ -31,6 +31,7 @@ enum Target {
     Expression,
     Statement,
     Closure,
+    Static,
     Other,
 }
 
@@ -43,6 +44,7 @@ impl Target {
             hir::ItemEnum(..) => Target::Enum,
             hir::ItemConst(..) => Target::Const,
             hir::ItemForeignMod(..) => Target::ForeignMod,
+            hir::ItemStatic(..) => Target::Static,
             _ => Target::Other,
         }
     }
@@ -102,6 +104,7 @@ impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
         }
 
         self.check_repr(item, target);
+        self.check_used(item, target);
     }
 
     /// Check if an `#[inline]` is applied to a function or a closure.
@@ -305,6 +308,15 @@ impl<'a, 'tcx> CheckAttrVisitor<'a, 'tcx> {
             }
         }
     }
+
+    fn check_used(&self, item: &hir::Item, target: Target) {
+        for attr in &item.attrs {
+            if attr.name().map(|name| name == "used").unwrap_or(false) && target != Target::Static {
+                self.tcx.sess
+                    .span_err(attr.span, "attribute must be applied to a `static` variable");
+            }
+        }
+    }
 }
 
 impl<'a, 'tcx> Visitor<'tcx> for CheckAttrVisitor<'a, 'tcx> {