Skip to content

Commit

Permalink
Auto merge of #30269 - sanxiyn:no-mangle-generic, r=Aatch
Browse files Browse the repository at this point in the history
Fix #15844.

Should the default be Deny instead?
  • Loading branch information
bors committed Dec 16, 2015
2 parents 785a8a6 + 55ffc33 commit d4ffaf6
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 10 deletions.
27 changes: 20 additions & 7 deletions src/librustc_lint/builtin.rs
Expand Up @@ -966,26 +966,39 @@ 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;

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(..) => {
Expand Down
8 changes: 5 additions & 3 deletions src/test/compile-fail/generic-no-mangle.rs
Expand Up @@ -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<T>() {} //~ ERROR generic functions must be mangled
pub fn foo<T>() {} //~ ERROR generic functions must be mangled

#[no_mangle]
extern fn foo<T>() {} //~ ERROR generic functions must be mangled
pub extern fn bar<T>() {} //~ ERROR generic functions must be mangled

fn main() {}

0 comments on commit d4ffaf6

Please sign in to comment.