about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDouglas Campos <qmx@qmx.me>2017-09-18 23:53:33 -0400
committerDouglas Campos <qmx@qmx.me>2017-09-29 22:34:46 -0400
commit3bd09dee45c045307f6a1cd41498e362c5992fd9 (patch)
tree59649601b9ebc33b9e57c2ad3d52404ec9bca123
parentbaa010561e5c109341e9a1ebe8a613fcae095884 (diff)
downloadrust-3bd09dee45c045307f6a1cd41498e362c5992fd9.tar.gz
rust-3bd09dee45c045307f6a1cd41498e362c5992fd9.zip
re-enable mir inlining across trait methods
this fixes #44389
-rw-r--r--src/librustc_mir/transform/inline.rs31
1 files changed, 23 insertions, 8 deletions
diff --git a/src/librustc_mir/transform/inline.rs b/src/librustc_mir/transform/inline.rs
index 48a21dfdbd4..41eaf864ca4 100644
--- a/src/librustc_mir/transform/inline.rs
+++ b/src/librustc_mir/transform/inline.rs
@@ -18,7 +18,7 @@ use rustc_data_structures::indexed_vec::{Idx, IndexVec};
 use rustc::mir::*;
 use rustc::mir::transform::{MirPass, MirSource};
 use rustc::mir::visit::*;
-use rustc::ty::{self, Ty, TyCtxt};
+use rustc::ty::{self, Ty, TyCtxt, Instance};
 use rustc::ty::subst::{Subst,Substs};
 
 use std::collections::VecDeque;
@@ -88,13 +88,28 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> {
                 if let TerminatorKind::Call {
                     func: Operand::Constant(ref f), .. } = terminator.kind {
                     if let ty::TyFnDef(callee_def_id, substs) = f.ty.sty {
-                        if self.tcx.trait_of_item(callee_def_id).is_none() {
-                            callsites.push_back(CallSite {
-                                callee: callee_def_id,
-                                substs,
-                                bb,
-                                location: terminator.source_info
-                            });
+                        match self.tcx.trait_of_item(callee_def_id) {
+                            Some(_) => {
+                                match Instance::new(callee_def_id, substs).resolve(self.tcx) {
+                                    Some(instance) => {
+                                        callsites.push_back(CallSite {
+                                            callee: instance.def_id(),
+                                            substs: instance.substs,
+                                            bb,
+                                            location: terminator.source_info
+                                        });
+                                    },
+                                    None => {}
+                                }
+                            }
+                            None => {
+                                callsites.push_back(CallSite {
+                                    callee: callee_def_id,
+                                    substs,
+                                    bb,
+                                    location: terminator.source_info
+                                });
+                            }
                         }
                     }
                 }