Auto merge of #30269 - sanxiyn:no-mangle-generic, r=Aatch

Fix #15844.

Should the default be Deny instead?
This commit is contained in:
bors 2015-12-16 14:12:43 +00:00
commit d4ffaf6f83
2 changed files with 25 additions and 10 deletions

View File

@ -966,6 +966,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;
@ -973,19 +979,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(..) => {

View File

@ -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() {}