From 13c0dc56dfa42e6674dd379e3a728b418bfdedcb Mon Sep 17 00:00:00 2001 From: Oliver Schneider Date: Mon, 29 Jan 2018 19:06:44 +0100 Subject: [PATCH] Only report bitshift lints on bitshift ops --- src/librustc_mir/transform/const_prop.rs | 30 +++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/src/librustc_mir/transform/const_prop.rs b/src/librustc_mir/transform/const_prop.rs index e1a1c4737301..e0d8744f7c40 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);