From 396cf1e1f51ed37e320f47e0c7ff0dc7ddcb288b Mon Sep 17 00:00:00 2001 From: Ralf Jung Date: Sat, 17 Feb 2024 09:57:24 +0100 Subject: require simd_insert, simd_extract indices to be constants --- compiler/rustc_borrowck/src/session_diagnostics.rs | 6 ++++-- compiler/rustc_borrowck/src/type_check/mod.rs | 21 +++++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) (limited to 'compiler/rustc_borrowck/src') diff --git a/compiler/rustc_borrowck/src/session_diagnostics.rs b/compiler/rustc_borrowck/src/session_diagnostics.rs index 1685624f247..a055ce95e8e 100644 --- a/compiler/rustc_borrowck/src/session_diagnostics.rs +++ b/compiler/rustc_borrowck/src/session_diagnostics.rs @@ -454,8 +454,10 @@ pub(crate) enum TypeNoCopy<'a, 'tcx> { } #[derive(Diagnostic)] -#[diag(borrowck_simd_shuffle_last_const)] -pub(crate) struct SimdShuffleLastConst { +#[diag(borrowck_simd_intrinsic_arg_const)] +pub(crate) struct SimdIntrinsicArgConst { #[primary_span] pub span: Span, + pub arg: usize, + pub intrinsic: String, } diff --git a/compiler/rustc_borrowck/src/type_check/mod.rs b/compiler/rustc_borrowck/src/type_check/mod.rs index 64469727d0d..5d5ed62e731 100644 --- a/compiler/rustc_borrowck/src/type_check/mod.rs +++ b/compiler/rustc_borrowck/src/type_check/mod.rs @@ -49,7 +49,7 @@ use rustc_mir_dataflow::impls::MaybeInitializedPlaces; use rustc_mir_dataflow::move_paths::MoveData; use rustc_mir_dataflow::ResultsCursor; -use crate::session_diagnostics::{MoveUnsized, SimdShuffleLastConst}; +use crate::session_diagnostics::{MoveUnsized, SimdIntrinsicArgConst}; use crate::{ borrow_set::BorrowSet, constraints::{OutlivesConstraint, OutlivesConstraintSet}, @@ -1666,9 +1666,22 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { let func_ty = func.ty(body, self.infcx.tcx); if let ty::FnDef(def_id, _) = *func_ty.kind() { - if let Some(sym::simd_shuffle) = self.tcx().intrinsic(def_id) { - if !matches!(args[2], Spanned { node: Operand::Constant(_), .. }) { - self.tcx().dcx().emit_err(SimdShuffleLastConst { span: term.source_info.span }); + // Some of the SIMD intrinsics are special: they need a particular argument to be a constant. + // (Eventually this should use const-generics, but those are not up for the task yet: + // https://github.com/rust-lang/rust/issues/85229.) + if let Some(name @ (sym::simd_shuffle | sym::simd_insert | sym::simd_extract)) = + self.tcx().intrinsic(def_id) + { + let idx = match name { + sym::simd_shuffle => 2, + _ => 1, + }; + if !matches!(args[idx], Spanned { node: Operand::Constant(_), .. }) { + self.tcx().dcx().emit_err(SimdIntrinsicArgConst { + span: term.source_info.span, + arg: idx + 1, + intrinsic: name.to_string(), + }); } } } -- cgit 1.4.1-3-g733a5