check link ordinal make sure target is foreign function

This commit is contained in:
yukang 2022-08-03 11:30:27 +08:00
parent 792bc5a010
commit 0d1b832667
5 changed files with 64 additions and 0 deletions

View File

@ -262,3 +262,6 @@ passes-rustc-lint-opt-ty = `#[rustc_lint_opt_ty]` should be applied to a struct
passes-rustc-lint-opt-deny-field-access = `#[rustc_lint_opt_deny_field_access]` should be applied to a field
.label = not a field
passes-link-ordinal = attribute should be applied to a foreign function
.label = not a foreign function

View File

@ -146,6 +146,9 @@ impl CheckAttrVisitor<'_> {
| sym::stable
| sym::rustc_allowed_through_unstable_modules
| sym::rustc_promotable => self.check_stability_promotable(&attr, span, target),
sym::link_ordinal => {
self.check_link_ordinal(&attr, span, target)
},
_ => true,
};
is_valid &= attr_is_valid;
@ -1861,6 +1864,16 @@ impl CheckAttrVisitor<'_> {
}
}
fn check_link_ordinal(&self, attr: &Attribute, _span: Span, target: Target) -> bool {
match target {
Target::ForeignFn => true,
_ => {
self.tcx.sess.emit_err(errors::LinkOrdinal { attr_span: attr.span });
false
}
}
}
fn check_deprecated(&self, hir_id: HirId, attr: &Attribute, _span: Span, target: Target) {
match target {
Target::Closure | Target::Expression | Target::Statement | Target::Arm => {

View File

@ -551,6 +551,13 @@ pub struct ConstTrait {
pub attr_span: Span,
}
#[derive(SessionDiagnostic)]
#[error(passes::link_ordinal)]
pub struct LinkOrdinal {
#[primary_span]
pub attr_span: Span
}
#[derive(SessionDiagnostic)]
#[error(passes::stability_promotable)]
pub struct StabilityPromotable {

View File

@ -0,0 +1,18 @@
#![feature(raw_dylib)]
//~^ WARN the feature `raw_dylib` is incomplete
#[link_ordinal(123)]
//~^ ERROR attribute should be applied to a foreign function
struct Foo {}
#[link_ordinal(123)]
//~^ ERROR attribute should be applied to a foreign function
fn test() {}
#[link(name = "exporter", kind = "raw-dylib")]
extern {
#[link_ordinal(13)]
fn imported_function();
}
fn main() {}

View File

@ -0,0 +1,23 @@
warning: the feature `raw_dylib` is incomplete and may not be safe to use and/or cause compiler crashes
--> $DIR/link-ordinal-not-foreign-fn.rs:1:12
|
LL | #![feature(raw_dylib)]
| ^^^^^^^^^
|
= note: `#[warn(incomplete_features)]` on by default
= note: see issue #58713 <https://github.com/rust-lang/rust/issues/58713> for more information
error: attribute should be applied to a foreign function
--> $DIR/link-ordinal-not-foreign-fn.rs:4:1
|
LL | #[link_ordinal(123)]
| ^^^^^^^^^^^^^^^^^^^^
error: attribute should be applied to a foreign function
--> $DIR/link-ordinal-not-foreign-fn.rs:8:1
|
LL | #[link_ordinal(123)]
| ^^^^^^^^^^^^^^^^^^^^
error: aborting due to 2 previous errors; 1 warning emitted