Skip to content

Commit d817e10

Browse files
committed
make abi_unsupported_vector_types a hard error
1 parent b6d74b5 commit d817e10

18 files changed

+114
-951
lines changed

compiler/rustc_lint/src/lib.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,11 @@ fn register_builtins(store: &mut LintStore) {
606606
"converted into hard error, see issue #127323 \
607607
<https://github.com/rust-lang/rust/issues/127323> for more information",
608608
);
609+
store.register_removed(
610+
"abi_unsupported_vector_types",
611+
"converted into hard error, \
612+
see <https://github.com/rust-lang/rust/issues/116558> for more information",
613+
);
609614
}
610615

611616
fn register_internals(store: &mut LintStore) {

compiler/rustc_lint_defs/src/builtin.rs

Lines changed: 0 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ declare_lint_pass! {
1616
/// that are used by other parts of the compiler.
1717
HardwiredLints => [
1818
// tidy-alphabetical-start
19-
ABI_UNSUPPORTED_VECTOR_TYPES,
2019
ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE,
2120
AMBIGUOUS_ASSOCIATED_ITEMS,
2221
AMBIGUOUS_GLOB_IMPORTS,
@@ -5061,74 +5060,6 @@ declare_lint! {
50615060
crate_level_only
50625061
}
50635062

5064-
declare_lint! {
5065-
/// The `abi_unsupported_vector_types` lint detects function definitions and calls
5066-
/// whose ABI depends on enabling certain target features, but those features are not enabled.
5067-
///
5068-
/// ### Example
5069-
///
5070-
/// ```rust,ignore (fails on non-x86_64)
5071-
/// extern "C" fn missing_target_feature(_: std::arch::x86_64::__m256) {
5072-
/// todo!()
5073-
/// }
5074-
///
5075-
/// #[target_feature(enable = "avx")]
5076-
/// unsafe extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
5077-
/// todo!()
5078-
/// }
5079-
///
5080-
/// fn main() {
5081-
/// let v = unsafe { std::mem::zeroed() };
5082-
/// unsafe { with_target_feature(v); }
5083-
/// }
5084-
/// ```
5085-
///
5086-
/// This will produce:
5087-
///
5088-
/// ```text
5089-
/// warning: ABI error: this function call uses a avx vector type, which is not enabled in the caller
5090-
/// --> lint_example.rs:18:12
5091-
/// |
5092-
/// | unsafe { with_target_feature(v); }
5093-
/// | ^^^^^^^^^^^^^^^^^^^^^^ function called here
5094-
/// |
5095-
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
5096-
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
5097-
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
5098-
/// = note: `#[warn(abi_unsupported_vector_types)]` on by default
5099-
///
5100-
///
5101-
/// warning: ABI error: this function definition uses a avx vector type, which is not enabled
5102-
/// --> lint_example.rs:3:1
5103-
/// |
5104-
/// | pub extern "C" fn with_target_feature(_: std::arch::x86_64::__m256) {
5105-
/// | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ function defined here
5106-
/// |
5107-
/// = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
5108-
/// = note: for more information, see issue #116558 <https://github.com/rust-lang/rust/issues/116558>
5109-
/// = help: consider enabling it globally (-C target-feature=+avx) or locally (#[target_feature(enable="avx")])
5110-
/// ```
5111-
///
5112-
///
5113-
///
5114-
/// ### Explanation
5115-
///
5116-
/// The C ABI for `__m256` requires the value to be passed in an AVX register,
5117-
/// which is only possible when the `avx` target feature is enabled.
5118-
/// Therefore, `missing_target_feature` cannot be compiled without that target feature.
5119-
/// A similar (but complementary) message is triggered when `with_target_feature` is called
5120-
/// by a function that does not enable the `avx` target feature.
5121-
///
5122-
/// Note that this lint is very similar to the `-Wpsabi` warning in `gcc`/`clang`.
5123-
pub ABI_UNSUPPORTED_VECTOR_TYPES,
5124-
Warn,
5125-
"this function call or definition uses a vector type which is not enabled",
5126-
@future_incompatible = FutureIncompatibleInfo {
5127-
reason: FutureIncompatibilityReason::FutureReleaseErrorReportInDeps,
5128-
reference: "issue #116558 <https://github.com/rust-lang/rust/issues/116558>",
5129-
};
5130-
}
5131-
51325063
declare_lint! {
51335064
/// The `wasm_c_abi` lint detects usage of the `extern "C"` ABI of wasm that is affected
51345065
/// by a planned ABI change that has the goal of aligning Rust with the standard C ABI

compiler/rustc_monomorphize/src/errors.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,10 +70,11 @@ pub(crate) struct UnknownCguCollectionMode<'a> {
7070
pub mode: &'a str,
7171
}
7272

73-
#[derive(LintDiagnostic)]
73+
#[derive(Diagnostic)]
7474
#[diag(monomorphize_abi_error_disabled_vector_type)]
7575
#[help]
7676
pub(crate) struct AbiErrorDisabledVectorType<'a> {
77+
#[primary_span]
7778
#[label]
7879
pub span: Span,
7980
pub required_feature: &'a str,
@@ -82,9 +83,10 @@ pub(crate) struct AbiErrorDisabledVectorType<'a> {
8283
pub is_call: bool,
8384
}
8485

85-
#[derive(LintDiagnostic)]
86+
#[derive(Diagnostic)]
8687
#[diag(monomorphize_abi_error_unsupported_vector_type)]
8788
pub(crate) struct AbiErrorUnsupportedVectorType<'a> {
89+
#[primary_span]
8890
#[label]
8991
pub span: Span,
9092
pub ty: Ty<'a>,

compiler/rustc_monomorphize/src/mono_checks/abi_check.rs

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use rustc_hir::{CRATE_HIR_ID, HirId};
55
use rustc_middle::mir::{self, Location, traversal};
66
use rustc_middle::ty::layout::LayoutCx;
77
use rustc_middle::ty::{self, Instance, InstanceKind, Ty, TyCtxt, TypingEnv};
8-
use rustc_session::lint::builtin::{ABI_UNSUPPORTED_VECTOR_TYPES, WASM_C_ABI};
8+
use rustc_session::lint::builtin::WASM_C_ABI;
99
use rustc_span::def_id::DefId;
1010
use rustc_span::{DUMMY_SP, Span, Symbol, sym};
1111
use rustc_target::callconv::{ArgAbi, Conv, FnAbi, PassMode};
@@ -50,34 +50,24 @@ fn do_check_simd_vector_abi<'tcx>(
5050
let feature = match feature_def.iter().find(|(bits, _)| size.bits() <= *bits) {
5151
Some((_, feature)) => feature,
5252
None => {
53-
let (span, hir_id) = loc();
54-
tcx.emit_node_span_lint(
55-
ABI_UNSUPPORTED_VECTOR_TYPES,
56-
hir_id,
53+
let (span, _hir_id) = loc();
54+
tcx.dcx().emit_err(errors::AbiErrorUnsupportedVectorType {
5755
span,
58-
errors::AbiErrorUnsupportedVectorType {
59-
span,
60-
ty: arg_abi.layout.ty,
61-
is_call,
62-
},
63-
);
56+
ty: arg_abi.layout.ty,
57+
is_call,
58+
});
6459
continue;
6560
}
6661
};
6762
if !have_feature(Symbol::intern(feature)) {
6863
// Emit error.
69-
let (span, hir_id) = loc();
70-
tcx.emit_node_span_lint(
71-
ABI_UNSUPPORTED_VECTOR_TYPES,
72-
hir_id,
64+
let (span, _hir_id) = loc();
65+
tcx.dcx().emit_err(errors::AbiErrorDisabledVectorType {
7366
span,
74-
errors::AbiErrorDisabledVectorType {
75-
span,
76-
required_feature: feature,
77-
ty: arg_abi.layout.ty,
78-
is_call,
79-
},
80-
);
67+
required_feature: feature,
68+
ty: arg_abi.layout.ty,
69+
is_call,
70+
});
8171
}
8272
}
8373
}

