Skip to content

Commit 3bcd6fa

Browse files
committed
use Eq instead of Lt in loop
1 parent 68b7475 commit 3bcd6fa

File tree

2 files changed

+47
-4
lines changed

2 files changed

+47
-4
lines changed

src/librustc_mir/util/elaborate_drops.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,8 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D>
556556
/// create a loop that drops an array:
557557
///
558558
/// loop-block:
559-
/// can_go = index < len
560-
/// if can_go then drop-block else succ
559+
/// can_go = index == len
560+
/// if can_go then succ else drop-block
561561
/// drop-block:
562562
/// ptr = &mut LV[index]
563563
/// index = index + 1
@@ -604,13 +604,13 @@ impl<'l, 'b, 'tcx, D> DropCtxt<'l, 'b, 'tcx, D>
604604
let loop_block = self.elaborator.patch().new_block(BasicBlockData {
605605
statements: vec![
606606
Statement { source_info: self.source_info, kind: StatementKind::Assign(
607-
can_go.clone(), Rvalue::BinaryOp(BinOp::Lt, use_(index), use_(length))
607+
can_go.clone(), Rvalue::BinaryOp(BinOp::Eq, use_(index), use_(length))
608608
)},
609609
],
610610
is_cleanup: unwind.is_cleanup(),
611611
terminator: Some(Terminator {
612612
source_info: self.source_info,
613-
kind: TerminatorKind::if_(tcx, use_(can_go), drop_block, succ)
613+
kind: TerminatorKind::if_(tcx, use_(can_go), succ, drop_block)
614614
})
615615
});
616616

src/test/run-pass/issue-41888.rs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
2+
// file at the top-level directory of this distribution and at
3+
// http://rust-lang.org/COPYRIGHT.
4+
//
5+
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6+
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7+
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8+
// option. This file may not be copied, modified, or distributed
9+
// except according to those terms.
10+
11+
fn main() { let _ = g(Some(E::F(K))); }
12+
13+
type R = Result<(), ()>;
14+
struct K;
15+
16+
enum E {
17+
F(K), // must not be built-in type
18+
#[allow(dead_code)]
19+
G(Box<E>, Box<E>),
20+
}
21+
22+
fn translate(x: R) -> R { x }
23+
24+
fn g(mut status: Option<E>) -> R {
25+
loop {
26+
match status {
27+
Some(infix_or_postfix) => match infix_or_postfix {
28+
E::F(_op) => { // <- must be captured by value
29+
match Ok(()) {
30+
Err(err) => return Err(err),
31+
Ok(_) => {},
32+
};
33+
}
34+
_ => (),
35+
},
36+
_ => match translate(Err(())) {
37+
Err(err) => return Err(err),
38+
Ok(_) => {},
39+
}
40+
}
41+
status = None;
42+
}
43+
}

0 commit comments

Comments
 (0)