Rollup merge of #101038 - RalfJung:interning-alignment, r=oli-obk
no alignment check during interning This should fix https://github.com/rust-lang/rust/issues/101034 r? `@oli-obk` Unfortunately we don't have a self-contained testcase for this problem. I am not sure how it can be triggered...
This commit is contained in:
commit
5b8081490f
3 changed files with 22 additions and 3 deletions
|
@ -74,7 +74,9 @@ fn eval_body_using_ecx<'mir, 'tcx>(
|
||||||
None => InternKind::Constant,
|
None => InternKind::Constant,
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
ecx.machine.check_alignment = false; // interning doesn't need to respect alignment
|
||||||
intern_const_alloc_recursive(ecx, intern_kind, &ret)?;
|
intern_const_alloc_recursive(ecx, intern_kind, &ret)?;
|
||||||
|
// we leave alignment checks off, since this `ecx` will not be used for further evaluation anyway
|
||||||
|
|
||||||
debug!("eval_body_using_ecx done: {:?}", *ret);
|
debug!("eval_body_using_ecx done: {:?}", *ret);
|
||||||
Ok(ret)
|
Ok(ret)
|
||||||
|
|
|
@ -89,10 +89,10 @@ pub struct CompileTimeInterpreter<'mir, 'tcx> {
|
||||||
/// exhaustion error.
|
/// exhaustion error.
|
||||||
///
|
///
|
||||||
/// Setting this to `0` disables the limit and allows the interpreter to run forever.
|
/// Setting this to `0` disables the limit and allows the interpreter to run forever.
|
||||||
pub steps_remaining: usize,
|
pub(super) steps_remaining: usize,
|
||||||
|
|
||||||
/// The virtual call stack.
|
/// The virtual call stack.
|
||||||
pub(crate) stack: Vec<Frame<'mir, 'tcx, AllocId, ()>>,
|
pub(super) stack: Vec<Frame<'mir, 'tcx, AllocId, ()>>,
|
||||||
|
|
||||||
/// We need to make sure consts never point to anything mutable, even recursively. That is
|
/// We need to make sure consts never point to anything mutable, even recursively. That is
|
||||||
/// relied on for pattern matching on consts with references.
|
/// relied on for pattern matching on consts with references.
|
||||||
|
@ -103,7 +103,7 @@ pub struct CompileTimeInterpreter<'mir, 'tcx> {
|
||||||
pub(super) can_access_statics: bool,
|
pub(super) can_access_statics: bool,
|
||||||
|
|
||||||
/// Whether to check alignment during evaluation.
|
/// Whether to check alignment during evaluation.
|
||||||
check_alignment: bool,
|
pub(super) check_alignment: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx> {
|
impl<'mir, 'tcx> CompileTimeInterpreter<'mir, 'tcx> {
|
||||||
|
|
17
src/test/ui/consts/extra-const-ub/issue-101034.rs
Normal file
17
src/test/ui/consts/extra-const-ub/issue-101034.rs
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
// check-pass
|
||||||
|
// compile-flags: -Zextra-const-ub-checks
|
||||||
|
|
||||||
|
#[repr(packed)]
|
||||||
|
pub struct Foo {
|
||||||
|
bar: u8,
|
||||||
|
baa: [u32; 1],
|
||||||
|
}
|
||||||
|
|
||||||
|
const FOOMP: Foo = Foo {
|
||||||
|
bar: 0,
|
||||||
|
baa: [69; 1],
|
||||||
|
};
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let _val = FOOMP;
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue