From 19b9b26986246b92e1f686a9a7b29da42a79ed9f Mon Sep 17 00:00:00 2001 From: Oliver Scherer Date: Mon, 13 Jan 2020 16:12:10 +0100 Subject: [PATCH] Early abort validation of arrays of zsts because there is no data to be checked --- src/librustc_mir/interpret/validity.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/librustc_mir/interpret/validity.rs b/src/librustc_mir/interpret/validity.rs index 12e8cb6071d92..2f0fb81fffd13 100644 --- a/src/librustc_mir/interpret/validity.rs +++ b/src/librustc_mir/interpret/validity.rs @@ -608,9 +608,14 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> return Ok(()); } // This is the element type size. - let ty_size = self.ecx.layout_of(tys)?.size; + let layout = self.ecx.layout_of(tys)?; + // Empty tuples and fieldless structs (the only ZSTs that allow reaching this code) + // have no data to be checked. + if layout.is_zst() { + return Ok(()); + } // This is the size in bytes of the whole array. - let size = ty_size * len; + let size = layout.size * len; // Size is not 0, get a pointer. let ptr = self.ecx.force_ptr(mplace.ptr)?; @@ -640,7 +645,7 @@ impl<'rt, 'mir, 'tcx, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> // Some byte was undefined, determine which // element that byte belongs to so we can // provide an index. - let i = (offset.bytes() / ty_size.bytes()) as usize; + let i = (offset.bytes() / layout.size.bytes()) as usize; self.path.push(PathElem::ArrayElem(i)); throw_validation_failure!("undefined bytes", self.path)