@@ -18,7 +18,7 @@ use rustc_data_structures::indexed_vec::{Idx, IndexVec};
18
18
use rustc:: mir:: * ;
19
19
use rustc:: mir:: transform:: { MirPass , MirSource } ;
20
20
use rustc:: mir:: visit:: * ;
21
- use rustc:: ty:: { self , Ty , TyCtxt } ;
21
+ use rustc:: ty:: { self , Ty , TyCtxt , Instance } ;
22
22
use rustc:: ty:: subst:: { Subst , Substs } ;
23
23
24
24
use std:: collections:: VecDeque ;
@@ -88,13 +88,28 @@ impl<'a, 'tcx> Inliner<'a, 'tcx> {
88
88
if let TerminatorKind :: Call {
89
89
func : Operand :: Constant ( ref f) , .. } = terminator. kind {
90
90
if let ty:: TyFnDef ( callee_def_id, substs) = f. ty . sty {
91
- if self . tcx . trait_of_item ( callee_def_id) . is_none ( ) {
92
- callsites. push_back ( CallSite {
93
- callee : callee_def_id,
94
- substs,
95
- bb,
96
- location : terminator. source_info
97
- } ) ;
91
+ match self . tcx . trait_of_item ( callee_def_id) {
92
+ Some ( _) => {
93
+ match Instance :: new ( callee_def_id, substs) . resolve ( self . tcx ) {
94
+ Some ( instance) => {
95
+ callsites. push_back ( CallSite {
96
+ callee : instance. def_id ( ) ,
97
+ substs : instance. substs ,
98
+ bb,
99
+ location : terminator. source_info
100
+ } ) ;
101
+ } ,
102
+ None => { }
103
+ }
104
+ }
105
+ None => {
106
+ callsites. push_back ( CallSite {
107
+ callee : callee_def_id,
108
+ substs,
109
+ bb,
110
+ location : terminator. source_info
111
+ } ) ;
112
+ }
98
113
}
99
114
}
100
115
}
0 commit comments