]> git.lizzy.rs Git - rust.git/commitdiff
re-enable mir inlining across trait methods
authorDouglas Campos <qmx@qmx.me>
Tue, 19 Sep 2017 03:53:33 +0000 (23:53 -0400)
committerDouglas Campos <qmx@qmx.me>
Sat, 30 Sep 2017 02:34:46 +0000 (22:34 -0400)
this fixes #44389

src/librustc_mir/transform/inline.rs

index 48a21dfdbd467032026d387863a2de94054c2900..41eaf864ca47e8ca2fc1a6e6912f87752326d052 100644 (file)
@@ -18,7 +18,7 @@
 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 @@ fn run_pass(&self, caller_mir: &mut Mir<'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
+                                });
+                            }
                         }
                     }
                 }