[mir-inlining] Don't inline virtual calls
Prior to this change, the test case would output `1` instead of `2` like it should.
This commit is contained in:
parent
24faa97589
commit
69eaa11633
@ -19,7 +19,7 @@ use rustc_data_structures::indexed_vec::{Idx, IndexVec};
|
||||
|
||||
use rustc::mir::*;
|
||||
use rustc::mir::visit::*;
|
||||
use rustc::ty::{self, Instance, Ty, TyCtxt};
|
||||
use rustc::ty::{self, Instance, InstanceDef, Ty, TyCtxt};
|
||||
use rustc::ty::subst::{Subst,Substs};
|
||||
|
||||
use std::collections::VecDeque;
|
||||
@ -100,12 +100,21 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> {
|
||||
param_env,
|
||||
callee_def_id,
|
||||
substs) {
|
||||
callsites.push_back(CallSite {
|
||||
callee: instance.def_id(),
|
||||
substs: instance.substs,
|
||||
bb,
|
||||
location: terminator.source_info
|
||||
});
|
||||
let is_virtual =
|
||||
if let InstanceDef::Virtual(..) = instance.def {
|
||||
true
|
||||
} else {
|
||||
false
|
||||
};
|
||||
|
||||
if !is_virtual {
|
||||
callsites.push_back(CallSite {
|
||||
callee: instance.def_id(),
|
||||
substs: instance.substs,
|
||||
bb,
|
||||
location: terminator.source_info
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
31
src/test/mir-opt/inline-trait-method.rs
Normal file
31
src/test/mir-opt/inline-trait-method.rs
Normal file
@ -0,0 +1,31 @@
|
||||
// compile-flags: -Z span_free_formats
|
||||
|
||||
fn main() {
|
||||
println!("{}", test(&()));
|
||||
}
|
||||
|
||||
fn test(x: &dyn X) -> u32 {
|
||||
x.y()
|
||||
}
|
||||
|
||||
trait X {
|
||||
fn y(&self) -> u32 {
|
||||
1
|
||||
}
|
||||
}
|
||||
|
||||
impl X for () {
|
||||
fn y(&self) -> u32 {
|
||||
2
|
||||
}
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.test.Inline.after.mir
|
||||
// ...
|
||||
// bb0: {
|
||||
// ...
|
||||
// _0 = const X::y(move _2) -> bb1;
|
||||
// }
|
||||
// ...
|
||||
// END rustc.test.Inline.after.mir
|
Loading…
x
Reference in New Issue
Block a user