Skip to content

Commit

Permalink
References to ZSTs may be at arbitrary aligned addresses
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Sep 30, 2020
1 parent 4d52dc4 commit ce6c25d
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 5 deletions.
10 changes: 5 additions & 5 deletions compiler/rustc_mir/src/const_eval/eval_queries.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ use rustc_middle::ty::print::with_no_trimmed_paths;
use rustc_middle::ty::{self, subst::Subst, TyCtxt};
use rustc_span::source_map::Span;
use rustc_target::abi::{Abi, LayoutOf};
use std::convert::TryInto;
use std::convert::{TryFrom, TryInto};

pub fn note_on_undefined_behavior_error() -> &'static str {
"The rules on what exactly is undefined behavior aren't clear, \
Expand Down Expand Up @@ -148,10 +148,10 @@ pub(super) fn op_to_const<'tcx>(
Scalar::Raw { data, .. } => {
assert!(mplace.layout.is_zst());
assert_eq!(
data,
mplace.layout.align.abi.bytes().into(),
"this MPlaceTy must come from `try_as_mplace` being used on a zst, so we know what
value this integer address must have",
u64::try_from(data).unwrap() % mplace.layout.align.abi.bytes(),
0,
"this MPlaceTy must come from a validated constant, thus we can assume the \
alignment is correct",
);
ConstValue::Scalar(Scalar::zst())
}
Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/match/const_non_normal_zst_ref_pattern.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// check-pass

const FOO: isize = 10;
const ZST: &() = unsafe { std::mem::transmute(FOO) };
fn main() {
match &() {
ZST => 9,
};
}

0 comments on commit ce6c25d

Please sign in to comment.