Skip to content

Commit

Permalink
Auto merge of rust-lang#71751 - oli-obk:const_ice, r=RalfJung
Browse files Browse the repository at this point in the history
Move recursion check for zsts back to read site instead of access check site

Reverts rust-lang#71140 (comment)

Fix rust-lang#71612
Fix rust-lang#71709

r? @RalfJung
  • Loading branch information
bors committed May 4, 2020
2 parents d6823ba + c64c776 commit 6318d24
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 12 deletions.
13 changes: 1 addition & 12 deletions src/librustc_mir/interpret/memory.rs
Original file line number Diff line number Diff line change
Expand Up @@ -400,18 +400,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> {

// We can still be zero-sized in this branch, in which case we have to
// return `None`.
if size.bytes() == 0 {
// We may be reading from a static.
// In order to ensure that `static FOO: Type = FOO;` causes a cycle error
// instead of magically pulling *any* ZST value from the ether, we need to
// actually access the referenced allocation. The caller is likely
// to short-circuit on `None`, so we trigger the access here to
// make sure it happens.
self.get_raw(ptr.alloc_id)?;
None
} else {
Some(ptr)
}
if size.bytes() == 0 { None } else { Some(ptr) }
}
})
}
Expand Down
7 changes: 7 additions & 0 deletions src/librustc_mir/interpret/operand.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,6 +240,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
{
Some(ptr) => ptr,
None => {
if let Scalar::Ptr(ptr) = mplace.ptr {
// We may be reading from a static.
// In order to ensure that `static FOO: Type = FOO;` causes a cycle error
// instead of magically pulling *any* ZST value from the ether, we need to
// actually access the referenced allocation.
self.memory.get_raw(ptr.alloc_id)?;
}
return Ok(Some(ImmTy {
// zero-sized type
imm: Scalar::zst().into(),
Expand Down
32 changes: 32 additions & 0 deletions src/test/ui/consts/ice-zst-static-access.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
// check-pass

// This is a regression test for ICEs from
// https://github.com/rust-lang/rust/issues/71612
// and
// https://github.com/rust-lang/rust/issues/71709

#[derive(Copy, Clone)]
pub struct Glfw;

static mut GLFW: Option<Glfw> = None;
pub fn new() -> Glfw {
unsafe {
if let Some(glfw) = GLFW {
return glfw;
} else {
todo!()
}
};
}

extern "C" {
static _dispatch_queue_attr_concurrent: [u8; 0];
}

static DISPATCH_QUEUE_CONCURRENT: &'static [u8; 0] =
unsafe { &_dispatch_queue_attr_concurrent };

fn main() {
*DISPATCH_QUEUE_CONCURRENT;
new();
}

0 comments on commit 6318d24

Please sign in to comment.