From 51ed1ecefd016bd90b09fea399b9a989d756609d Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Mon, 2 Feb 2015 19:33:50 -0800 Subject: [PATCH] lint: Deny #[no_mangle] const items This renames the PrivateNoMangleFns lint to allow both to happen in a single pass, since they do roughly the same work. --- src/librustc/lint/builtin.rs | 21 +++++++++++++++---- src/librustc/lint/context.rs | 2 +- .../compile-fail/lint-unexported-no-mangle.rs | 9 +++++++- 3 files changed, 26 insertions(+), 6 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 @@ fn get_lints(&self) -> LintArray { "functions marked #[no_mangle] should be exported" } -#[derive(Copy)] -pub struct PrivateNoMangleFns; +declare_lint! { + NO_MANGLE_CONST_ITEMS, + Deny, + "const items will not have their symbols exported" +} -impl LintPass for PrivateNoMangleFns { +#[derive(Copy)] +pub struct InvalidNoMangleItems; + +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 @@ fn check_item(&mut self, cx: &Context, it: &ast::Item) { 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 @@ macro_rules! add_lint_group { 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() { }