26
26
use std:: ops:: { Deref , DerefMut } ;
27
27
28
28
use crate :: Resolver ;
29
- use crate :: resolve_imports:: ImportDirectiveSubclass ;
29
+ use crate :: resolve_imports:: { ImportDirective , ImportDirectiveSubclass } ;
30
30
31
31
use rustc:: util:: nodemap:: NodeMap ;
32
32
use rustc:: { lint, ty} ;
@@ -283,7 +283,15 @@ pub fn check_crate(resolver: &mut Resolver<'_>, krate: &ast::Crate) {
283
283
} ;
284
284
visit:: walk_crate ( & mut visitor, krate) ;
285
285
286
- for unused in visitor. unused_imports . values ( ) {
286
+ let mut silencing_spans: Vec < Span > = visitor. privacy_errors
287
+ . iter ( )
288
+ . map ( |crate :: PrivacyError ( span, _, _) | span)
289
+ . chain ( visitor. indeterminate_imports . iter ( ) . map ( |ImportDirective { span, .. } | span) )
290
+ . chain ( visitor. unresolved_imports . iter ( ) )
291
+ . map ( |sp| * sp)
292
+ . collect ( ) ;
293
+
294
+ ' unused_imports: for unused in visitor. unused_imports . values ( ) {
287
295
let mut fixes = Vec :: new ( ) ;
288
296
let mut spans = match calc_unused_spans ( unused, unused. use_tree , unused. use_tree_id ) {
289
297
UnusedSpanResult :: Used => continue ,
@@ -305,6 +313,20 @@ pub fn check_crate(resolver: &mut Resolver<'_>, krate: &ast::Crate) {
305
313
306
314
let len = spans. len ( ) ;
307
315
spans. sort ( ) ;
316
+ for sp in & spans {
317
+ // Do not emit unused warnings about failed use statements (#48244)
318
+ let mut idx = None ;
319
+ for ( i, span) in silencing_spans. iter ( ) . enumerate ( ) {
320
+ if sp. overlaps ( * span) {
321
+ idx = Some ( i) ;
322
+ break ;
323
+ }
324
+ }
325
+ if let Some ( idx) = idx {
326
+ silencing_spans. remove ( idx) ; // we won't be seeing this again
327
+ continue ' unused_imports;
328
+ }
329
+ }
308
330
let ms = MultiSpan :: from_spans ( spans. clone ( ) ) ;
309
331
let mut span_snippets = spans. iter ( )
310
332
. filter_map ( |s| {
0 commit comments