compiler/rustc_target/src/target_features.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -765,7 +765,7 @@ const RISCV_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[
765765
(32768, "zvl32768b"),
766766
(65536, "zvl65536b"),
767767
];
768-
// Always warn on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
768+
// Always error on SPARC, as the necessary target features cannot be enabled in Rust at the moment.
769769
const SPARC_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] = &[/*(64, "vis")*/];
770770

771771
const HEXAGON_FEATURES_FOR_CORRECT_VECTOR_ABI: &'static [(u64, &'static str)] =

tests/assembly/simd-bitmask.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ pub unsafe extern "C" fn bitmask_m8x16(mask: m8x16) -> u16 {
6666
simd_bitmask(mask)
6767
}
6868

69-
// CHECK-LABEL: bitmask_m8x64
69+
// x86-avx512-LABEL: bitmask_m8x64
7070
#[no_mangle]
71+
#[cfg(x86_avx512)]
7172
pub unsafe extern "C" fn bitmask_m8x64(mask: m8x64) -> u64 {
7273
// The simd_bitmask intrinsic already uses the most significant bit, so no shift is necessary.
7374
// Note that x86 has no byte shift, llvm uses a word shift to move the least significant bit
@@ -129,8 +130,10 @@ pub unsafe extern "C" fn bitmask_m64x2(mask: m64x2) -> u8 {
129130
simd_bitmask(mask)
130131
}
131132

132-
// CHECK-LABEL: bitmask_m64x4
133+
// x86-avx2-LABEL: bitmask_m64x4
134+
// x86-avx512-LABEL: bitmask_m64x4
133135
#[no_mangle]
136+
#[cfg(any(x86_avx2, x86_avx512))]
134137
pub unsafe extern "C" fn bitmask_m64x4(mask: m64x4) -> u8 {
135138
// The simd_bitmask intrinsic already uses the most significant bit, so no shift is necessary.
136139
//

tests/assembly/simd-intrinsic-select.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ pub unsafe extern "C" fn select_f64x2(mask: m64x2, a: f64x2, b: f64x2) -> f64x2
100100
simd_select(mask, a, b)
101101
}
102102

103-
// CHECK-LABEL: select_f64x4
103+
// x86-avx2-LABEL: select_f64x4
104+
// x86-avx512-LABEL: select_f64x4
104105
#[no_mangle]
106+
#[cfg(any(x86_avx2, x86_avx512))]
105107
pub unsafe extern "C" fn select_f64x4(mask: m64x4, a: f64x4, b: f64x4) -> f64x4 {
106108
// The parameter is a 256 bit vector which in the C abi is only valid for avx targets.
107109
//
@@ -114,8 +116,9 @@ pub unsafe extern "C" fn select_f64x4(mask: m64x4, a: f64x4, b: f64x4) -> f64x4
114116
simd_select(mask, a, b)
115117
}
116118

117-
// CHECK-LABEL: select_f64x8
119+
// x86-avx512-LABEL: select_f64x8
118120
#[no_mangle]
121+
#[cfg(x86_avx512)]
119122
pub unsafe extern "C" fn select_f64x8(mask: m64x8, a: f64x8, b: f64x8) -> f64x8 {
120123
// The parameter is a 256 bit vector which in the C abi is only valid for avx512 targets.
121124
//

tests/codegen/regparm-inreg.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// x86 only.
44

55
//@ add-core-stubs
6-
//@ compile-flags: --target i686-unknown-linux-gnu -Cno-prepopulate-passes -Copt-level=3
6+
//@ compile-flags: --target i686-unknown-linux-gnu -Cno-prepopulate-passes -Copt-level=3 -Ctarget-feature=+avx
77
//@ needs-llvm-components: x86
88

99
//@ revisions:regparm0 regparm1 regparm2 regparm3

tests/ui/abi/simd-abi-checks-avx.rs

Lines changed: 12 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
//@ only-x86_64
2-
//@ build-pass
3-
//@ ignore-pass (test emits codegen-time warnings)
2+
//@ build-fail
43
//@ compile-flags: -C target-feature=-avx
54

65
#![feature(avx512_target_feature)]
@@ -14,20 +13,17 @@ use std::arch::x86_64::*;
1413
struct Wrapper(__m256);
1514

1615
unsafe extern "C" fn w(_: Wrapper) {
17-
//~^ requires the `avx` target feature, which is not enabled
18-
//~| WARNING this was previously accepted by the compiler
16+
//~^ ERROR: requires the `avx` target feature, which is not enabled
1917
todo!()
2018
}
2119

2220
unsafe extern "C" fn f(_: __m256) {
23-
//~^ requires the `avx` target feature, which is not enabled
24-
//~| WARNING this was previously accepted by the compiler
21+
//~^ ERROR: requires the `avx` target feature, which is not enabled
2522
todo!()
2623
}
2724

2825
unsafe extern "C" fn g() -> __m256 {
29-
//~^ requires the `avx` target feature, which is not enabled
30-
//~| WARNING this was previously accepted by the compiler
26+
//~^ ERROR: requires the `avx` target feature, which is not enabled
3127
todo!()
3228
}
3329

@@ -56,25 +52,20 @@ unsafe fn test() {
5652
unsafe fn in_closure() -> impl FnOnce() -> __m256 {
5753
#[inline(always)] // this disables target-feature inheritance
5854
|| g()
59-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
60-
//~| WARNING this was previously accepted by the compiler
55+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
6156
}
6257

6358
fn main() {
6459
unsafe {
6560
f(g());
66-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
67-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
68-
//~| WARNING this was previously accepted by the compiler
69-
//~| WARNING this was previously accepted by the compiler
61+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
62+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
7063
}
7164

7265
unsafe {
7366
gavx(favx());
74-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
75-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
76-
//~| WARNING this was previously accepted by the compiler
77-
//~| WARNING this was previously accepted by the compiler
67+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
68+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
7869
}
7970

8071
unsafe {
@@ -83,10 +74,8 @@ fn main() {
8374

8475
unsafe {
8576
w(Wrapper(g()));
86-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
87-
//~| WARNING requires the `avx` target feature, which is not enabled in the caller
88-
//~| WARNING this was previously accepted by the compiler
89-
//~| WARNING this was previously accepted by the compiler
77+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
78+
//~| ERROR requires the `avx` target feature, which is not enabled in the caller
9079
}
9180

9281
unsafe {
@@ -99,8 +88,7 @@ fn main() {
9988
fn some_extern() -> __m256;
10089
}
10190
some_extern();
102-
//~^ WARNING requires the `avx` target feature, which is not enabled in the caller
103-
//~| WARNING this was previously accepted by the compiler
91+
//~^ ERROR requires the `avx` target feature, which is not enabled in the caller
10492
}
10593
}
10694

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy