@@ -400,26 +400,30 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
400
400
}
401
401
}
402
402
403
- /// Resolves an `ImportResolvingError` into the correct enum discriminant
404
- /// and passes that on to `resolve_error`.
405
- fn import_resolving_error ( & self , e : ImportResolvingError < ' b > ) {
406
- // If it's a single failed import then create a "fake" import
407
- // resolution for it so that later resolve stages won't complain.
408
- if let SingleImport { target, .. } = e. import_directive . subclass {
403
+ // Define a "dummy" resolution containing a Def::Err as a placeholder for a
404
+ // failed resolution
405
+ fn import_dummy_binding ( & self , source_module : Module < ' b > , directive : & ' b ImportDirective < ' b > ) {
406
+ if let SingleImport { target, .. } = directive. subclass {
409
407
let dummy_binding = self . resolver . arenas . alloc_name_binding ( NameBinding {
410
408
kind : NameBindingKind :: Def ( Def :: Err ) ,
411
409
span : DUMMY_SP ,
412
410
vis : ty:: Visibility :: Public ,
413
411
} ) ;
414
- let dummy_binding = e . import_directive . import ( dummy_binding, None ) ;
412
+ let dummy_binding = directive . import ( dummy_binding, None ) ;
415
413
416
- let _ = e . source_module . try_define_child ( target, ValueNS , dummy_binding. clone ( ) ) ;
417
- let _ = e . source_module . try_define_child ( target, TypeNS , dummy_binding) ;
414
+ let _ = source_module. try_define_child ( target, ValueNS , dummy_binding. clone ( ) ) ;
415
+ let _ = source_module. try_define_child ( target, TypeNS , dummy_binding) ;
418
416
}
417
+ }
419
418
419
+ /// Resolves an `ImportResolvingError` into the correct enum discriminant
420
+ /// and passes that on to `resolve_error`.
421
+ fn import_resolving_error ( & self , e : ImportResolvingError < ' b > ) {
422
+ // If the error is a single failed import then create a "fake" import
423
+ // resolution for it so that later resolve stages won't complain.
424
+ self . import_dummy_binding ( e. source_module , e. import_directive ) ;
420
425
let path = import_path_to_string ( & e. import_directive . module_path ,
421
426
& e. import_directive . subclass ) ;
422
-
423
427
resolve_error ( self . resolver ,
424
428
e. span ,
425
429
ResolutionError :: UnresolvedImport ( Some ( ( & path, & e. help ) ) ) ) ;
@@ -500,6 +504,10 @@ impl<'a, 'b:'a> ImportResolver<'a, 'b> {
500
504
if !binding. is_importable ( ) {
501
505
let msg = format ! ( "`{}` is not directly importable" , target) ;
502
506
span_err ! ( self . resolver. session, directive. span, E0253 , "{}" , & msg) ;
507
+ // Do not import this illegal binding. Import a dummy binding and pretend
508
+ // everything is fine
509
+ self . import_dummy_binding ( module_, directive) ;
510
+ return Success ( ( ) ) ;
503
511
}
504
512
505
513
let privacy_error = if !self . resolver . is_accessible ( binding. vis ) {
0 commit comments