From 6aed897c70abdd1171545fbe5695cc89797ffa9c Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Thu, 9 Feb 2017 09:40:23 +0100 Subject: [PATCH] 1 > -1 --- src/operator.rs | 4 +++ src/value.rs | 8 ++++++ tests/run-pass/issue-15523-big.rs | 48 +++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 tests/run-pass/issue-15523-big.rs diff --git a/src/operator.rs b/src/operator.rs index 7de006dd5c7e..2823e3edbea9 100644 --- a/src/operator.rs +++ b/src/operator.rs @@ -235,9 +235,13 @@ pub fn binary_op<'tcx>( (Eq, _) => PrimVal::from_bool(l == r), (Ne, _) => PrimVal::from_bool(l != r), + (Lt, k) if k.is_signed_int() => PrimVal::from_bool((l as i128) < (r as i128)), (Lt, _) => PrimVal::from_bool(l < r), + (Le, k) if k.is_signed_int() => PrimVal::from_bool((l as i128) <= (r as i128)), (Le, _) => PrimVal::from_bool(l <= r), + (Gt, k) if k.is_signed_int() => PrimVal::from_bool((l as i128) > (r as i128)), (Gt, _) => PrimVal::from_bool(l > r), + (Ge, k) if k.is_signed_int() => PrimVal::from_bool((l as i128) >= (r as i128)), (Ge, _) => PrimVal::from_bool(l >= r), (BitOr, _) => PrimVal::Bytes(l | r), diff --git a/src/value.rs b/src/value.rs index 8d153528d4f0..e812d116286a 100644 --- a/src/value.rs +++ b/src/value.rs @@ -214,6 +214,14 @@ impl PrimValKind { } } + pub fn is_signed_int(self) -> bool { + use self::PrimValKind::*; + match self { + I8 | I16 | I32 | I64 | I128 => true, + _ => false, + } + } + pub fn from_uint_size(size: u64) -> Self { match size { 1 => PrimValKind::U8, diff --git a/tests/run-pass/issue-15523-big.rs b/tests/run-pass/issue-15523-big.rs new file mode 100644 index 000000000000..33c81cab3817 --- /dev/null +++ b/tests/run-pass/issue-15523-big.rs @@ -0,0 +1,48 @@ +// Copyright 2015 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. + +// Issue 15523: derive(PartialOrd) should use the provided +// discriminant values for the derived ordering. +// +// This test is checking corner cases that arise when you have +// 64-bit values in the variants. + +#[derive(PartialEq, PartialOrd)] +#[repr(u64)] +enum Eu64 { + Pos2 = 2, + PosMax = !0, + Pos1 = 1, +} + +#[derive(PartialEq, PartialOrd)] +#[repr(i64)] +enum Ei64 { + Pos2 = 2, + Neg1 = -1, + NegMin = 1 << 63, + PosMax = !(1 << 63), + Pos1 = 1, +} + +fn main() { + assert!(Eu64::Pos2 > Eu64::Pos1); + assert!(Eu64::Pos2 < Eu64::PosMax); + assert!(Eu64::Pos1 < Eu64::PosMax); + + + assert!(Ei64::Pos2 > Ei64::Pos1); + assert!(Ei64::Pos2 > Ei64::Neg1); + assert!(Ei64::Pos1 > Ei64::Neg1); + assert!(Ei64::Pos2 > Ei64::NegMin); + assert!(Ei64::Pos1 > Ei64::NegMin); + assert!(Ei64::Pos2 < Ei64::PosMax); + assert!(Ei64::Pos1 < Ei64::PosMax); +}