Skip to content

Commit 8bc1355

Browse files
committed
move subtyper change reveal_all
1 parent e3c631b commit 8bc1355

File tree

8 files changed

+114
-54
lines changed

8 files changed

+114
-54
lines changed

compiler/rustc_mir_transform/src/add_subtyping_projections.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,9 @@ impl<'a, 'tcx> MutVisitor<'tcx> for SubTypeChecker<'a, 'tcx> {
2424
rvalue: &mut Rvalue<'tcx>,
2525
location: Location,
2626
) {
27+
if self.local_decls[place.local].internal {
28+
return;
29+
}
2730
let mut place_ty = place.ty(self.local_decls, self.tcx).ty;
2831
let mut rval_ty = rvalue.ty(self.local_decls, self.tcx);
2932
// Not erasing this causes `Free Regions` errors in validator,
@@ -48,7 +51,6 @@ impl<'a, 'tcx> MutVisitor<'tcx> for SubTypeChecker<'a, 'tcx> {
4851
// // gets transformed to
4952
// let temp: rval_ty = rval;
5053
// let place: place_ty = temp as place_ty;
51-
//
5254
pub fn subtype_finder<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
5355
let patch = MirPatch::new(body);
5456
let mut checker = SubTypeChecker { tcx, patcher: patch, local_decls: &body.local_decls };

compiler/rustc_mir_transform/src/lib.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,6 @@ pub fn run_analysis_to_runtime_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'
467467
/// After this series of passes, no lifetime analysis based on borrowing can be done.
468468
fn run_analysis_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
469469
let passes: &[&dyn MirPass<'tcx>] = &[
470-
&add_subtyping_projections::Subtyper,
471470
&cleanup_post_borrowck::CleanupPostBorrowck,
472471
&remove_noop_landing_pads::RemoveNoopLandingPads,
473472
&simplify::SimplifyCfg::EarlyOpt,
@@ -483,6 +482,7 @@ fn run_runtime_lowering_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
483482
// These next passes must be executed together
484483
&add_call_guards::CriticalCallEdges,
485484
&reveal_all::RevealAll, // has to be done before drop elaboration, since we need to drop opaque types, too.
485+
&add_subtyping_projections::Subtyper,
486486
&elaborate_drops::ElaborateDrops,
487487
// This will remove extraneous landing pads which are no longer
488488
// necessary as well as well as forcing any call in a non-unwinding

compiler/rustc_mir_transform/src/reveal_all.rs

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ impl<'tcx> MutVisitor<'tcx> for RevealAllVisitor<'tcx> {
4646
.filter(|elem| !matches!(elem, ProjectionElem::OpaqueCast(_)))
4747
.collect::<Vec<_>>(),
4848
);
49+
self.super_place(place, _context, _location);
4950
}
5051

5152
#[inline]

tests/mir-opt/inline/inline_generator.main.Inline.panic-abort.diff

