summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs')
-rw-r--r--compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs33
1 files changed, 11 insertions, 22 deletions
diff --git a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
index 6a7714613..9df6d2f43 100644
--- a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
+++ b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs
@@ -53,11 +53,11 @@ use smallvec::{smallvec, SmallVec};
use rustc_data_structures::captures::Captures;
use rustc_hir::{HirId, RangeEnd};
use rustc_index::Idx;
+use rustc_middle::middle::stability::EvalResult;
use rustc_middle::mir;
use rustc_middle::thir::{FieldPat, Pat, PatKind, PatRange};
use rustc_middle::ty::layout::IntegerExt;
use rustc_middle::ty::{self, Ty, TyCtxt, VariantDef};
-use rustc_middle::{middle::stability::EvalResult, mir::interpret::ConstValue};
use rustc_session::lint;
use rustc_span::{Span, DUMMY_SP};
use rustc_target::abi::{FieldIdx, Integer, Size, VariantIdx, FIRST_VARIANT};
@@ -140,28 +140,17 @@ impl IntRange {
value: mir::ConstantKind<'tcx>,
) -> Option<IntRange> {
let ty = value.ty();
- if let Some((target_size, bias)) = Self::integral_size_and_signed_bias(tcx, ty) {
- let val = if let mir::ConstantKind::Val(ConstValue::Scalar(scalar), _) = value {
- // For this specific pattern we can skip a lot of effort and go
- // straight to the result, after doing a bit of checking. (We
- // could remove this branch and just fall through, which
- // is more general but much slower.)
- scalar.to_bits_or_ptr_internal(target_size).unwrap().left()?
- } else {
- if let mir::ConstantKind::Ty(c) = value
- && let ty::ConstKind::Value(_) = c.kind()
- {
- bug!("encountered ConstValue in mir::ConstantKind::Ty, whereas this is expected to be in ConstantKind::Val");
- }
+ let (target_size, bias) = Self::integral_size_and_signed_bias(tcx, ty)?;
+ let val = match value {
+ mir::ConstantKind::Ty(c) if let ty::ConstKind::Value(valtree) = c.kind() => {
+ valtree.unwrap_leaf().to_bits(target_size).ok()
+ },
+ // This is a more general form of the previous case.
+ _ => value.try_eval_bits(tcx, param_env, ty),
+ }?;
- // This is a more general form of the previous case.
- value.try_eval_bits(tcx, param_env, ty)?
- };
- let val = val ^ bias;
- Some(IntRange { range: val..=val, bias })
- } else {
- None
- }
+ let val = val ^ bias;
+ Some(IntRange { range: val..=val, bias })
}
#[inline]