From 73d5d89567ef155dc12ee7d7ed61e206e43bf74e Mon Sep 17 00:00:00 2001 From: Richo Healey Date: Mon, 2 Feb 2015 22:03:39 -0800 Subject: [PATCH] lint: Warn about no-mangled statics that are not exported --- src/librustc/lint/builtin.rs | 15 +++++++++++++++ .../compile-fail/lint-unexported-no-mangle.rs | 10 +++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/librustc/lint/builtin.rs b/src/librustc/lint/builtin.rs index fdc2bed781a..697810fa0e9 100644 --- a/src/librustc/lint/builtin.rs +++ b/src/librustc/lint/builtin.rs @@ -2065,6 +2065,12 @@ fn get_lints(&self) -> LintArray { "functions marked #[no_mangle] should be exported" } +declare_lint! { + PRIVATE_NO_MANGLE_STATICS, + Warn, + "statics marked #[no_mangle] should be exported" +} + declare_lint! { NO_MANGLE_CONST_ITEMS, Deny, @@ -2077,6 +2083,7 @@ fn get_lints(&self) -> LintArray { impl LintPass for InvalidNoMangleItems { fn get_lints(&self) -> LintArray { lint_array!(PRIVATE_NO_MANGLE_FNS, + PRIVATE_NO_MANGLE_STATICS, NO_MANGLE_CONST_ITEMS) } @@ -2090,6 +2097,14 @@ fn check_item(&mut self, cx: &Context, it: &ast::Item) { cx.span_lint(PRIVATE_NO_MANGLE_FNS, it.span, msg.as_slice()); } }, + ast::ItemStatic(..) => { + if attr::contains_name(it.attrs.as_slice(), "no_mangle") && + !cx.exported_items.contains(&it.id) { + let msg = format!("static {} is marked #[no_mangle], but not exported", + it.ident); + cx.span_lint(PRIVATE_NO_MANGLE_STATICS, 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]"; diff --git a/src/test/compile-fail/lint-unexported-no-mangle.rs b/src/test/compile-fail/lint-unexported-no-mangle.rs index fed1157b1cf..216fcf93535 100644 --- a/src/test/compile-fail/lint-unexported-no-mangle.rs +++ b/src/test/compile-fail/lint-unexported-no-mangle.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// compile-flags:-F private_no_mangle_fns -F no_mangle_const_items +// compile-flags:-F private_no_mangle_fns -F no_mangle_const_items -F private_no_mangle_statics // FIXME(#19495) no_mangle'ing main ICE's. #[no_mangle] @@ -26,6 +26,14 @@ fn foo() { //~ ERROR function foo is marked #[no_mangle], but not exported pub fn bar() { } +#[no_mangle] +pub static BAR: u64 = 1; + +#[allow(dead_code)] +#[no_mangle] +static PRIVATE_BAR: u64 = 1; //~ ERROR static PRIVATE_BAR is marked #[no_mangle], but not exported + + fn main() { foo(); bar();