+22-26
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
let mut _2: std::pin::Pin<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>;
88
let mut _3: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
99
let mut _4: {generator@$DIR/inline_generator.rs:16:5: 16:8};
10-
+ let mut _6: bool;
10+
+ let mut _5: bool;
1111
scope 1 {
1212
debug _r => _1;
1313
}
1414
+ scope 2 (inlined g) {
15-
+ let mut _5: {generator@$DIR/inline_generator.rs:16:5: 16:8};
1615
+ }
1716
+ scope 3 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new) {
1817
+ debug pointer => _3;
@@ -23,10 +22,10 @@
2322
+ }
2423
+ }
2524
+ scope 6 (inlined g::{closure#0}) {
26-
+ debug a => _6;
27-
+ let mut _7: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
28-
+ let mut _8: u32;
29-
+ let mut _9: i32;
25+
+ debug a => _5;
26+
+ let mut _6: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
27+
+ let mut _7: u32;
28+
+ let mut _8: i32;
3029
+ }
3130

3231
bb0: {
@@ -35,24 +34,21 @@
3534
StorageLive(_3);
3635
StorageLive(_4);
3736
- _4 = g() -> [return: bb1, unwind unreachable];
38-
+ StorageLive(_5);
39-
+ _5 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
40-
+ _4 = move (_5 as subtype {generator@$DIR/inline_generator.rs:16:5: 16:8});
41-
+ StorageDead(_5);
37+
+ _4 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
4238
+ _3 = &mut _4;
4339
+ _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}> { pointer: move _3 };
4440
+ StorageDead(_3);
45-
+ StorageLive(_6);
46-
+ _6 = const false;
47-
+ _7 = (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
48-
+ _8 = discriminant((*_7));
49-
+ switchInt(move _8) -> [0: bb3, 1: bb7, 3: bb8, otherwise: bb9];
41+
+ StorageLive(_5);
42+
+ _5 = const false;
43+
+ _6 = (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
44+
+ _7 = discriminant((*_6));
45+
+ switchInt(move _7) -> [0: bb3, 1: bb7, 3: bb8, otherwise: bb9];
5046
}
5147

5248
bb1: {
5349
- _3 = &mut _4;
5450
- _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new(move _3) -> [return: bb2, unwind unreachable];
55-
+ StorageDead(_6);
51+
+ StorageDead(_5);
5652
+ StorageDead(_2);
5753
+ drop(_4) -> [return: bb2, unwind unreachable];
5854
}
@@ -69,27 +65,27 @@
6965
bb3: {
7066
- StorageDead(_2);
7167
- drop(_4) -> [return: bb4, unwind unreachable];
72-
+ StorageLive(_9);
73-
+ switchInt(_6) -> [0: bb4, otherwise: bb5];
68+
+ StorageLive(_8);
69+
+ switchInt(_5) -> [0: bb4, otherwise: bb5];
7470
}
7571

7672
bb4: {
7773
- StorageDead(_4);
7874
- _0 = const ();
7975
- StorageDead(_1);
8076
- return;
81-
+ _9 = const 13_i32;
77+
+ _8 = const 13_i32;
8278
+ goto -> bb6;
8379
+ }
8480
+
8581
+ bb5: {
86-
+ _9 = const 7_i32;
82+
+ _8 = const 7_i32;
8783
+ goto -> bb6;
8884
+ }
8985
+
9086
+ bb6: {
91-
+ _1 = GeneratorState::<i32, bool>::Yielded(move _9);
92-
+ discriminant((*_7)) = 3;
87+
+ _1 = GeneratorState::<i32, bool>::Yielded(move _8);
88+
+ discriminant((*_6)) = 3;
9389
+ goto -> bb1;
9490
+ }
9591
+
@@ -98,10 +94,10 @@
9894
+ }
9995
+
10096
+ bb8: {
101-
+ StorageLive(_9);
102-
+ StorageDead(_9);
103-
+ _1 = GeneratorState::<i32, bool>::Complete(_6);
104-
+ discriminant((*_7)) = 1;
97+
+ StorageLive(_8);
98+
+ StorageDead(_8);
99+
+ _1 = GeneratorState::<i32, bool>::Complete(_5);
100+
+ discriminant((*_6)) = 1;
105101
+ goto -> bb1;
106102
+ }
107103
+

tests/mir-opt/inline/inline_generator.main.Inline.panic-unwind.diff

+22-26
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@
77
let mut _2: std::pin::Pin<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>;
88
let mut _3: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
99
let mut _4: {generator@$DIR/inline_generator.rs:16:5: 16:8};
10-
+ let mut _6: bool;
10+
+ let mut _5: bool;
1111
scope 1 {
1212
debug _r => _1;
1313
}
1414
+ scope 2 (inlined g) {
15-
+ let mut _5: {generator@$DIR/inline_generator.rs:16:5: 16:8};
1615
+ }
1716
+ scope 3 (inlined Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new) {
1817
+ debug pointer => _3;
@@ -23,10 +22,10 @@
2322
+ }
2423
+ }
2524
+ scope 6 (inlined g::{closure#0}) {
26-
+ debug a => _6;
27-
+ let mut _7: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
28-
+ let mut _8: u32;
29-
+ let mut _9: i32;
25+
+ debug a => _5;
26+
+ let mut _6: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8};
27+
+ let mut _7: u32;
28+
+ let mut _8: i32;
3029
+ }
3130

