Skip to content

Commit 1886985

Browse files
committed
[const-prop] Clean up check_cast() a bit
1 parent 397a2fd commit 1886985

File tree

1 file changed

+35
-31
lines changed

1 file changed

+35
-31
lines changed

src/librustc_mir/transform/const_prop.rs

+35-31
Original file line numberDiff line numberDiff line change
@@ -546,38 +546,42 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
546546
source_info: SourceInfo,
547547
place_layout: TyLayout<'tcx>,
548548
) -> Option<()> {
549-
if ty.is_integral() && op.ty(&self.local_decls, self.tcx).is_integral() {
550-
let value = self.use_ecx(source_info, |this| {
551-
this.ecx.read_immediate(this.ecx.eval_operand(op, None)?)
552-
})?;
549+
if !ty.is_integral() || !op.ty(&self.local_decls, self.tcx).is_integral() {
550+
return Some(());
551+
}
553552

554-
// Do not try to read bits for ZSTs
555-
if !value.layout.is_zst() {
556-
let value_size = value.layout.size;
557-
let value_bits = value.to_scalar().and_then(|r| r.to_bits(value_size));
558-
if let Ok(value_bits) = value_bits {
559-
let truncated = truncate(value_bits, place_layout.size);
560-
if truncated != value_bits {
561-
let scope = source_info.scope;
562-
let lint_root = match &self.source_scopes[scope].local_data {
563-
ClearCrossCrate::Set(data) => data.lint_root,
564-
ClearCrossCrate::Clear => return None,
565-
};
566-
self.tcx.lint_hir(
567-
::rustc::lint::builtin::CONST_ERR,
568-
lint_root,
569-
source_info.span,
570-
&format!(
571-
"truncating cast: the value {} requires {} bits but \
572-
the target type is only {} bits",
573-
value_bits,
574-
value_size.bits(),
575-
place_layout.size.bits()
576-
),
577-
);
578-
return None;
579-
}
580-
}
553+
let value = self.use_ecx(source_info, |this| {
554+
this.ecx.read_immediate(this.ecx.eval_operand(op, None)?)
555+
})?;
556+
557+
// Do not try to read bits for ZSTs
558+
if value.layout.is_zst() {
559+
return Some(());
560+
}
561+
562+
let value_size = value.layout.size;
563+
let value_bits = value.to_scalar().and_then(|r| r.to_bits(value_size));
564+
if let Ok(value_bits) = value_bits {
565+
let truncated = truncate(value_bits, place_layout.size);
566+
if truncated != value_bits {
567+
let scope = source_info.scope;
568+
let lint_root = match &self.source_scopes[scope].local_data {
569+
ClearCrossCrate::Set(data) => data.lint_root,
570+
ClearCrossCrate::Clear => return None,
571+
};
572+
self.tcx.lint_hir(
573+
::rustc::lint::builtin::CONST_ERR,
574+
lint_root,
575+
source_info.span,
576+
&format!(
577+
"truncating cast: the value {} requires {} bits but the target type is \
578+
only {} bits",
579+
value_bits,
580+
value_size.bits(),
581+
place_layout.size.bits()
582+
),
583+
);
584+
return None;
581585
}
582586
}
583587

0 commit comments

Comments
 (0)