Auto merge of #98936 - matthiaskrgr:rollup-dvr0ucm, r=matthiaskrgr
Rollup of 6 pull requests Successful merges: - #98860 (adjust dangling-int-ptr error message) - #98888 (interpret: fix CheckedBinOp behavior when overflow checking is disabled) - #98889 (Add regression test for #79467) - #98895 (bootstrap.py: Always use `.exe` for Windows) - #98920 (adapt issue-37945 codegen test to accept any order of ops) - #98921 (Refactor: remove a redundant mutable variable) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
This commit is contained in:
commit
41ad4d9b2d
@ -217,7 +217,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
sym::mul_with_overflow => BinOp::Mul,
|
||||
_ => bug!(),
|
||||
};
|
||||
self.binop_with_overflow(bin_op, &lhs, &rhs, dest)?;
|
||||
self.binop_with_overflow(
|
||||
bin_op, /*force_overflow_checks*/ true, &lhs, &rhs, dest,
|
||||
)?;
|
||||
}
|
||||
sym::saturating_add | sym::saturating_sub => {
|
||||
let l = self.read_immediate(&args[0])?;
|
||||
|
@ -144,6 +144,9 @@ pub trait Machine<'mir, 'tcx>: Sized {
|
||||
true
|
||||
}
|
||||
|
||||
/// Whether CheckedBinOp MIR statements should actually check for overflow.
|
||||
fn check_binop_checks_overflow(_ecx: &InterpCx<'mir, 'tcx, Self>) -> bool;
|
||||
|
||||
/// Entry point for obtaining the MIR of anything that should get evaluated.
|
||||
/// So not just functions and shims, but also const/static initializers, anonymous
|
||||
/// constants, ...
|
||||
@ -468,6 +471,11 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
|
||||
true
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn check_binop_checks_overflow(_ecx: &InterpCx<$mir, $tcx, Self>) -> bool {
|
||||
true
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
fn call_extra_fn(
|
||||
_ecx: &mut InterpCx<$mir, $tcx, Self>,
|
||||
@ -513,7 +521,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
|
||||
_ecx: &InterpCx<$mir, $tcx, Self>,
|
||||
addr: u64,
|
||||
) -> Pointer<Option<AllocId>> {
|
||||
Pointer::new(None, Size::from_bytes(addr))
|
||||
Pointer::from_addr(addr)
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
@ -523,7 +531,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) {
|
||||
) -> InterpResult<$tcx, Pointer<Option<AllocId>>> {
|
||||
// Allow these casts, but make the pointer not dereferenceable.
|
||||
// (I.e., they behave like transmutation.)
|
||||
Ok(Pointer::new(None, Size::from_bytes(addr)))
|
||||
Ok(Pointer::from_addr(addr))
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
|
@ -12,9 +12,13 @@ use super::{ImmTy, Immediate, InterpCx, Machine, PlaceTy};
|
||||
impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
/// Applies the binary operation `op` to the two operands and writes a tuple of the result
|
||||
/// and a boolean signifying the potential overflow to the destination.
|
||||
///
|
||||
/// `force_overflow_checks` indicates whether overflow checks should be done even when
|
||||
/// `tcx.sess.overflow_checks()` is `false`.
|
||||
pub fn binop_with_overflow(
|
||||
&mut self,
|
||||
op: mir::BinOp,
|
||||
force_overflow_checks: bool,
|
||||
left: &ImmTy<'tcx, M::PointerTag>,
|
||||
right: &ImmTy<'tcx, M::PointerTag>,
|
||||
dest: &PlaceTy<'tcx, M::PointerTag>,
|
||||
@ -26,6 +30,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
"type mismatch for result of {:?}",
|
||||
op,
|
||||
);
|
||||
// As per https://github.com/rust-lang/rust/pull/98738, we always return `false` in the 2nd
|
||||
// component when overflow checking is disabled.
|
||||
let overflowed =
|
||||
overflowed && (force_overflow_checks || M::check_binop_checks_overflow(self));
|
||||
// Write the result to `dest`.
|
||||
if let Abi::ScalarPair(..) = dest.layout.abi {
|
||||
// We can use the optimized path and avoid `place_field` (which might do
|
||||
// `force_allocation`).
|
||||
|
@ -188,7 +188,7 @@ impl<'tcx, Tag: Provenance> MPlaceTy<'tcx, Tag> {
|
||||
#[inline]
|
||||
pub fn dangling(layout: TyAndLayout<'tcx>) -> Self {
|
||||
let align = layout.align.abi;
|
||||
let ptr = Pointer::new(None, Size::from_bytes(align.bytes())); // no provenance, absolute address
|
||||
let ptr = Pointer::from_addr(align.bytes()); // no provenance, absolute address
|
||||
// `Poison` this to make sure that the pointer value `ptr` is never observable by the program.
|
||||
MPlaceTy { mplace: MemPlace { ptr, meta: MemPlaceMeta::Poison }, layout, align }
|
||||
}
|
||||
|
@ -185,7 +185,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
|
||||
let left = self.read_immediate(&self.eval_operand(left, None)?)?;
|
||||
let layout = binop_right_homogeneous(bin_op).then_some(left.layout);
|
||||
let right = self.read_immediate(&self.eval_operand(right, layout)?)?;
|
||||
self.binop_with_overflow(bin_op, &left, &right, &dest)?;
|
||||
self.binop_with_overflow(
|
||||
bin_op, /*force_overflow_checks*/ false, &left, &right, &dest,
|
||||
)?;
|
||||
}
|
||||
|
||||
UnaryOp(un_op, ref operand) => {
|
||||
|
@ -186,7 +186,7 @@ pub enum CheckInAllocMsg {
|
||||
|
||||
impl fmt::Display for CheckInAllocMsg {
|
||||
/// When this is printed as an error the context looks like this:
|
||||
/// "{msg}0x01 is not a valid pointer".
|
||||
/// "{msg}{pointer} is a dangling pointer".
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
write!(
|
||||
f,
|
||||
@ -194,9 +194,9 @@ impl fmt::Display for CheckInAllocMsg {
|
||||
match *self {
|
||||
CheckInAllocMsg::DerefTest => "dereferencing pointer failed: ",
|
||||
CheckInAllocMsg::MemoryAccessTest => "memory access failed: ",
|
||||
CheckInAllocMsg::PointerArithmeticTest => "pointer arithmetic failed: ",
|
||||
CheckInAllocMsg::PointerArithmeticTest => "out-of-bounds pointer arithmetic: ",
|
||||
CheckInAllocMsg::OffsetFromTest => "out-of-bounds offset_from: ",
|
||||
CheckInAllocMsg::InboundsTest => "",
|
||||
CheckInAllocMsg::InboundsTest => "out-of-bounds pointer use: ",
|
||||
}
|
||||
)
|
||||
}
|
||||
@ -350,14 +350,12 @@ impl fmt::Display for UndefinedBehaviorInfo<'_> {
|
||||
ptr_size = ptr_size.bytes(),
|
||||
ptr_size_p = pluralize!(ptr_size.bytes()),
|
||||
),
|
||||
DanglingIntPointer(0, CheckInAllocMsg::InboundsTest) => {
|
||||
write!(f, "null pointer is not a valid pointer for this operation")
|
||||
}
|
||||
DanglingIntPointer(0, msg) => {
|
||||
write!(f, "{msg}null pointer is not a valid pointer")
|
||||
}
|
||||
DanglingIntPointer(i, msg) => {
|
||||
write!(f, "{msg}{i:#x} is not a valid pointer")
|
||||
write!(
|
||||
f,
|
||||
"{msg}{pointer} is a dangling pointer (it has no provenance)",
|
||||
pointer = Pointer::<Option<AllocId>>::from_addr(*i),
|
||||
)
|
||||
}
|
||||
AlignmentCheckFailed { required, has } => write!(
|
||||
f,
|
||||
|
@ -181,7 +181,17 @@ impl<Tag: Provenance> fmt::Debug for Pointer<Option<Tag>> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
match self.provenance {
|
||||
Some(tag) => Provenance::fmt(&Pointer::new(tag, self.offset), f),
|
||||
None => write!(f, "{:#x}", self.offset.bytes()),
|
||||
None => write!(f, "{:#x}[noalloc]", self.offset.bytes()),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<Tag: Provenance> fmt::Display for Pointer<Option<Tag>> {
|
||||
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if self.provenance.is_none() && self.offset.bytes() == 0 {
|
||||
write!(f, "null pointer")
|
||||
} else {
|
||||
fmt::Debug::fmt(self, f)
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -226,9 +236,14 @@ impl<Tag> Pointer<Option<Tag>> {
|
||||
}
|
||||
|
||||
impl<Tag> Pointer<Option<Tag>> {
|
||||
#[inline(always)]
|
||||
pub fn from_addr(addr: u64) -> Self {
|
||||
Pointer { provenance: None, offset: Size::from_bytes(addr) }
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn null() -> Self {
|
||||
Pointer { provenance: None, offset: Size::ZERO }
|
||||
Pointer::from_addr(0)
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -993,8 +993,9 @@ pub enum Rvalue<'tcx> {
|
||||
|
||||
/// Same as `BinaryOp`, but yields `(T, bool)` with a `bool` indicating an error condition.
|
||||
///
|
||||
/// When overflow checking is disabled, the error condition is false. Otherwise, the error
|
||||
/// condition is determined as described below.
|
||||
/// When overflow checking is disabled and we are generating run-time code, the error condition
|
||||
/// is false. Otherwise, and always during CTFE, the error condition is determined as described
|
||||
/// below.
|
||||
///
|
||||
/// For addition, subtraction, and multiplication on integers the error condition is set when
|
||||
/// the infinite precision result would be unequal to the actual result.
|
||||
|
@ -131,8 +131,6 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> {
|
||||
let span = debug_span!("select", obligation_forest_size = ?self.predicates.len());
|
||||
let _enter = span.enter();
|
||||
|
||||
let mut errors = Vec::new();
|
||||
|
||||
// Process pending obligations.
|
||||
let outcome: Outcome<_, _> = self.predicates.process_obligations(&mut FulfillProcessor {
|
||||
selcx,
|
||||
@ -142,7 +140,8 @@ impl<'a, 'tcx> FulfillmentContext<'tcx> {
|
||||
// FIXME: if we kept the original cache key, we could mark projection
|
||||
// obligations as complete for the projection cache here.
|
||||
|
||||
errors.extend(outcome.errors.into_iter().map(to_fulfillment_error));
|
||||
let errors: Vec<FulfillmentError<'tcx>> =
|
||||
outcome.errors.into_iter().map(to_fulfillment_error).collect();
|
||||
|
||||
debug!(
|
||||
"select({} predicates remaining, {} errors) done",
|
||||
@ -728,7 +727,7 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> {
|
||||
}
|
||||
return ProcessResult::Changed(vec![]);
|
||||
} else {
|
||||
tracing::debug!("Does NOT hold: {:?}", obligation);
|
||||
debug!("Does NOT hold: {:?}", obligation);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -152,6 +152,10 @@ def run(args, verbose=False, exception=False, is_bootstrap=False, **kwargs):
|
||||
if verbose:
|
||||
print("running: " + ' '.join(args))
|
||||
sys.stdout.flush()
|
||||
# Ensure that the .exe is used on Windows just in case a Linux ELF has been
|
||||
# compiled in the same directory.
|
||||
if os.name == 'nt' and not args[0].endswith('.exe'):
|
||||
args[0] += '.exe'
|
||||
# Use Popen here instead of call() as it apparently allows powershell on
|
||||
# Windows to not lock up waiting for input presumably.
|
||||
ret = subprocess.Popen(args, **kwargs)
|
||||
|
@ -17,7 +17,9 @@ pub fn is_empty_1(xs: Iter<f32>) -> bool {
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: [[A:%.*]] = icmp ne {{i32\*|ptr}} %xs.1, null
|
||||
// CHECK-NEXT: tail call void @llvm.assume(i1 [[A]])
|
||||
// CHECK-NEXT: [[B:%.*]] = icmp eq {{i32\*|ptr}} %xs.1, %xs.0
|
||||
// The order between %xs.0 and %xs.1 on the next line doesn't matter
|
||||
// and different LLVM versions produce different order.
|
||||
// CHECK-NEXT: [[B:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}}
|
||||
// CHECK-NEXT: ret i1 [[B:%.*]]
|
||||
{xs}.next().is_none()
|
||||
}
|
||||
@ -28,7 +30,9 @@ pub fn is_empty_2(xs: Iter<f32>) -> bool {
|
||||
// CHECK-NEXT: start:
|
||||
// CHECK-NEXT: [[C:%.*]] = icmp ne {{i32\*|ptr}} %xs.1, null
|
||||
// CHECK-NEXT: tail call void @llvm.assume(i1 [[C]])
|
||||
// CHECK-NEXT: [[D:%.*]] = icmp eq {{i32\*|ptr}} %xs.1, %xs.0
|
||||
// The order between %xs.0 and %xs.1 on the next line doesn't matter
|
||||
// and different LLVM versions produce different order.
|
||||
// CHECK-NEXT: [[D:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}}
|
||||
// CHECK-NEXT: ret i1 [[D:%.*]]
|
||||
xs.map(|&x| x).next().is_none()
|
||||
}
|
||||
|
8
src/test/rustdoc-ui/issue-79467.rs
Normal file
8
src/test/rustdoc-ui/issue-79467.rs
Normal file
@ -0,0 +1,8 @@
|
||||
fn g()
|
||||
where
|
||||
'static: 'static,
|
||||
dyn 'static: 'static + Copy, //~ ERROR at least one trait is required for an object type
|
||||
{
|
||||
}
|
||||
|
||||
fn main() {}
|
9
src/test/rustdoc-ui/issue-79467.stderr
Normal file
9
src/test/rustdoc-ui/issue-79467.stderr
Normal file
@ -0,0 +1,9 @@
|
||||
error[E0224]: at least one trait is required for an object type
|
||||
--> $DIR/issue-79467.rs:4:5
|
||||
|
|
||||
LL | dyn 'static: 'static + Copy,
|
||||
| ^^^^^^^^^^^
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0224`.
|
@ -4,7 +4,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | &*ptr::slice_from_raw_parts(data, len)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| dereferencing pointer failed: null pointer is not a valid pointer
|
||||
| dereferencing pointer failed: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `std::slice::from_raw_parts::<u32>` at $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
|
|
||||
::: $DIR/forbidden_slices.rs:19:34
|
||||
@ -18,7 +18,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | &*ptr::slice_from_raw_parts(data, len)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| dereferencing pointer failed: null pointer is not a valid pointer
|
||||
| dereferencing pointer failed: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `std::slice::from_raw_parts::<()>` at $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
|
|
||||
::: $DIR/forbidden_slices.rs:20:33
|
||||
@ -104,7 +104,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::ptr_offset_from_unsigned(self, origin) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| out-of-bounds offset_from: null pointer is not a valid pointer
|
||||
| out-of-bounds offset_from: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `ptr::const_ptr::<impl *const u32>::sub_ptr` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
@ -144,7 +144,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: ALLOC_ID has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: ALLOC_ID has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u32>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
...
|
||||
LL | unsafe { self.offset(count as isize) }
|
||||
@ -205,7 +205,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: ALLOC_ID has size 8, so pointer to 8 bytes starting at offset 1 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: ALLOC_ID has size 8, so pointer to 8 bytes starting at offset 1 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u64>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
...
|
||||
LL | unsafe { self.offset(count as isize) }
|
||||
|
@ -4,7 +4,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | &*ptr::slice_from_raw_parts(data, len)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| dereferencing pointer failed: null pointer is not a valid pointer
|
||||
| dereferencing pointer failed: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `std::slice::from_raw_parts::<u32>` at $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
|
|
||||
::: $DIR/forbidden_slices.rs:19:34
|
||||
@ -18,7 +18,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | &*ptr::slice_from_raw_parts(data, len)
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| dereferencing pointer failed: null pointer is not a valid pointer
|
||||
| dereferencing pointer failed: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `std::slice::from_raw_parts::<()>` at $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
|
|
||||
::: $DIR/forbidden_slices.rs:20:33
|
||||
@ -104,7 +104,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::ptr_offset_from_unsigned(self, origin) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| out-of-bounds offset_from: null pointer is not a valid pointer
|
||||
| out-of-bounds offset_from: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `ptr::const_ptr::<impl *const u32>::sub_ptr` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $SRC_DIR/core/src/slice/raw.rs:LL:COL
|
||||
@ -144,7 +144,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: ALLOC_ID has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: ALLOC_ID has size 4, so pointer to 8 bytes starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u32>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
...
|
||||
LL | unsafe { self.offset(count as isize) }
|
||||
@ -205,7 +205,7 @@ error[E0080]: could not evaluate static initializer
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: ALLOC_ID has size 8, so pointer to 8 bytes starting at offset 1 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: ALLOC_ID has size 8, so pointer to 8 bytes starting at offset 1 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u64>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
...
|
||||
LL | unsafe { self.offset(count as isize) }
|
||||
|
@ -2,7 +2,7 @@ error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/const-deref-ptr.rs:4:29
|
||||
|
|
||||
LL | static C: u64 = unsafe {*(0xdeadbeef as *const u64)};
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0xdeadbeef is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0xdeadbeef[noalloc] is a dangling pointer (it has no provenance)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
@ -5,6 +5,6 @@ const Z: i32 = unsafe { *(&1 as *const i32) };
|
||||
|
||||
// bad, will thus error in miri
|
||||
const Z2: i32 = unsafe { *(42 as *const i32) }; //~ ERROR evaluation of constant value failed
|
||||
//~| is not a valid pointer
|
||||
//~| is a dangling pointer
|
||||
const Z3: i32 = unsafe { *(44 as *const i32) }; //~ ERROR evaluation of constant value failed
|
||||
//~| is not a valid pointer
|
||||
//~| is a dangling pointer
|
||||
|
@ -2,13 +2,13 @@ error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/const_raw_ptr_ops2.rs:7:26
|
||||
|
|
||||
LL | const Z2: i32 = unsafe { *(42 as *const i32) };
|
||||
| ^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0x2a is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0x2a[noalloc] is a dangling pointer (it has no provenance)
|
||||
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/const_raw_ptr_ops2.rs:9:26
|
||||
|
|
||||
LL | const Z3: i32 = unsafe { *(44 as *const i32) };
|
||||
| ^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0x2c is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^ dereferencing pointer failed: 0x2c[noalloc] is a dangling pointer (it has no provenance)
|
||||
|
||||
error: aborting due to 2 previous errors
|
||||
|
||||
|
@ -319,7 +319,7 @@ error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/ub-wide-ptr.rs:147:5
|
||||
|
|
||||
LL | mem::transmute::<_, &dyn Trait>((&92u8, 0usize))
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: null pointer is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: null pointer is a dangling pointer (it has no provenance)
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/ub-wide-ptr.rs:151:5
|
||||
|
@ -319,7 +319,7 @@ error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/ub-wide-ptr.rs:147:5
|
||||
|
|
||||
LL | mem::transmute::<_, &dyn Trait>((&92u8, 0usize))
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: null pointer is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: null pointer is a dangling pointer (it has no provenance)
|
||||
|
||||
error[E0080]: could not evaluate static initializer
|
||||
--> $DIR/ub-wide-ptr.rs:151:5
|
||||
|
@ -11,7 +11,7 @@ const fn helper() -> Option<&'static mut i32> { unsafe {
|
||||
// Undefined behaviour (integer as pointer), who doesn't love tests like this.
|
||||
// This code never gets executed, because the static checks fail before that.
|
||||
Some(&mut *(42 as *mut i32)) //~ ERROR evaluation of constant value failed
|
||||
//~| 0x2a is not a valid pointer
|
||||
//~| 0x2a[noalloc] is a dangling pointer
|
||||
} }
|
||||
// The error is an evaluation error and not a validation error, so the error is reported
|
||||
// directly at the site where it occurs.
|
||||
|
@ -4,7 +4,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | Some(&mut *(42 as *mut i32))
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| dereferencing pointer failed: 0x2a is not a valid pointer
|
||||
| dereferencing pointer failed: 0x2a[noalloc] is a dangling pointer (it has no provenance)
|
||||
| inside `helper` at $DIR/mut_ref_in_final_dynamic_check.rs:13:10
|
||||
...
|
||||
LL | const A: Option<&mut i32> = helper();
|
||||
|
@ -34,14 +34,14 @@ pub const NOT_MULTIPLE_OF_SIZE: isize = {
|
||||
pub const OFFSET_FROM_NULL: isize = {
|
||||
let ptr = 0 as *const u8;
|
||||
unsafe { ptr_offset_from(ptr, ptr) } //~ERROR evaluation of constant value failed
|
||||
//~| null pointer is not a valid pointer
|
||||
//~| null pointer is a dangling pointer
|
||||
};
|
||||
|
||||
pub const DIFFERENT_INT: isize = { // offset_from with two different integers: like DIFFERENT_ALLOC
|
||||
let ptr1 = 8 as *const u8;
|
||||
let ptr2 = 16 as *const u8;
|
||||
unsafe { ptr_offset_from(ptr2, ptr1) } //~ERROR evaluation of constant value failed
|
||||
//~| 0x8 is not a valid pointer
|
||||
//~| 0x8[noalloc] is a dangling pointer
|
||||
};
|
||||
|
||||
const OUT_OF_BOUNDS_1: isize = {
|
||||
|
@ -28,13 +28,13 @@ error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/offset_from_ub.rs:36:14
|
||||
|
|
||||
LL | unsafe { ptr_offset_from(ptr, ptr) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ out-of-bounds offset_from: null pointer is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ out-of-bounds offset_from: null pointer is a dangling pointer (it has no provenance)
|
||||
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/offset_from_ub.rs:43:14
|
||||
|
|
||||
LL | unsafe { ptr_offset_from(ptr2, ptr1) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ out-of-bounds offset_from: 0x8 is not a valid pointer
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^ out-of-bounds offset_from: 0x8[noalloc] is a dangling pointer (it has no provenance)
|
||||
|
||||
error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/offset_from_ub.rs:52:14
|
||||
|
@ -18,7 +18,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: allocN has size 1, so pointer to 2 bytes starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: allocN has size 1, so pointer to 2 bytes starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:8:43
|
||||
@ -32,7 +32,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: allocN has size 100, so pointer to 101 bytes starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: allocN has size 100, so pointer to 101 bytes starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:9:45
|
||||
@ -102,7 +102,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: allocN has size 1, so pointer to 2 bytes starting at offset -4 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: allocN has size 1, so pointer to 2 bytes starting at offset -4 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:15:49
|
||||
@ -116,7 +116,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: allocN has size 0, so pointer to 1 byte starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: allocN has size 0, so pointer to 1 byte starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:17:50
|
||||
@ -130,7 +130,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) as *mut T }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: 0x1 is not a valid pointer
|
||||
| out-of-bounds pointer arithmetic: 0x1[noalloc] is a dangling pointer (it has no provenance)
|
||||
| inside `ptr::mut_ptr::<impl *mut u8>::offset` at $SRC_DIR/core/src/ptr/mut_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:18:42
|
||||
@ -144,7 +144,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: null pointer is not a valid pointer
|
||||
| out-of-bounds pointer arithmetic: null pointer is a dangling pointer (it has no provenance)
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:21:50
|
||||
@ -158,7 +158,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: 0x7f..f is not a valid pointer
|
||||
| out-of-bounds pointer arithmetic: 0x7f..f[noalloc] is a dangling pointer (it has no provenance)
|
||||
| inside `ptr::const_ptr::<impl *const u8>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/offset_ub.rs:24:47
|
||||
|
@ -4,7 +4,7 @@ error[E0080]: evaluation of constant value failed
|
||||
LL | unsafe { intrinsics::offset(self, count) }
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
| |
|
||||
| pointer arithmetic failed: alloc3 has size $WORD, so pointer to $TWO_WORDS bytes starting at offset 0 is out-of-bounds
|
||||
| out-of-bounds pointer arithmetic: alloc3 has size $WORD, so pointer to $TWO_WORDS bytes starting at offset 0 is out-of-bounds
|
||||
| inside `ptr::const_ptr::<impl *const usize>::offset` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
|
||||
|
|
||||
::: $DIR/ptr_comparisons.rs:58:34
|
||||
|
@ -2,7 +2,7 @@ error[E0080]: evaluation of constant value failed
|
||||
--> $DIR/E0396-fixed.rs:5:28
|
||||
|
|
||||
LL | const VALUE: u8 = unsafe { *REG_ADDR };
|
||||
| ^^^^^^^^^ dereferencing pointer failed: 0x5f3759df is not a valid pointer
|
||||
| ^^^^^^^^^ dereferencing pointer failed: 0x5f3759df[noalloc] is a dangling pointer (it has no provenance)
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user