Skip to content

Commit 0c665e2

Browse files
committed
Auto merge of #55046 - wesleywiser:no_virtual_call_inlining, r=varkor
[mir-inlining] Don't inline virtual calls
2 parents 14f42a7 + 69eaa11 commit 0c665e2

File tree

2 files changed

+47
-7
lines changed

2 files changed

+47
-7
lines changed

src/librustc_mir/transform/inline.rs

+16-7
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc_data_structures::indexed_vec::{Idx, IndexVec};
1919

2020
use rustc::mir::*;
2121
use rustc::mir::visit::*;
22-
use rustc::ty::{self, Instance, Ty, TyCtxt};
22+
use rustc::ty::{self, Instance, InstanceDef, Ty, TyCtxt};
2323
use rustc::ty::subst::{Subst,Substs};
2424

2525
use std::collections::VecDeque;
@@ -100,12 +100,21 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> {
100100
param_env,
101101
callee_def_id,
102102
substs) {
103-
callsites.push_back(CallSite {
104-
callee: instance.def_id(),
105-
substs: instance.substs,
106-
bb,
107-
location: terminator.source_info
108-
});
103+
let is_virtual =
104+
if let InstanceDef::Virtual(..) = instance.def {
105+
true
106+
} else {
107+
false
108+
};
109+
110+
if !is_virtual {
111+
callsites.push_back(CallSite {
112+
callee: instance.def_id(),
113+
substs: instance.substs,
114+
bb,
115+
location: terminator.source_info
116+
});
117+
}
109118
}
110119
}
111120
}
+31
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// compile-flags: -Z span_free_formats
2+
3+
fn main() {
4+
println!("{}", test(&()));
5+
}
6+
7+
fn test(x: &dyn X) -> u32 {
8+
x.y()
9+
}
10+
11+
trait X {
12+
fn y(&self) -> u32 {
13+
1
14+
}
15+
}
16+
17+
impl X for () {
18+
fn y(&self) -> u32 {
19+
2
20+
}
21+
}
22+
23+
// END RUST SOURCE
24+
// START rustc.test.Inline.after.mir
25+
// ...
26+
// bb0: {
27+
// ...
28+
// _0 = const X::y(move _2) -> bb1;
29+
// }
30+
// ...
31+
// END rustc.test.Inline.after.mir

0 commit comments

Comments
 (0)