Skip to content

Commit 00743be

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

19 files changed

+114
-954
lines changed

Diff for: compiler/rustc_codegen_cranelift/example/std_example.rs

-3
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,6 @@
88
unboxed_closures
99
)]
1010
#![allow(internal_features)]
11-
// FIXME once abi_unsupported_vector_types is a hard error disable the foo test when the respective
12-
// target feature is not enabled.
13-
#![allow(abi_unsupported_vector_types)]
1411

1512
#[cfg(target_arch = "x86_64")]
1613
use std::arch::x86_64::*;

Diff for: compiler/rustc_lint/src/lib.rs

+5
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) {

Diff for: compiler/rustc_lint_defs/src/builtin.rs

-69
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

Diff for: compiler/rustc_monomorphize/src/errors.rs

+4-2
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>,

Diff for: compiler/rustc_monomorphize/src/mono_checks/abi_check.rs

+12-22
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
}

Diff for: compiler/rustc_target/src/target_features.rs

+1-1
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)] =

Diff for: tests/assembly/simd-bitmask.rs

+5-2
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
//

Diff for: tests/assembly/simd-intrinsic-select.rs

+5-2
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
//

Diff for: tests/codegen/regparm-inreg.rs

+1-1
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

Diff for: tests/ui/abi/simd-abi-checks-avx.rs

+12-24
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)