|
16 | 16 |
|
17 | 17 | use super::validity::RefTracking; |
18 | 18 | use rustc_data_structures::fx::{FxHashMap, FxHashSet}; |
| 19 | +use rustc_errors::ErrorReported; |
19 | 20 | use rustc_hir as hir; |
20 | 21 | use rustc_middle::mir::interpret::InterpResult; |
21 | 22 | use rustc_middle::ty::{self, layout::TyAndLayout, Ty}; |
@@ -285,11 +286,13 @@ pub enum InternKind { |
285 | 286 | /// tracks where in the value we are and thus can show much better error messages. |
286 | 287 | /// Any errors here would anyway be turned into `const_err` lints, whereas validation failures |
287 | 288 | /// are hard errors. |
| 289 | +#[tracing::instrument(skip(ecx))] |
288 | 290 | pub fn intern_const_alloc_recursive<M: CompileTimeMachine<'mir, 'tcx>>( |
289 | 291 | ecx: &mut InterpCx<'mir, 'tcx, M>, |
290 | 292 | intern_kind: InternKind, |
291 | 293 | ret: MPlaceTy<'tcx>, |
292 | | -) where |
| 294 | +) -> Result<(), ErrorReported> |
| 295 | +where |
293 | 296 | 'tcx: 'mir, |
294 | 297 | { |
295 | 298 | let tcx = ecx.tcx; |
@@ -405,12 +408,14 @@ pub fn intern_const_alloc_recursive<M: CompileTimeMachine<'mir, 'tcx>>( |
405 | 408 | // Codegen does not like dangling pointers, and generally `tcx` assumes that |
406 | 409 | // all allocations referenced anywhere actually exist. So, make sure we error here. |
407 | 410 | ecx.tcx.sess.span_err(ecx.tcx.span, "encountered dangling pointer in final constant"); |
| 411 | + return Err(ErrorReported); |
408 | 412 | } else if ecx.tcx.get_global_alloc(alloc_id).is_none() { |
409 | 413 | // We have hit an `AllocId` that is neither in local or global memory and isn't |
410 | 414 | // marked as dangling by local memory. That should be impossible. |
411 | 415 | span_bug!(ecx.tcx.span, "encountered unknown alloc id {:?}", alloc_id); |
412 | 416 | } |
413 | 417 | } |
| 418 | + Ok(()) |
414 | 419 | } |
415 | 420 |
|
416 | 421 | impl<'mir, 'tcx: 'mir, M: super::intern::CompileTimeMachine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { |
|
0 commit comments