@@ -167,27 +167,40 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
167
167
168
168
if result. rerun {
169
169
// We probe again, taking all traits into account (not only those in scope).
170
- if let Ok ( new_pick) = self . lookup_probe ( span,
171
- segment. name ,
172
- self_ty,
173
- call_expr,
174
- ProbeScope :: AllTraits ) {
175
- // If we find a different result, the caller probably forgot to import the trait.
176
- // We span an error with an appropriate help message.
177
- if new_pick != pick {
178
- let error = MethodError :: NoMatch (
179
- NoMatchData :: new ( Vec :: new ( ) ,
180
- Vec :: new ( ) ,
181
- vec ! [ new_pick. item. container. id( ) ] ,
182
- probe:: Mode :: MethodCall )
183
- ) ;
184
- self . report_method_error ( span,
185
- self_ty,
186
- segment. name ,
187
- Some ( self_expr) ,
188
- error,
189
- None ) ;
190
- }
170
+ let candidates =
171
+ match self . lookup_probe ( span,
172
+ segment. name ,
173
+ self_ty,
174
+ call_expr,
175
+ ProbeScope :: AllTraits ) {
176
+ Ok ( ref new_pick) if * new_pick != pick => vec ! [ new_pick. item. container. id( ) ] ,
177
+ Err ( MethodError :: Ambiguity ( ref sources) ) => {
178
+ sources. iter ( )
179
+ . filter_map ( |source| {
180
+ match * source {
181
+ // Note: this cannot come from an inherent impl,
182
+ // because the first probe succeeded.
183
+ ImplSource ( def) => self . tcx . trait_id_of_impl ( def) ,
184
+ TraitSource ( _) => None ,
185
+ }
186
+ } )
187
+ . collect ( )
188
+ }
189
+ _ => Vec :: new ( ) ,
190
+ } ;
191
+
192
+ // If we find a different result, the caller probably forgot to import a trait.
193
+ // We span an error with an appropriate help message.
194
+ if !candidates. is_empty ( ) {
195
+ let error = MethodError :: NoMatch (
196
+ NoMatchData :: new ( Vec :: new ( ) , Vec :: new ( ) , candidates, probe:: Mode :: MethodCall )
197
+ ) ;
198
+ self . report_method_error ( span,
199
+ self_ty,
200
+ segment. name ,
201
+ Some ( self_expr) ,
202
+ error,
203
+ None ) ;
191
204
}
192
205
}
193
206
0 commit comments