From 55ffc33b10cbd0b4d2c2756e525db7551e585a79 Mon Sep 17 00:00:00 2001 From: Seo Sanghyeon Date: Wed, 9 Dec 2015 01:48:40 +0900 Subject: [PATCH] Warn no_mangle on generic functions --- src/librustc_lint/builtin.rs | 27 ++++++++++++++++------ src/test/compile-fail/generic-no-mangle.rs | 8 ++++--- 2 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index 739c5f12ecb30..0b99d68f25bee 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -971,6 +971,12 @@ declare_lint! { "const items will not have their symbols exported" } +declare_lint! { + NO_MANGLE_GENERIC_ITEMS, + Warn, + "generic items must be mangled" +} + #[derive(Copy, Clone)] pub struct InvalidNoMangleItems; @@ -978,19 +984,26 @@ impl LintPass for InvalidNoMangleItems { fn get_lints(&self) -> LintArray { lint_array!(PRIVATE_NO_MANGLE_FNS, PRIVATE_NO_MANGLE_STATICS, - NO_MANGLE_CONST_ITEMS) + NO_MANGLE_CONST_ITEMS, + NO_MANGLE_GENERIC_ITEMS) } } impl LateLintPass for InvalidNoMangleItems { fn check_item(&mut self, cx: &LateContext, it: &hir::Item) { match it.node { - hir::ItemFn(..) => { - if attr::contains_name(&it.attrs, "no_mangle") && - !cx.access_levels.is_reachable(it.id) { - let msg = format!("function {} is marked #[no_mangle], but not exported", - it.name); - cx.span_lint(PRIVATE_NO_MANGLE_FNS, it.span, &msg); + hir::ItemFn(_, _, _, _, ref generics, _) => { + if attr::contains_name(&it.attrs, "no_mangle") { + if !cx.access_levels.is_reachable(it.id) { + let msg = format!("function {} is marked #[no_mangle], but not exported", + it.name); + cx.span_lint(PRIVATE_NO_MANGLE_FNS, it.span, &msg); + } + if generics.is_parameterized() { + cx.span_lint(NO_MANGLE_GENERIC_ITEMS, + it.span, + "generic functions must be mangled"); + } } }, hir::ItemStatic(..) => { diff --git a/src/test/compile-fail/generic-no-mangle.rs b/src/test/compile-fail/generic-no-mangle.rs index 4163d531e870e..2cb73cf2ef79b 100644 --- a/src/test/compile-fail/generic-no-mangle.rs +++ b/src/test/compile-fail/generic-no-mangle.rs @@ -8,10 +8,12 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// ignore-test this should fail to compile (#15844) +#![deny(no_mangle_generic_items)] #[no_mangle] -fn foo() {} //~ ERROR generic functions must be mangled +pub fn foo() {} //~ ERROR generic functions must be mangled #[no_mangle] -extern fn foo() {} //~ ERROR generic functions must be mangled +pub extern fn bar() {} //~ ERROR generic functions must be mangled + +fn main() {}