//@ run-pass #![feature(test)] #![allow(invalid_nan_comparisons)] extern crate test; use std::mem::size_of; use test::black_box; // Ensure the const-eval result and runtime result of float comparison are equivalent. macro_rules! compare { ($op:tt) => { compare!( [f64::NEG_INFINITY, -f64::MAX, -1.0, -0.0, 0.0, 1.0, f64::MAX, f64::INFINITY, f64::NAN], $op ); }; ([$($lhs:expr),+], $op:tt) => { $(compare!( $lhs, $op, [f64::NEG_INFINITY, -f64::MAX, -1.0, -0.0, 0.0, 1.0, f64::MAX, f64::INFINITY, f64::NAN] );)+ }; ($lhs:expr, $op:tt, [$($rhs:expr),+]) => { $({ // Wrap the check in its own function to reduce time needed to borrowck. fn check() { static CONST_EVAL: bool = $lhs $op $rhs; let runtime_eval = black_box($lhs) $op black_box($rhs); assert_eq!(CONST_EVAL, runtime_eval, stringify!($lhs $op $rhs)); assert_eq!( size_of::<[u8; ($lhs $op $rhs) as usize]>(), runtime_eval as usize, stringify!($lhs $op $rhs (forced const eval)) ); } check(); })+ }; } fn main() { assert_eq!(0.0/0.0 < 0.0/0.0, false); assert_eq!(0.0/0.0 > 0.0/0.0, false); assert_eq!(f64::NAN < f64::NAN, false); assert_eq!(f64::NAN > f64::NAN, false); compare!(==); compare!(!=); compare!(<); compare!(<=); compare!(>); compare!(>=); }