mirror of
https://github.com/rust-lang/rust.git
synced 2025-04-28 02:57:37 +00:00
Auto merge of #121549 - matthiaskrgr:rollup-1hvu3lb, r=matthiaskrgr
Rollup of 7 pull requests Successful merges: - #121435 (Account for RPITIT in E0310 explicit lifetime constraint suggestion) - #121490 (Rustdoc: include crate name in links for local primitives) - #121520 (delay cloning of iterator items) - #121522 (check that simd_insert/extract indices are in-bounds) - #121531 (Ignore less tests in debug builds) - #121539 (compiler/rustc_target/src/spec/base/apple/tests.rs: Avoid unnecessary large move) - #121542 (update stdarch) r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
381d69953b
@ -1079,7 +1079,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||
.map(|(arg_idx, val)| {
|
||||
let idx = val.unwrap_leaf().try_to_i32().unwrap();
|
||||
if idx >= i32::try_from(total_len).unwrap() {
|
||||
bx.sess().dcx().emit_err(InvalidMonomorphization::ShuffleIndexOutOfBounds {
|
||||
bx.sess().dcx().emit_err(InvalidMonomorphization::SimdIndexOutOfBounds {
|
||||
span,
|
||||
name,
|
||||
arg_idx: arg_idx as u64,
|
||||
@ -1138,24 +1138,15 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||
let val = bx.const_get_elt(vector, i as u64);
|
||||
match bx.const_to_opt_u128(val, true) {
|
||||
None => {
|
||||
bx.sess().dcx().emit_err(
|
||||
InvalidMonomorphization::ShuffleIndexNotConstant {
|
||||
span,
|
||||
name,
|
||||
arg_idx,
|
||||
},
|
||||
);
|
||||
None
|
||||
bug!("typeck should have already ensured that these are const")
|
||||
}
|
||||
Some(idx) if idx >= total_len => {
|
||||
bx.sess().dcx().emit_err(
|
||||
InvalidMonomorphization::ShuffleIndexOutOfBounds {
|
||||
span,
|
||||
name,
|
||||
arg_idx,
|
||||
total_len,
|
||||
},
|
||||
);
|
||||
bx.sess().dcx().emit_err(InvalidMonomorphization::SimdIndexOutOfBounds {
|
||||
span,
|
||||
name,
|
||||
arg_idx,
|
||||
total_len,
|
||||
});
|
||||
None
|
||||
}
|
||||
Some(idx) => Some(bx.const_i32(idx as i32)),
|
||||
@ -1184,10 +1175,22 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||
out_ty: arg_tys[2]
|
||||
}
|
||||
);
|
||||
let idx = bx
|
||||
.const_to_opt_u128(args[1].immediate(), false)
|
||||
.expect("typeck should have ensure that this is a const");
|
||||
if idx >= in_len.into() {
|
||||
bx.sess().dcx().emit_err(InvalidMonomorphization::SimdIndexOutOfBounds {
|
||||
span,
|
||||
name,
|
||||
arg_idx: 1,
|
||||
total_len: in_len.into(),
|
||||
});
|
||||
return Ok(bx.const_null(llret_ty));
|
||||
}
|
||||
return Ok(bx.insert_element(
|
||||
args[0].immediate(),
|
||||
args[2].immediate(),
|
||||
args[1].immediate(),
|
||||
bx.const_i32(idx as i32),
|
||||
));
|
||||
}
|
||||
if name == sym::simd_extract {
|
||||
@ -1195,7 +1198,19 @@ fn generic_simd_intrinsic<'ll, 'tcx>(
|
||||
ret_ty == in_elem,
|
||||
InvalidMonomorphization::ReturnType { span, name, in_elem, in_ty, ret_ty }
|
||||
);
|
||||
return Ok(bx.extract_element(args[0].immediate(), args[1].immediate()));
|
||||
let idx = bx
|
||||
.const_to_opt_u128(args[1].immediate(), false)
|
||||
.expect("typeck should have ensure that this is a const");
|
||||
if idx >= in_len.into() {
|
||||
bx.sess().dcx().emit_err(InvalidMonomorphization::SimdIndexOutOfBounds {
|
||||
span,
|
||||
name,
|
||||
arg_idx: 1,
|
||||
total_len: in_len.into(),
|
||||
});
|
||||
return Ok(bx.const_null(llret_ty));
|
||||
}
|
||||
return Ok(bx.extract_element(args[0].immediate(), bx.const_i32(idx as i32)));
|
||||
}
|
||||
|
||||
if name == sym::simd_select {
|
||||
|
@ -106,14 +106,12 @@ codegen_ssa_invalid_monomorphization_return_type = invalid monomorphization of `
|
||||
|
||||
codegen_ssa_invalid_monomorphization_second_argument_length = invalid monomorphization of `{$name}` intrinsic: expected second argument with length {$in_len} (same as input type `{$in_ty}`), found `{$arg_ty}` with length {$out_len}
|
||||
|
||||
codegen_ssa_invalid_monomorphization_shuffle_index_not_constant = invalid monomorphization of `{$name}` intrinsic: shuffle index #{$arg_idx} is not a constant
|
||||
|
||||
codegen_ssa_invalid_monomorphization_shuffle_index_out_of_bounds = invalid monomorphization of `{$name}` intrinsic: shuffle index #{$arg_idx} is out of bounds (limit {$total_len})
|
||||
|
||||
codegen_ssa_invalid_monomorphization_simd_argument = invalid monomorphization of `{$name}` intrinsic: expected SIMD argument type, found non-SIMD `{$ty}`
|
||||
|
||||
codegen_ssa_invalid_monomorphization_simd_first = invalid monomorphization of `{$name}` intrinsic: expected SIMD first type, found non-SIMD `{$ty}`
|
||||
|
||||
codegen_ssa_invalid_monomorphization_simd_index_out_of_bounds = invalid monomorphization of `{$name}` intrinsic: SIMD index #{$arg_idx} is out of bounds (limit {$total_len})
|
||||
|
||||
codegen_ssa_invalid_monomorphization_simd_input = invalid monomorphization of `{$name}` intrinsic: expected SIMD input type, found non-SIMD `{$ty}`
|
||||
|
||||
codegen_ssa_invalid_monomorphization_simd_return = invalid monomorphization of `{$name}` intrinsic: expected SIMD return type, found non-SIMD `{$ty}`
|
||||
|
@ -797,16 +797,8 @@ pub enum InvalidMonomorphization<'tcx> {
|
||||
out_ty: Ty<'tcx>,
|
||||
},
|
||||
|
||||
#[diag(codegen_ssa_invalid_monomorphization_shuffle_index_not_constant, code = E0511)]
|
||||
ShuffleIndexNotConstant {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
name: Symbol,
|
||||
arg_idx: u64,
|
||||
},
|
||||
|
||||
#[diag(codegen_ssa_invalid_monomorphization_shuffle_index_out_of_bounds, code = E0511)]
|
||||
ShuffleIndexOutOfBounds {
|
||||
#[diag(codegen_ssa_invalid_monomorphization_simd_index_out_of_bounds, code = E0511)]
|
||||
SimdIndexOutOfBounds {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
name: Symbol,
|
||||
|
@ -379,10 +379,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
let (input, input_len) = self.operand_to_simd(&args[0])?;
|
||||
let (dest, dest_len) = self.place_to_simd(dest)?;
|
||||
assert_eq!(input_len, dest_len, "Return vector length must match input length");
|
||||
assert!(
|
||||
index < dest_len,
|
||||
"Index `{index}` must be in bounds of vector with length {dest_len}"
|
||||
);
|
||||
// Bounds are not checked by typeck so we have to do it ourselves.
|
||||
if index >= input_len {
|
||||
throw_ub_format!(
|
||||
"`simd_insert` index {index} is out-of-bounds of vector with length {input_len}"
|
||||
);
|
||||
}
|
||||
|
||||
for i in 0..dest_len {
|
||||
let place = self.project_index(&dest, i)?;
|
||||
@ -397,10 +399,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
sym::simd_extract => {
|
||||
let index = u64::from(self.read_scalar(&args[1])?.to_u32()?);
|
||||
let (input, input_len) = self.operand_to_simd(&args[0])?;
|
||||
assert!(
|
||||
index < input_len,
|
||||
"index `{index}` must be in bounds of vector with length {input_len}"
|
||||
);
|
||||
// Bounds are not checked by typeck so we have to do it ourselves.
|
||||
if index >= input_len {
|
||||
throw_ub_format!(
|
||||
"`simd_extract` index {index} is out-of-bounds of vector with length {input_len}"
|
||||
);
|
||||
}
|
||||
self.copy_op(&self.project_index(&input, index)?, dest)?;
|
||||
}
|
||||
sym::likely | sym::unlikely | sym::black_box => {
|
||||
|
@ -2437,6 +2437,14 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
|
||||
let suggestion =
|
||||
if has_lifetimes { format!(" + {lt_name}") } else { format!(": {lt_name}") };
|
||||
suggs.push((sp, suggestion))
|
||||
} else if let GenericKind::Alias(ref p) = bound_kind
|
||||
&& let ty::Projection = p.kind(self.tcx)
|
||||
&& let DefKind::AssocTy = self.tcx.def_kind(p.def_id)
|
||||
&& let Some(ty::ImplTraitInTraitData::Trait { .. }) =
|
||||
self.tcx.opt_rpitit_info(p.def_id)
|
||||
{
|
||||
// The lifetime found in the `impl` is longer than the one on the RPITIT.
|
||||
// Do not suggest `<Type as Trait>::{opaque}: 'static`.
|
||||
} else if let Some(generics) = self.tcx.hir().get_generics(suggestion_scope) {
|
||||
let pred = format!("{bound_kind}: {lt_name}");
|
||||
let suggestion = format!("{} {}", generics.add_where_or_trailing_comma(), pred);
|
||||
|
@ -14,7 +14,7 @@ fn simulator_targets_set_abi() {
|
||||
aarch64_apple_watchos_sim::target(),
|
||||
];
|
||||
|
||||
for target in all_sim_targets {
|
||||
for target in &all_sim_targets {
|
||||
assert_eq!(target.abi, "sim")
|
||||
}
|
||||
}
|
||||
|
@ -320,22 +320,25 @@ fn impl_intersection_has_impossible_obligation<'a, 'cx, 'tcx>(
|
||||
let mut errors = fulfill_cx.select_where_possible(infcx);
|
||||
errors.pop().map(|err| err.obligation)
|
||||
} else {
|
||||
obligations.iter().cloned().find(|obligation| {
|
||||
// We use `evaluate_root_obligation` to correctly track intercrate
|
||||
// ambiguity clauses. We cannot use this in the new solver.
|
||||
let evaluation_result = selcx.evaluate_root_obligation(obligation);
|
||||
obligations
|
||||
.iter()
|
||||
.find(|obligation| {
|
||||
// We use `evaluate_root_obligation` to correctly track intercrate
|
||||
// ambiguity clauses. We cannot use this in the new solver.
|
||||
let evaluation_result = selcx.evaluate_root_obligation(obligation);
|
||||
|
||||
match evaluation_result {
|
||||
Ok(result) => !result.may_apply(),
|
||||
// If overflow occurs, we need to conservatively treat the goal as possibly holding,
|
||||
// since there can be instantiations of this goal that don't overflow and result in
|
||||
// success. This isn't much of a problem in the old solver, since we treat overflow
|
||||
// fatally (this still can be encountered: <https://github.com/rust-lang/rust/issues/105231>),
|
||||
// but in the new solver, this is very important for correctness, since overflow
|
||||
// *must* be treated as ambiguity for completeness.
|
||||
Err(_overflow) => false,
|
||||
}
|
||||
})
|
||||
match evaluation_result {
|
||||
Ok(result) => !result.may_apply(),
|
||||
// If overflow occurs, we need to conservatively treat the goal as possibly holding,
|
||||
// since there can be instantiations of this goal that don't overflow and result in
|
||||
// success. This isn't much of a problem in the old solver, since we treat overflow
|
||||
// fatally (this still can be encountered: <https://github.com/rust-lang/rust/issues/105231>),
|
||||
// but in the new solver, this is very important for correctness, since overflow
|
||||
// *must* be treated as ambiguity for completeness.
|
||||
Err(_overflow) => false,
|
||||
}
|
||||
})
|
||||
.cloned()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1 +1 @@
|
||||
Subproject commit d5fab978fe1c2f0043db0451e9f4857eeba17437
|
||||
Subproject commit 56087ea170d878a7a57b3a5725e0c00f5f5cad70
|
@ -879,11 +879,16 @@ fn primitive_link_fragment(
|
||||
match m.primitive_locations.get(&prim) {
|
||||
Some(&def_id) if def_id.is_local() => {
|
||||
let len = cx.current.len();
|
||||
let len = if len == 0 { 0 } else { len - 1 };
|
||||
let path = if len == 0 {
|
||||
let cname_sym = ExternalCrate { crate_num: def_id.krate }.name(cx.tcx());
|
||||
format!("{cname_sym}/")
|
||||
} else {
|
||||
"../".repeat(len - 1)
|
||||
};
|
||||
write!(
|
||||
f,
|
||||
"<a class=\"primitive\" href=\"{}primitive.{}.html{fragment}\">",
|
||||
"../".repeat(len),
|
||||
path,
|
||||
prim.as_sym()
|
||||
)?;
|
||||
needs_termination = true;
|
||||
|
@ -2503,8 +2503,11 @@ impl<'test> TestCx<'test> {
|
||||
// overridden by `compile-flags`.
|
||||
rustc.arg("-Copt-level=2");
|
||||
}
|
||||
RunPassValgrind | Pretty | DebugInfo | Codegen | Rustdoc | RustdocJson | RunMake
|
||||
| CodegenUnits | JsDocTest | Assembly => {
|
||||
Assembly | Codegen => {
|
||||
rustc.arg("-Cdebug-assertions=no");
|
||||
}
|
||||
RunPassValgrind | Pretty | DebugInfo | Rustdoc | RustdocJson | RunMake
|
||||
| CodegenUnits | JsDocTest => {
|
||||
// do not use JSON output
|
||||
}
|
||||
}
|
||||
|
@ -563,9 +563,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||
let right_idx = src_index.checked_sub(left_len).unwrap();
|
||||
this.read_immediate(&this.project_index(&right, right_idx)?)?
|
||||
} else {
|
||||
span_bug!(
|
||||
this.cur_span(),
|
||||
"simd_shuffle index {src_index} is out of bounds for 2 vectors of size {left_len}",
|
||||
throw_ub_format!(
|
||||
"`simd_shuffle_generic` index {src_index} is out-of-bounds for 2 vectors with length {dest_len}"
|
||||
);
|
||||
};
|
||||
this.write_immediate(*val, &dest)?;
|
||||
@ -604,9 +603,8 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriInterpCxExt<'mir, 'tcx> {
|
||||
let right_idx = src_index.checked_sub(left_len).unwrap();
|
||||
this.read_immediate(&this.project_index(&right, right_idx)?)?
|
||||
} else {
|
||||
span_bug!(
|
||||
this.cur_span(),
|
||||
"simd_shuffle index {src_index} is out of bounds for 2 vectors of size {left_len}",
|
||||
throw_ub_format!(
|
||||
"`simd_shuffle` index {src_index} is out-of-bounds for 2 vectors with length {dest_len}"
|
||||
);
|
||||
};
|
||||
this.write_immediate(*val, &dest)?;
|
||||
|
8
src/tools/miri/tests/fail/intrinsics/simd-extract.rs
Normal file
8
src/tools/miri/tests/fail/intrinsics/simd-extract.rs
Normal file
@ -0,0 +1,8 @@
|
||||
#![feature(portable_simd, core_intrinsics)]
|
||||
use std::simd::*;
|
||||
|
||||
fn main() {
|
||||
let v = i32x4::splat(0);
|
||||
let _x: i32 = unsafe { std::intrinsics::simd::simd_extract(v, 4) };
|
||||
//~^ERROR: index 4 is out-of-bounds
|
||||
}
|
15
src/tools/miri/tests/fail/intrinsics/simd-extract.stderr
Normal file
15
src/tools/miri/tests/fail/intrinsics/simd-extract.stderr
Normal file
@ -0,0 +1,15 @@
|
||||
error: Undefined Behavior: `simd_extract` index 4 is out-of-bounds of vector with length 4
|
||||
--> $DIR/simd-extract.rs:LL:CC
|
||||
|
|
||||
LL | let _x: i32 = unsafe { std::intrinsics::simd::simd_extract(v, 4) };
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `simd_extract` index 4 is out-of-bounds of vector with length 4
|
||||
|
|
||||
= help: this indicates a bug in the program: it performed an invalid operation, and caused Undefined Behavior
|
||||
= help: see https://doc.rust-lang.org/nightly/reference/behavior-considered-undefined.html for further information
|
||||
= note: BACKTRACE:
|
||||
= note: inside `main` at $DIR/simd-extract.rs:LL:CC
|
||||
|
||||
note: some details are omitted, run with `MIRIFLAGS=-Zmiri-backtrace=full` for a verbose backtrace
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
@ -5,7 +5,6 @@
|
||||
//@ compile-flags: --crate-type=lib -O -C llvm-args=-x86-asm-syntax=intel
|
||||
//@ only-x86_64
|
||||
//@ ignore-sgx
|
||||
//@ ignore-debug
|
||||
|
||||
use std::cmp::Ordering;
|
||||
|
||||
|
@ -5,7 +5,6 @@
|
||||
//@ compile-flags: --crate-type=lib -O -C llvm-args=-x86-asm-syntax=intel
|
||||
//@ only-x86_64
|
||||
//@ ignore-sgx
|
||||
//@ ignore-debug
|
||||
|
||||
#![feature(str_internals)]
|
||||
|
||||
|
@ -6,7 +6,6 @@
|
||||
//@ [A64] needs-llvm-components: aarch64
|
||||
//@ [ppc64le] compile-flags: --target powerpc64le-unknown-linux-gnu -Crelocation-model=static
|
||||
//@ [ppc64le] needs-llvm-components: powerpc
|
||||
//@ ignore-debug: alignment checks insert panics that we don't have a lang item for
|
||||
|
||||
#![feature(no_core, lang_items)]
|
||||
#![no_core]
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug (debug assertions in `slice::from_raw_parts` block optimizations)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -C opt-level=3 -C target-cpu=x86-64-v3
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -C opt-level=1
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(ascii_char)]
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// Make sure no bounds checks are emitted when slicing or indexing
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -C opt-level=z --edition=2021
|
||||
//@ ignore-debug
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -C opt-level=3
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ min-llvm-version: 17.0.2
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
#![crate_type = "lib"]
|
||||
|
||||
/// Make sure no bounds checks are emitted after a `get_unchecked`.
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O -Zmerge-functions=disabled
|
||||
//@ ignore-32bit LLVM has a bug with them
|
||||
//@ ignore-debug
|
||||
|
||||
// Check that LLVM understands that `Iter` pointer is not null. Issue #37945.
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
||||
|
@ -2,7 +2,6 @@
|
||||
// prevent optimizing away bounds checks
|
||||
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type="rlib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// Make sure no bounds checks are emitted in the loop when upfront slicing
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// Make sure no bounds checks are emitted when slicing or indexing
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: The debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(iter_repeat_n)]
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
//@ only-x86_64 (vectorization varies between architectures)
|
||||
#![crate_type = "lib"]
|
||||
|
@ -4,7 +4,7 @@
|
||||
// known to be `1` after inlining).
|
||||
|
||||
//@ compile-flags: -C no-prepopulate-passes -Zinline-mir=no
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ ignore-debug: precondition checks in ptr::read make them a bad candidate for MIR inlining
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
//@ compile-flags: -O -C no-prepopulate-passes
|
||||
//@ only-x86_64 (to not worry about usize differing)
|
||||
//@ ignore-debug (the debug assertions get in the way)
|
||||
//@ ignore-debug: precondition checks make mem::replace not a candidate for MIR inlining
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
//@ revisions: llvm mir-opt3
|
||||
//@ compile-flags: -C opt-level=3 -Z merge-functions=disabled --edition=2021
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ [mir-opt3]compile-flags: -Zmir-opt-level=3
|
||||
//@ [mir-opt3]build-pass
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O -C target-feature=+avx
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-64bit (because the LLVM type of i64 for usize shows up)
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(slice_as_chunks)]
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-64bit (because the LLVM type of i64 for usize shows up)
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions add extra comparisons
|
||||
#![crate_type = "lib"]
|
||||
|
||||
type Demo = [u8; 3];
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug (these add extra checks that make it hard to verify)
|
||||
#![crate_type = "lib"]
|
||||
#![feature(exact_size_is_empty)]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O -Zmerge-functions=disabled
|
||||
//@ ignore-debug (the extra assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions in from_raw_parts get in the way
|
||||
//@ ignore-debug: debug assertions prevent generating shufflevector
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-64bit (because we're using [ui]size)
|
||||
//@ ignore-debug (because the assertions get in the way)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(slice_from_ptr_range)]
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
//@ ignore-debug
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug (because unchecked is checked in debug)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
#![feature(unchecked_shifts)]
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ min-llvm-version: 17.0.2
|
||||
//@ compile-flags: -Copt-level=3
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
#![crate_type = "lib"]
|
||||
|
||||
// This test checks that we can inline drop_in_place in
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
//@ only-x86_64
|
||||
//@ ignore-debug
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ ignore-debug: FIXME: checks for call detect scoped noalias metadata
|
||||
//@ compile-flags: -O -Z merge-functions=disabled
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
#![crate_type="lib"]
|
||||
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
#![feature(exact_size_is_empty)]
|
||||
|
@ -1,4 +1,3 @@
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug
|
||||
// (with debug assertions turned on, `assert_unchecked` generates a real assertion)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -4,7 +4,7 @@
|
||||
//@ [old]ignore-llvm-version: 17 - 99
|
||||
//@ [new]min-llvm-version: 17
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ ignore-debug: plain old debug assertions
|
||||
//@ needs-unwind
|
||||
#![crate_type = "lib"]
|
||||
#![feature(shrink_to)]
|
||||
|
@ -1,6 +1,4 @@
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug
|
||||
// (with debug assertions turned on, `assert_unchecked` generates a real assertion)
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Check that draining at the front or back doesn't copy memory.
|
||||
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ ignore-debug: FIXME: checks for call detect scoped noalias metadata
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,7 +1,6 @@
|
||||
// Guards against regression for optimization discussed in issue #80836
|
||||
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// This test checks that `VecDeque::front[_mut]()` and `VecDeque::back[_mut]()` can't panic.
|
||||
|
||||
//@ compile-flags: -O
|
||||
//@ ignore-debug: the debug assertions get in the way
|
||||
//@ ignore-debug: plain old debug assertions
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,5 @@
|
||||
//@ compile-flags: -Zvirtual-function-elimination -Clto -O -Csymbol-mangling-version=v0
|
||||
//@ ignore-32bit
|
||||
//@ ignore-debug
|
||||
|
||||
// CHECK: @vtable.0 = {{.*}}, !type ![[TYPE0:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]]
|
||||
// CHECK: @vtable.1 = {{.*}}, !type ![[TYPE1:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]]
|
||||
|
@ -1,6 +1,5 @@
|
||||
// skip-filecheck
|
||||
//@ compile-flags: -O -Zmir-opt-level=2 -Cdebuginfo=2
|
||||
//@ ignore-debug: standard library debug assertions add a panic that breaks this optimization
|
||||
|
||||
#![crate_type = "lib"]
|
||||
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `variant_a::{closure#0}` after PreCodegen
|
||||
|
||||
fn variant_a::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:8:25: 8:39}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
fn variant_a::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:7:25: 7:39}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
let mut _0: bool;
|
||||
let mut _3: &(usize, usize, usize, usize);
|
||||
let _4: &usize;
|
||||
|
@ -1,6 +1,6 @@
|
||||
// MIR for `variant_b::{closure#0}` after PreCodegen
|
||||
|
||||
fn variant_b::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:12:25: 12:41}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
fn variant_b::{closure#0}(_1: &mut {closure@$DIR/slice_filter.rs:11:25: 11:41}, _2: &&(usize, usize, usize, usize)) -> bool {
|
||||
let mut _0: bool;
|
||||
let mut _3: &(usize, usize, usize, usize);
|
||||
let _4: usize;
|
||||
|
@ -6,8 +6,6 @@ LL | async fn foo() -> &'static impl T;
|
||||
| |
|
||||
| the associated type `<Self as MyTrait>::{opaque#0}` must be valid for the static lifetime...
|
||||
| ...so that the reference type `&'static impl T` does not outlive the data it points at
|
||||
|
|
||||
= help: consider adding an explicit lifetime bound `<Self as MyTrait>::{opaque#0}: 'static`...
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -0,0 +1,16 @@
|
||||
trait Original {
|
||||
fn f() -> impl Fn();
|
||||
}
|
||||
|
||||
trait Erased {
|
||||
fn f(&self) -> Box<dyn Fn()>;
|
||||
}
|
||||
|
||||
impl<T: Original> Erased for T {
|
||||
fn f(&self) -> Box<dyn Fn()> {
|
||||
Box::new(<T as Original>::f())
|
||||
//~^ ERROR the associated type `<T as Original>::{opaque#0}` may not live long enough
|
||||
}
|
||||
}
|
||||
|
||||
fn main () {}
|
@ -0,0 +1,12 @@
|
||||
error[E0310]: the associated type `<T as Original>::{opaque#0}` may not live long enough
|
||||
--> $DIR/missing-static-bound-from-impl.rs:11:9
|
||||
|
|
||||
LL | Box::new(<T as Original>::f())
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| the associated type `<T as Original>::{opaque#0}` must be valid for the static lifetime...
|
||||
| ...so that the type `impl Fn()` will meet its required lifetime bounds
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0310`.
|
@ -1,6 +1,6 @@
|
||||
//@ build-fail
|
||||
#![allow(non_camel_case_types)]
|
||||
#![feature(repr_simd, platform_intrinsics)]
|
||||
#![feature(repr_simd, core_intrinsics)]
|
||||
|
||||
// Test for #73542 to verify out-of-bounds shuffle vectors do not compile.
|
||||
|
||||
@ -28,9 +28,7 @@ struct u8x32([u8; 32]);
|
||||
#[derive(Copy, Clone)]
|
||||
struct u8x64([u8; 64]);
|
||||
|
||||
extern "platform-intrinsic" {
|
||||
pub fn simd_shuffle<T, I, U>(x: T, y: T, idx: I) -> U;
|
||||
}
|
||||
use std::intrinsics::simd::*;
|
||||
|
||||
// Test vectors by lane size. Since LLVM does not distinguish between a shuffle
|
||||
// over two f32s and a shuffle over two u64s, or any other such combination,
|
||||
@ -70,13 +68,16 @@ fn main() {
|
||||
test_shuffle_lanes!(32, u8x32, simd_shuffle);
|
||||
test_shuffle_lanes!(64, u8x64, simd_shuffle);
|
||||
|
||||
extern "platform-intrinsic" {
|
||||
fn simd_shuffle<T, I, U>(a: T, b: T, i: I) -> U;
|
||||
}
|
||||
let v = u8x2([0, 0]);
|
||||
const I: [u32; 2] = [4, 4];
|
||||
unsafe {
|
||||
let _: u8x2 = simd_shuffle(v, v, I);
|
||||
//~^ ERROR invalid monomorphization of `simd_shuffle` intrinsic
|
||||
}
|
||||
|
||||
// also check insert/extract
|
||||
unsafe {
|
||||
simd_insert(v, 2, 0); //~ ERROR invalid monomorphization of `simd_insert` intrinsic
|
||||
let _val: u8 = simd_extract(v, 2); //~ ERROR invalid monomorphization of `simd_extract` intrinsic
|
||||
}
|
||||
}
|
@ -1,5 +1,5 @@
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 4)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 4)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -9,8 +9,8 @@ LL | test_shuffle_lanes!(2, u8x2, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 8)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 8)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -20,8 +20,8 @@ LL | test_shuffle_lanes!(4, u8x4, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 16)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 16)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -31,8 +31,8 @@ LL | test_shuffle_lanes!(8, u8x8, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 32)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 32)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -42,8 +42,8 @@ LL | test_shuffle_lanes!(16, u8x16, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 64)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 64)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -53,8 +53,8 @@ LL | test_shuffle_lanes!(32, u8x32, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 128)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:51:21
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 128)
|
||||
--> $DIR/not-out-of-bounds.rs:49:21
|
||||
|
|
||||
LL | $y(vec1, vec2, ARR)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
@ -64,12 +64,24 @@ LL | test_shuffle_lanes!(64, u8x64, simd_shuffle);
|
||||
|
|
||||
= note: this error originates in the macro `test_shuffle_lanes` (in Nightly builds, run with -Z macro-backtrace for more info)
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: shuffle index #0 is out of bounds (limit 4)
|
||||
--> $DIR/shuffle-not-out-of-bounds.rs:79:23
|
||||
error[E0511]: invalid monomorphization of `simd_shuffle` intrinsic: SIMD index #0 is out of bounds (limit 4)
|
||||
--> $DIR/not-out-of-bounds.rs:74:23
|
||||
|
|
||||
LL | let _: u8x2 = simd_shuffle(v, v, I);
|
||||
| ^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected inserted type `u8` (element of input `u8x2`), found `i32`
|
||||
--> $DIR/not-out-of-bounds.rs:80:9
|
||||
|
|
||||
LL | simd_insert(v, 2, 0);
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error[E0511]: invalid monomorphization of `simd_extract` intrinsic: SIMD index #1 is out of bounds (limit 2)
|
||||
--> $DIR/not-out-of-bounds.rs:81:24
|
||||
|
|
||||
LL | let _val: u8 = simd_extract(v, 2);
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
|
||||
For more information about this error, try `rustc --explain E0511`.
|
Loading…
Reference in New Issue
Block a user