diff options
| author | Ralf Jung <post@ralfj.de> | 2021-05-11 10:17:25 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2021-05-12 16:15:30 +0200 |
| commit | 2e8e91ce25a95f11b09ef59386174edca338cc3a (patch) | |
| tree | f46057141d0a0b1f9459ef9ee28aa6ca705b8226 | |
| parent | 44a8e8d7455cd8f8ec3b3f2d5d4ef80693608f63 (diff) | |
| download | rust-2e8e91ce25a95f11b09ef59386174edca338cc3a.tar.gz rust-2e8e91ce25a95f11b09ef59386174edca338cc3a.zip | |
add check that simd_shuffle arguments are constants
| -rw-r--r-- | compiler/rustc_mir/src/transform/lower_intrinsics.rs | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/compiler/rustc_mir/src/transform/lower_intrinsics.rs b/compiler/rustc_mir/src/transform/lower_intrinsics.rs index e6ee474285e..6d7e4cdb1c6 100644 --- a/compiler/rustc_mir/src/transform/lower_intrinsics.rs +++ b/compiler/rustc_mir/src/transform/lower_intrinsics.rs @@ -5,6 +5,7 @@ use rustc_middle::mir::*; use rustc_middle::ty::subst::SubstsRef; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_span::symbol::{sym, Symbol}; +use rustc_span::Span; use rustc_target::spec::abi::Abi; pub struct LowerIntrinsics; @@ -119,6 +120,9 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { terminator.kind = TerminatorKind::Goto { target }; } } + _ if intrinsic_name.as_str().starts_with("simd_shuffle") => { + validate_simd_shuffle(tcx, args, terminator.source_info.span); + } _ => {} } } @@ -132,9 +136,19 @@ fn resolve_rust_intrinsic( ) -> Option<(Symbol, SubstsRef<'tcx>)> { if let ty::FnDef(def_id, substs) = *func_ty.kind() { let fn_sig = func_ty.fn_sig(tcx); - if fn_sig.abi() == Abi::RustIntrinsic { + if let Abi::RustIntrinsic | Abi::PlatformIntrinsic = fn_sig.abi() { return Some((tcx.item_name(def_id), substs)); } } None } + +fn validate_simd_shuffle(tcx: TyCtxt<'tcx>, args: &[Operand<'tcx>], span: Span) { + match &args[2] { + Operand::Constant(_) => {} // all good + _ => { + let msg = format!("last argument of `simd_shuffle` is required to be a `const` item"); + tcx.sess.span_err(span, &msg); + } + } +} |
