Skip to content

Commit 6c6b492

Browse files
committed
Edit the inputs to const == val check instead of duplicating logic
1 parent e1e2e17 commit 6c6b492

File tree

1 file changed

+31
-32
lines changed
  • compiler/rustc_mir_build/src/builder/matches

1 file changed

+31
-32
lines changed

compiler/rustc_mir_build/src/builder/matches/test.rs

+31-32
Original file line numberDiff line numberDiff line change
@@ -141,47 +141,46 @@ impl<'a, 'tcx> Builder<'a, 'tcx> {
141141
self.cfg.terminate(block, self.source_info(match_start_span), terminator);
142142
}
143143

144-
TestKind::Eq { value, ty } => {
144+
TestKind::Eq { value, mut ty } => {
145145
let tcx = self.tcx;
146146
let success_block = target_block(TestBranch::Success);
147147
let fail_block = target_block(TestBranch::Failure);
148148

149149
let expect_ty = value.ty();
150150
let expect = self.literal_operand(test.span, value);
151-
if let ty::Adt(def, _) = ty.kind()
152-
&& tcx.is_lang_item(def.did(), LangItem::String)
153-
{
154-
if !tcx.features().string_deref_patterns() {
155-
span_bug!(
151+
152+
let mut place = place;
153+
let mut block = block;
154+
match ty.kind() {
155+
ty::Adt(def, _) if tcx.is_lang_item(def.did(), LangItem::String) => {
156+
if !tcx.features().string_deref_patterns() {
157+
span_bug!(
158+
test.span,
159+
"matching on `String` went through without enabling string_deref_patterns"
160+
);
161+
}
162+
let re_erased = tcx.lifetimes.re_erased;
163+
let ref_str_ty = Ty::new_imm_ref(tcx, re_erased, tcx.types.str_);
164+
let ref_str = self.temp(ref_str_ty, test.span);
165+
let eq_block = self.cfg.start_new_block();
166+
// `let ref_str: &str = <String as Deref>::deref(&place);`
167+
self.call_deref(
168+
block,
169+
eq_block,
170+
place,
171+
Mutability::Not,
172+
ty,
173+
ref_str,
156174
test.span,
157-
"matching on `String` went through without enabling string_deref_patterns"
158175
);
176+
block = eq_block;
177+
place = ref_str;
178+
ty = ref_str_ty;
159179
}
160-
let re_erased = tcx.lifetimes.re_erased;
161-
let ref_str_ty = Ty::new_imm_ref(tcx, re_erased, tcx.types.str_);
162-
let ref_str = self.temp(ref_str_ty, test.span);
163-
let eq_block = self.cfg.start_new_block();
164-
// `let ref_str: &str = <String as Deref>::deref(&place);`
165-
self.call_deref(
166-
block,
167-
eq_block,
168-
place,
169-
Mutability::Not,
170-
ty,
171-
ref_str,
172-
test.span,
173-
);
174-
self.non_scalar_compare(
175-
eq_block,
176-
success_block,
177-
fail_block,
178-
source_info,
179-
expect,
180-
expect_ty,
181-
Operand::Copy(ref_str),
182-
ref_str_ty,
183-
);
184-
} else if !ty.is_scalar() {
180+
_ => {}
181+
}
182+
183+
if !ty.is_scalar() {
185184
// Use `PartialEq::eq` instead of `BinOp::Eq`
186185
// (the binop can only handle primitives)
187186
self.non_scalar_compare(

0 commit comments

Comments
 (0)