about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/lint/builtin.rs19
-rw-r--r--src/librustc/lint/context.rs2
-rw-r--r--src/test/compile-fail/lint-unexported-no-mangle.rs9
3 files changed, 25 insertions, 5 deletions
diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs
index 904c9c3adb5..fdc2bed781a 100644
--- a/src/librustc/lint/builtin.rs
+++ b/src/librustc/lint/builtin.rs
@@ -2065,12 +2065,19 @@ declare_lint! {
     "functions marked #[no_mangle] should be exported"
 }
 
+declare_lint! {
+    NO_MANGLE_CONST_ITEMS,
+    Deny,
+    "const items will not have their symbols exported"
+}
+
 #[derive(Copy)]
-pub struct PrivateNoMangleFns;
+pub struct InvalidNoMangleItems;
 
-impl LintPass for PrivateNoMangleFns {
+impl LintPass for InvalidNoMangleItems {
     fn get_lints(&self) -> LintArray {
-        lint_array!(PRIVATE_NO_MANGLE_FNS)
+        lint_array!(PRIVATE_NO_MANGLE_FNS,
+                    NO_MANGLE_CONST_ITEMS)
     }
 
     fn check_item(&mut self, cx: &Context, it: &ast::Item) {
@@ -2083,6 +2090,12 @@ impl LintPass for PrivateNoMangleFns {
                     cx.span_lint(PRIVATE_NO_MANGLE_FNS, it.span, msg.as_slice());
                 }
             },
+            ast::ItemConst(..) => {
+                if attr::contains_name(it.attrs.as_slice(), "no_mangle") {
+                    let msg = "const items should never be #[no_mangle]";
+                    cx.span_lint(NO_MANGLE_CONST_ITEMS, it.span, msg);
+                }
+            }
             _ => {},
         }
     }
diff --git a/src/librustc/lint/context.rs b/src/librustc/lint/context.rs
index c649ff2635b..730a125fe97 100644
--- a/src/librustc/lint/context.rs
+++ b/src/librustc/lint/context.rs
@@ -213,7 +213,7 @@ impl LintStore {
                      UnstableFeatures,
                      Stability,
                      UnconditionalRecursion,
-                     PrivateNoMangleFns,
+                     InvalidNoMangleItems,
         );
 
         add_builtin_with_new!(sess,
diff --git a/src/test/compile-fail/lint-unexported-no-mangle.rs b/src/test/compile-fail/lint-unexported-no-mangle.rs
index 3227a78c2ef..fed1157b1cf 100644
--- a/src/test/compile-fail/lint-unexported-no-mangle.rs
+++ b/src/test/compile-fail/lint-unexported-no-mangle.rs
@@ -8,13 +8,20 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// compile-flags:-F private_no_mangle_fns
+// compile-flags:-F private_no_mangle_fns -F no_mangle_const_items
 
 // FIXME(#19495) no_mangle'ing main ICE's.
 #[no_mangle]
 fn foo() { //~ ERROR function foo is marked #[no_mangle], but not exported
 }
 
+#[allow(dead_code)]
+#[no_mangle]
+const FOO: u64 = 1; //~ ERROR const items should never be #[no_mangle]
+
+#[no_mangle]
+pub const PUB_FOO: u64 = 1; //~ ERROR const items should never be #[no_mangle]
+
 #[no_mangle]
 pub fn bar()  {
 }