From 8003c570d8fe50063587e05dc09dc2be837c0a03 Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Fri, 4 Nov 2016 15:49:14 +0100 Subject: [PATCH] don't panic on pointer to value comparison in primvals --- src/primval.rs | 2 +- tests/compile-fail/tag-align-dyn-u64.rs | 37 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 tests/compile-fail/tag-align-dyn-u64.rs diff --git a/src/primval.rs b/src/primval.rs index 74546626d6ec..2d8b50076234 100644 --- a/src/primval.rs +++ b/src/primval.rs @@ -289,7 +289,7 @@ pub fn binary_op<'tcx>( } (None, None) => {} - _ => unimplemented!(), + _ => return Err(EvalError::ReadPointerAsBytes), } let (l, r) = (left.bits, right.bits); diff --git a/tests/compile-fail/tag-align-dyn-u64.rs b/tests/compile-fail/tag-align-dyn-u64.rs new file mode 100644 index 000000000000..dc93965b7e55 --- /dev/null +++ b/tests/compile-fail/tag-align-dyn-u64.rs @@ -0,0 +1,37 @@ +// Copyright 2012-2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![allow(dead_code)] + +use std::mem; + +enum Tag { + Tag2(A) +} + +struct Rec { + c8: u8, + t: Tag +} + +fn mk_rec() -> Rec { + return Rec { c8:0, t:Tag::Tag2(0) }; +} + +fn is_u64_aligned(u: &Tag) -> bool { + let p: usize = unsafe { mem::transmute(u) }; + let u64_align = std::mem::align_of::(); + return (p & (u64_align - 1)) == 0; //~ ERROR a raw memory access tried to access part of a pointer value as raw bytes +} + +pub fn main() { + let x = mk_rec(); + assert!(is_u64_aligned(&x.t)); +}