summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_const_eval/src/interpret/memory.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_const_eval/src/interpret/memory.rs')
-rw-r--r--compiler/rustc_const_eval/src/interpret/memory.rs63
1 files changed, 43 insertions, 20 deletions
diff --git a/compiler/rustc_const_eval/src/interpret/memory.rs b/compiler/rustc_const_eval/src/interpret/memory.rs
index d5b6a581a..1125d8d1f 100644
--- a/compiler/rustc_const_eval/src/interpret/memory.rs
+++ b/compiler/rustc_const_eval/src/interpret/memory.rs
@@ -19,6 +19,7 @@ use rustc_middle::ty::{self, Instance, ParamEnv, Ty, TyCtxt};
use rustc_target::abi::{Align, HasDataLayout, Size};
use crate::const_eval::CheckAlignment;
+use crate::fluent_generated as fluent;
use super::{
alloc_range, AllocBytes, AllocId, AllocMap, AllocRange, Allocation, CheckInAllocMsg,
@@ -200,7 +201,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
align: Align,
kind: MemoryKind<M::MemoryKind>,
) -> InterpResult<'tcx, Pointer<M::Provenance>> {
- let alloc = Allocation::uninit(size, align, M::PANIC_ON_ALLOC_FAIL)?;
+ let alloc = if M::PANIC_ON_ALLOC_FAIL {
+ Allocation::uninit(size, align)
+ } else {
+ Allocation::try_uninit(size, align)?
+ };
self.allocate_raw_ptr(alloc, kind)
}
@@ -242,9 +247,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
) -> InterpResult<'tcx, Pointer<M::Provenance>> {
let (alloc_id, offset, _prov) = self.ptr_get_alloc_id(ptr)?;
if offset.bytes() != 0 {
- throw_ub_format!(
- "reallocating {:?} which does not point to the beginning of an object",
- ptr
+ throw_ub_custom!(
+ fluent::const_eval_realloc_or_alloc_with_offset,
+ ptr = format!("{ptr:?}"),
+ kind = "realloc"
);
}
@@ -280,9 +286,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
trace!("deallocating: {alloc_id:?}");
if offset.bytes() != 0 {
- throw_ub_format!(
- "deallocating {:?} which does not point to the beginning of an object",
- ptr
+ throw_ub_custom!(
+ fluent::const_eval_realloc_or_alloc_with_offset,
+ ptr = format!("{ptr:?}"),
+ kind = "dealloc",
);
}
@@ -290,13 +297,25 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
// Deallocating global memory -- always an error
return Err(match self.tcx.try_get_global_alloc(alloc_id) {
Some(GlobalAlloc::Function(..)) => {
- err_ub_format!("deallocating {alloc_id:?}, which is a function")
+ err_ub_custom!(
+ fluent::const_eval_invalid_dealloc,
+ alloc_id = alloc_id,
+ kind = "fn",
+ )
}
Some(GlobalAlloc::VTable(..)) => {
- err_ub_format!("deallocating {alloc_id:?}, which is a vtable")
+ err_ub_custom!(
+ fluent::const_eval_invalid_dealloc,
+ alloc_id = alloc_id,
+ kind = "vtable",
+ )
}
Some(GlobalAlloc::Static(..) | GlobalAlloc::Memory(..)) => {
- err_ub_format!("deallocating {alloc_id:?}, which is static memory")
+ err_ub_custom!(
+ fluent::const_eval_invalid_dealloc,
+ alloc_id = alloc_id,
+ kind = "static_mem"
+ )
}
None => err_ub!(PointerUseAfterFree(alloc_id)),
}
@@ -304,21 +323,25 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
};
if alloc.mutability.is_not() {
- throw_ub_format!("deallocating immutable allocation {alloc_id:?}");
+ throw_ub_custom!(fluent::const_eval_dealloc_immutable, alloc = alloc_id,);
}
if alloc_kind != kind {
- throw_ub_format!(
- "deallocating {alloc_id:?}, which is {alloc_kind} memory, using {kind} deallocation operation"
+ throw_ub_custom!(
+ fluent::const_eval_dealloc_kind_mismatch,
+ alloc = alloc_id,
+ alloc_kind = format!("{alloc_kind}"),
+ kind = format!("{kind}"),
);
}
if let Some((size, align)) = old_size_and_align {
if size != alloc.size() || align != alloc.align {
- throw_ub_format!(
- "incorrect layout on deallocation: {alloc_id:?} has size {} and alignment {}, but gave size {} and alignment {}",
- alloc.size().bytes(),
- alloc.align.bytes(),
- size.bytes(),
- align.bytes(),
+ throw_ub_custom!(
+ fluent::const_eval_dealloc_incorrect_layout,
+ alloc = alloc_id,
+ size = alloc.size().bytes(),
+ align = alloc.align.bytes(),
+ size_found = size.bytes(),
+ align_found = align.bytes(),
)
}
}
@@ -1166,7 +1189,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
if (src_offset <= dest_offset && src_offset + size > dest_offset)
|| (dest_offset <= src_offset && dest_offset + size > src_offset)
{
- throw_ub_format!("copy_nonoverlapping called on overlapping ranges")
+ throw_ub_custom!(fluent::const_eval_copy_nonoverlapping_overlapping);
}
}