about summary refs log tree commit diff
diff options
context:
space:
mode:
authorOliver Schneider <git-no-reply-9879165716479413131@oli-obk.de>2018-01-29 19:06:44 +0100
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>2018-03-08 08:34:14 +0100
commit13c0dc56dfa42e6674dd379e3a728b418bfdedcb (patch)
tree659d6b5992d8e17aac036f163a57f125ccfadef6
parent438139f635302231f80ef627880f4ebd3fbb886e (diff)
downloadrust-13c0dc56dfa42e6674dd379e3a728b418bfdedcb.tar.gz
rust-13c0dc56dfa42e6674dd379e3a728b418bfdedcb.zip
Only report bitshift lints on bitshift ops
-rw-r--r--src/librustc_mir/transform/const_prop.rs30
1 files changed, 16 insertions, 14 deletions
diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs
index e1a1c473730..e0d8744f7c4 100644
--- a/src/librustc_mir/transform/const_prop.rs
+++ b/src/librustc_mir/transform/const_prop.rs
@@ -15,7 +15,7 @@
 
 use rustc::mir::{Constant, Literal, Location, Place, Mir, Operand, Rvalue, Local};
 use rustc::mir::{NullOp, StatementKind, Statement, BasicBlock, LocalKind};
-use rustc::mir::{TerminatorKind, ClearCrossCrate, SourceInfo};
+use rustc::mir::{TerminatorKind, ClearCrossCrate, SourceInfo, BinOp};
 use rustc::mir::visit::Visitor;
 use rustc::ty::layout::LayoutOf;
 use rustc::middle::const_val::ConstVal;
@@ -216,19 +216,21 @@ impl<'b, 'a, 'tcx:'b> OptimizationFinder<'b, 'a, 'tcx> {
                 let ecx = mk_borrowck_eval_cx(self.tcx, instance, self.mir, span).unwrap();
 
                 let r = ecx.value_to_primval(ValTy { value: right.0, ty: right.1 }).ok()?;
-                let param_env = self.tcx.param_env(self.source.def_id);
-                let bits = (self.tcx, param_env).layout_of(left.1).unwrap().size.bits();
-                if r.to_bytes().ok()? >= bits as u128 {
-                    let scope_info = match self.mir.visibility_scope_info {
-                        ClearCrossCrate::Set(ref data) => data,
-                        ClearCrossCrate::Clear => return None,
-                    };
-                    let node_id = scope_info[source_info.scope].lint_root;
-                    self.tcx.lint_node(
-                        ::rustc::lint::builtin::EXCEEDING_BITSHIFTS,
-                        node_id,
-                        span,
-                        "bitshift exceeds the type's number of bits");
+                if op == BinOp::Shr || op == BinOp::Shl {
+                    let param_env = self.tcx.param_env(self.source.def_id);
+                    let bits = (self.tcx, param_env).layout_of(left.1).unwrap().size.bits();
+                    if r.to_bytes().ok()? >= bits as u128 {
+                        let scope_info = match self.mir.visibility_scope_info {
+                            ClearCrossCrate::Set(ref data) => data,
+                            ClearCrossCrate::Clear => return None,
+                        };
+                        let node_id = scope_info[source_info.scope].lint_root;
+                        self.tcx.lint_node(
+                            ::rustc::lint::builtin::EXCEEDING_BITSHIFTS,
+                            node_id,
+                            span,
+                            "bitshift exceeds the type's number of bits");
+                    }
                 }
                 let l = ecx.value_to_primval(ValTy { value: left.0, ty: left.1 }).ok()?;
                 trace!("const evaluating {:?} for {:?} and {:?}", op, left, right);