3231
bb0: {
@@ -38,10 +37,7 @@
3837
- }
3938
-
4039
- bb1: {
41-
+ StorageLive(_5);
42-
+ _5 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
43-
+ _4 = move (_5 as subtype {generator@$DIR/inline_generator.rs:16:5: 16:8});
44-
+ StorageDead(_5);
40+
+ _4 = {generator@$DIR/inline_generator.rs:16:5: 16:8 (#0)};
4541
_3 = &mut _4;
4642
- _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}>::new(move _3) -> [return: bb2, unwind: bb5];
4743
- }
@@ -50,16 +46,16 @@
5046
+ _2 = Pin::<&mut {generator@$DIR/inline_generator.rs:16:5: 16:8}> { pointer: move _3 };
5147
StorageDead(_3);
5248
- _1 = <{generator@$DIR/inline_generator.rs:16:5: 16:8} as Generator<bool>>::resume(move _2, const false) -> [return: bb3, unwind: bb5];
53-
+ StorageLive(_6);
54-
+ _6 = const false;
55-
+ _7 = (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
56-
+ _8 = discriminant((*_7));
57-
+ switchInt(move _8) -> [0: bb5, 1: bb9, 3: bb10, otherwise: bb11];
49+
+ StorageLive(_5);
50+
+ _5 = const false;
51+
+ _6 = (_2.0: &mut {generator@$DIR/inline_generator.rs:16:5: 16:8});
52+
+ _7 = discriminant((*_6));
53+
+ switchInt(move _7) -> [0: bb5, 1: bb9, 3: bb10, otherwise: bb11];
5854
}
5955

6056
- bb3: {
6157
+ bb1: {
62-
+ StorageDead(_6);
58+
+ StorageDead(_5);
6359
StorageDead(_2);
6460
- drop(_4) -> [return: bb4, unwind: bb6];
6561
+ drop(_4) -> [return: bb2, unwind: bb4];
@@ -85,23 +81,23 @@
8581
+ }
8682
+
8783
+ bb5: {
88-
+ StorageLive(_9);
89-
+ switchInt(_6) -> [0: bb6, otherwise: bb7];
84+
+ StorageLive(_8);
85+
+ switchInt(_5) -> [0: bb6, otherwise: bb7];
9086
+ }
9187
+
9288
+ bb6: {
93-
+ _9 = const 13_i32;
89+
+ _8 = const 13_i32;
9490
+ goto -> bb8;
9591
+ }
9692
+
9793
+ bb7: {
98-
+ _9 = const 7_i32;
94+
+ _8 = const 7_i32;
9995
+ goto -> bb8;
10096
+ }
10197
+
10298
+ bb8: {
103-
+ _1 = GeneratorState::<i32, bool>::Yielded(move _9);
104-
+ discriminant((*_7)) = 3;
99+
+ _1 = GeneratorState::<i32, bool>::Yielded(move _8);
100+
+ discriminant((*_6)) = 3;
105101
+ goto -> bb1;
106102
+ }
107103
+
@@ -110,10 +106,10 @@
110106
+ }
111107
+
112108
+ bb10: {
113-
+ StorageLive(_9);
114-
+ StorageDead(_9);
115-
+ _1 = GeneratorState::<i32, bool>::Complete(_6);
116-
+ discriminant((*_7)) = 1;
109+
+ StorageLive(_8);
110+
+ StorageDead(_8);
111+
+ _1 = GeneratorState::<i32, bool>::Complete(_5);
112+
+ discriminant((*_6)) = 1;
117113
+ goto -> bb1;
118114
+ }
119115
+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// check-pass
2+
// compile-flags: -Z mir-opt-level=3
3+
#![feature(type_alias_impl_trait)]
4+
#![crate_type = "lib"]
5+
pub trait Tr {
6+
fn get(&self) -> u32;
7+
}
8+
9+
impl Tr for (u32,) {
10+
#[inline]
11+
fn get(&self) -> u32 { self.0 }
12+
}
13+
14+
pub fn tr1() -> impl Tr {
15+
(32,)
16+
}
17+
18+
pub fn tr2() -> impl Tr {
19+
struct Inner {
20+
x: X,
21+
}
22+
type X = impl Tr;
23+
impl Tr for Inner {
24+
fn get(&self) -> u32 {
25+
self.x.get()
26+
}
27+
}
28+
29+
Inner {
30+
x: tr1(),
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
// check-pass
2+
3+
#![feature(type_alias_impl_trait)]
4+
5+
fn enum_upvar() {
6+
type T = impl Copy;
7+
let foo: T = Some((1u32, 2u32));
8+
let x = move || match foo {
9+
None => (),
10+
Some((a, b)) => (),
11+
};
12+
}
13+
14+
fn main(){}
+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// check-pass
2+
// compile-flags: -Zvalidate-mir
3+
trait Duh {}
4+
5+
impl Duh for i32 {}
6+
7+
trait Trait {
8+
type Assoc: Duh;
9+
}
10+
11+
impl<R: Duh, F: FnMut() -> R> Trait for F {
12+
type Assoc = R;
13+
}
14+
15+
fn foo() -> impl Trait<Assoc = impl Send> {
16+
|| 42
17+
}
18+
19+
fn main() {}

0 commit comments

Comments
 (0)