use syntax::ast::{self, Expr};
use syntax::codemap::Span;
+use syntax::feature_gate;
use syntax::parse::token::InternedString;
use syntax::ptr::P;
use syntax::{ast_map, ast_util, codemap};
match try!(eval_const_expr_partial(tcx, &**inner, ety)) {
const_float(f) => const_float(-f),
const_int(n) => try!(const_int_checked_neg(n, e, expr_int_type)),
- const_uint(n) => try!(const_uint_checked_neg(n, e, expr_uint_type)),
+ const_uint(i) => {
+ if !tcx.sess.features.borrow().negate_unsigned {
+ feature_gate::emit_feature_err(
+ &tcx.sess.parse_sess.span_diagnostic,
+ "negate_unsigned",
+ e.span,
+ "unary negation of unsigned integers may be removed in the future");
+ }
+ const_uint(n) => try!(const_uint_checked_neg(n, e, expr_uint_type)),
+ }
const_str(_) => signal!(e, NegateOnString),
const_bool(_) => signal!(e, NegateOnBoolean),
const_binary(_) => signal!(e, NegateOnBinary),
impl TypeLimits {
pub fn new() -> TypeLimits {
TypeLimits {
- negated_expr_id: -1,
+ negated_expr_id: !0,
}
}
}
let bits = machine::llbitsize_of_real(bcx.ccx(), llty);
assert!(bits <= 64);
let bits = bits as usize;
- let mask = (-1u64 >> (64 - bits)) as Disr;
+ let mask = (!0u64 >> (64 - bits)) as Disr;
// For a (max) discr of -1, max will be `-1 as usize`, which overflows.
// However, that is fine here (it would still represent the full range),
if (max.wrapping_add(1)) & mask == min & mask {
_ => unreachable!(),
};
let minus_one = ICmp(bcx, llvm::IntEQ, rhs,
- C_integral(llty, -1, false), debug_loc);
+ C_integral(llty, !0, false), debug_loc);
with_cond(bcx, minus_one, |bcx| {
let is_min = ICmp(bcx, llvm::IntEQ, lhs,
C_integral(llty, min, true), debug_loc);
common::validate_substs(param_substs);
debug!("new_fn_ctxt(path={}, id={}, param_substs={})",
- if id == -1 {
+ if id == !0 {
"".to_string()
} else {
ccx.tcx().map.path_to_string(id).to_string()
CrateContext {
shared: shared,
local: self,
- index: -1 as usize,
+ index: !0 as usize,
}
}
}
/// When parsing and doing expansions, we initially give all AST nodes this AST
/// node value. Then later, in the renumber pass, we renumber them to have
/// small, positive ids.
-pub const DUMMY_NODE_ID: NodeId = -1;
+pub const DUMMY_NODE_ID: NodeId = !0;
/// The AST represents all type param bounds as types.
/// typeck::collect::compute_bounds matches these against
#[derive(PartialEq, Eq, Clone, Debug, Hash, RustcEncodable, RustcDecodable, Copy)]
pub struct ExpnId(u32);
-pub const NO_EXPANSION: ExpnId = ExpnId(-1);
+pub const NO_EXPANSION: ExpnId = ExpnId(!0);
// For code appearing from the command line
-pub const COMMAND_LINE_EXPN: ExpnId = ExpnId(-2);
+pub const COMMAND_LINE_EXPN: ExpnId = ExpnId(!1);
impl ExpnId {
pub fn from_llvm_cookie(cookie: c_uint) -> ExpnId {