Emit warnings on misplaced #[no_mangle]
This commit is contained in:
parent
acd68b503d
commit
8f69266f79
3 changed files with 225 additions and 138 deletions
|
@ -83,6 +83,8 @@ impl CheckAttrVisitor<'tcx> {
|
||||||
self.check_link_name(hir_id, attr, span, target);
|
self.check_link_name(hir_id, attr, span, target);
|
||||||
} else if self.tcx.sess.check_name(attr, sym::link_section) {
|
} else if self.tcx.sess.check_name(attr, sym::link_section) {
|
||||||
self.check_link_section(hir_id, attr, span, target);
|
self.check_link_section(hir_id, attr, span, target);
|
||||||
|
} else if self.tcx.sess.check_name(attr, sym::no_mangle) {
|
||||||
|
self.check_no_mangle(hir_id, attr, span, target);
|
||||||
}
|
}
|
||||||
true
|
true
|
||||||
};
|
};
|
||||||
|
@ -419,6 +421,27 @@ impl CheckAttrVisitor<'tcx> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Checks if `#[no_mangle]` is applied to a function or static.
|
||||||
|
fn check_no_mangle(&self, hir_id: HirId, attr: &Attribute, span: &Span, target: Target) {
|
||||||
|
match target {
|
||||||
|
Target::Static | Target::Fn | Target::Method(..) => {}
|
||||||
|
_ => {
|
||||||
|
// FIXME: #[no_mangle] was previously allowed on non-functions/statics and some
|
||||||
|
// crates used this, so only emit a warning.
|
||||||
|
self.tcx.struct_span_lint_hir(UNUSED_ATTRIBUTES, hir_id, attr.span, |lint| {
|
||||||
|
lint.build("attribute should be applied to a function or static")
|
||||||
|
.warn(
|
||||||
|
"this was previously accepted by the compiler but is \
|
||||||
|
being phased out; it will become a hard error in \
|
||||||
|
a future release!",
|
||||||
|
)
|
||||||
|
.span_label(*span, "not a function or static")
|
||||||
|
.emit();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Checks if the `#[repr]` attributes on `item` are valid.
|
/// Checks if the `#[repr]` attributes on `item` are valid.
|
||||||
fn check_repr(
|
fn check_repr(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
@ -372,16 +372,31 @@ mod automatically_derived {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
|
//~^ WARN attribute should be applied to a function or static [unused_attributes]
|
||||||
|
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
mod no_mangle {
|
mod no_mangle {
|
||||||
|
//~^ NOTE not a function or static
|
||||||
mod inner { #![no_mangle] }
|
mod inner { #![no_mangle] }
|
||||||
|
//~^ WARN attribute should be applied to a function or static [unused_attributes]
|
||||||
|
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
//~| NOTE not a function or static
|
||||||
|
|
||||||
#[no_mangle] fn f() { }
|
#[no_mangle] fn f() { }
|
||||||
|
|
||||||
#[no_mangle] struct S;
|
#[no_mangle] struct S;
|
||||||
|
//~^ WARN attribute should be applied to a function or static [unused_attributes]
|
||||||
|
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
//~| NOTE not a function or static
|
||||||
|
|
||||||
#[no_mangle] type T = S;
|
#[no_mangle] type T = S;
|
||||||
|
//~^ WARN attribute should be applied to a function or static [unused_attributes]
|
||||||
|
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
//~| NOTE not a function or static
|
||||||
|
|
||||||
#[no_mangle] impl S { }
|
#[no_mangle] impl S { }
|
||||||
|
//~^ WARN attribute should be applied to a function or static [unused_attributes]
|
||||||
|
//~| WARN this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||||
|
//~| NOTE not a function or static
|
||||||
}
|
}
|
||||||
|
|
||||||
#[should_panic]
|
#[should_panic]
|
||||||
|
|
File diff suppressed because it is too large
Load diff
Loading…
Add table
Reference in a new issue