Emit error when calling/declaring functions with unavailable vectors.
On some architectures, vector types may have a different ABI when relevant target features are enabled. As discussed in https://github.com/rust-lang/lang-team/issues/235, this turns out to very easily lead to unsound code. This commit makes it an error to declare or call functions using those vector types in a context in which the corresponding target features are disabled, if using an ABI for which the difference is relevant.
This commit is contained in:
parent
7342830c05
commit
5af56cac38
16 changed files with 448 additions and 53 deletions
|
@ -16,6 +16,7 @@ declare_lint_pass! {
|
|||
/// that are used by other parts of the compiler.
|
||||
HardwiredLints => [
|
||||
// tidy-alphabetical-start
|
||||
ABI_UNSUPPORTED_VECTOR_TYPES,
|
||||
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
|
||||
AMBIGUOUS_ASSOCIATED_ITEMS,
|
||||
AMBIGUOUS_GLOB_IMPORTS,
|
||||
|
@ -5078,3 +5079,69 @@ declare_lint! {
|
|||
};
|
||||
crate_level_only
|
||||
}
|
||||
|
||||
declare_lint! {
|
||||
/// The `abi_unsupported_vector_types` lint detects function definitions and calls
|
||||
/// whose ABI depends on enabling certain target features, but those features are not enabled.
|
||||
///
|
||||
/// ### Example
|
||||
///
|
||||
/// ```rust,ignore (fails on non-x86_64)
|
||||
/// extern "C" fn missing_target_feature(_: std::arch::x86_64::__m256) {
|
||||
/// todo!()
|
||||
/// }
|
||||
///
|
||||
/// #[target_feature(enable = "avx")]
|
||||
/// unsafe extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
|
||||
/// todo!()
|
||||
/// }
|
||||
///
|
||||
/// fn main() {
|
||||
/// let v = unsafe { std::mem::zeroed() };
|
||||
/// unsafe { with_target_feature(v); }
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// ```text
|
||||
/// warning: ABI error: this function call uses a avx vector type, which is not enabled in the caller
|
||||
/// --> lint_example.rs:18:12
|
||||
/// |
|
||||
/// | unsafe { with_target_feature(v); }
|
||||
/// | ^^^^^^^^^^^^^^^^^^^^^^ function called here
|
||||
/// |
|
||||
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
|
||||
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
|
||||
/// = note: `#[warn(abi_unsupported_vector_types)]` on by default
|
||||
///
|
||||
///
|
||||
/// warning: ABI error: this function definition uses a avx vector type, which is not enabled
|
||||
/// --> lint_example.rs:3:1
|
||||
/// |
|
||||
/// | pub extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
|
||||
/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
|
||||
/// |
|
||||
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
|
||||
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
|
||||
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
|
||||
/// ```
|
||||
///
|
||||
///
|
||||
///
|
||||
/// ### Explanation
|
||||
///
|
||||
/// The C ABI for `__m256` requires the value to be passed in an AVX register,
|
||||
/// which is only possible when the `avx` target feature is enabled.
|
||||
/// Therefore, `missing_target_feature` cannot be compiled without that target feature.
|
||||
/// A similar (but complementary) message is triggered when `with_target_feature` is called
|
||||
/// by a function that does not enable the `avx` target feature.
|
||||
///
|
||||
/// Note that this lint is very similar to the `-Wpsabi` warning in `gcc`/`clang`.
|
||||
pub ABI_UNSUPPORTED_VECTOR_TYPES,
|
||||
Warn,
|
||||
"this function call or definition uses a vector type which is not enabled",
|
||||
@future_incompatible = FutureIncompatibleInfo {
|
||||
reason: FutureIncompatibilityReason::FutureReleaseErrorDontReportInDeps,
|
||||
reference: "issue #116558 <https://github.com/rust-lang/rust/issues/116558>",
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue