]> git.lizzy.rs Git - rust.git/commitdiff
Fix int_ty_to_nbits
authorMalo Jaffré <jaffre.malo@gmail.com>
Wed, 23 Aug 2017 20:18:04 +0000 (22:18 +0200)
committerMalo Jaffré <jaffre.malo@gmail.com>
Wed, 23 Aug 2017 20:18:04 +0000 (22:18 +0200)
Thanks @oli-obk for the detailed instructions.
Fixes #1957.

clippy_lints/src/types.rs

index ea3db0e4690029bd1089f4b28c93c50822782ea2..14065aeaf88db54765186fa00db5285c4228ab81 100644 (file)
@@ -3,7 +3,7 @@
 use rustc::hir::*;
 use rustc::hir::intravisit::{FnKind, Visitor, walk_ty, NestedVisitorMap};
 use rustc::lint::*;
-use rustc::ty::{self, Ty};
+use rustc::ty::{self, Ty, TyCtxt};
 use rustc::ty::subst::Substs;
 use std::cmp::Ordering;
 use syntax::ast::{IntTy, UintTy, FloatTy};
@@ -479,17 +479,25 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
 
 /// Returns the size in bits of an integral type.
 /// Will return 0 if the type is not an int or uint variant
-fn int_ty_to_nbits(typ: Ty) -> usize {
-    let n = match typ.sty {
-        ty::TyInt(i) => 4 << (i as usize),
-        ty::TyUint(u) => 4 << (u as usize),
+fn int_ty_to_nbits(typ: Ty, tcx: TyCtxt) -> u64 {
+    match typ.sty {
+        ty::TyInt(i) => match i {
+            IntTy::Is => tcx.data_layout.pointer_size.bits(),
+            IntTy::I8 => 8,
+            IntTy::I16 => 16,
+            IntTy::I32 => 32,
+            IntTy::I64 => 64,
+            IntTy::I128 => 128,
+        },
+        ty::TyUint(i) => match i {
+            UintTy::Us => tcx.data_layout.pointer_size.bits(),
+            UintTy::U8 => 8,
+            UintTy::U16 => 16,
+            UintTy::U32 => 32,
+            UintTy::U64 => 64,
+            UintTy::U128 => 128,
+        },
         _ => 0,
-    };
-    // n == 4 is the usize/isize case
-    if n == 4 {
-        ::std::mem::size_of::<usize>() * 8
-    } else {
-        n
     }
 }
 
@@ -510,7 +518,7 @@ fn span_precision_loss_lint(cx: &LateContext, expr: &Expr, cast_from: Ty, cast_t
     } else if is_isize_or_usize(cast_from) {
         "32 or 64".to_owned()
     } else {
-        int_ty_to_nbits(cast_from).to_string()
+        int_ty_to_nbits(cast_from, cx.tcx).to_string()
     };
     span_lint(
         cx,
@@ -542,7 +550,8 @@ fn check_truncation_and_wrapping(cx: &LateContext, expr: &Expr, cast_from: Ty, c
     let arch_64_suffix = " on targets with 64-bit wide pointers";
     let arch_32_suffix = " on targets with 32-bit wide pointers";
     let cast_unsigned_to_signed = !cast_from.is_signed() && cast_to.is_signed();
-    let (from_nbits, to_nbits) = (int_ty_to_nbits(cast_from), int_ty_to_nbits(cast_to));
+    let from_nbits = int_ty_to_nbits(cast_from, cx.tcx);
+    let to_nbits = int_ty_to_nbits(cast_to, cx.tcx);
     let (span_truncation, suffix_truncation, span_wrap, suffix_wrap) =
         match (is_isize_or_usize(cast_from), is_isize_or_usize(cast_to)) {
             (true, true) | (false, false) => {
@@ -650,7 +659,7 @@ fn check_expr(&mut self, cx: &LateContext<'a, 'tcx>, expr: &'tcx Expr) {
             if cast_from.is_numeric() && cast_to.is_numeric() && !in_external_macro(cx, expr.span) {
                 match (cast_from.is_integral(), cast_to.is_integral()) {
                     (true, false) => {
-                        let from_nbits = int_ty_to_nbits(cast_from);
+                        let from_nbits = int_ty_to_nbits(cast_from, cx.tcx);
                         let to_nbits = if let ty::TyFloat(FloatTy::F32) = cast_to.sty {
                             32
                         } else {