@@ -42,9 +42,10 @@ use std::{mem, ptr};
4242#[ derive( Clone , Debug ) ]
4343pub enum ImportDirectiveSubclass < ' a > {
4444 SingleImport {
45- target : Ident ,
4645 source : Ident ,
47- result : PerNS < Cell < Result < & ' a NameBinding < ' a > , Determinacy > > > ,
46+ target : Ident ,
47+ source_bindings : PerNS < Cell < Result < & ' a NameBinding < ' a > , Determinacy > > > ,
48+ target_bindings : PerNS < Cell < Option < & ' a NameBinding < ' a > > > > ,
4849 type_ns_only : bool ,
4950 } ,
5051 GlobImport {
@@ -227,6 +228,11 @@ impl<'a, 'crateloader> Resolver<'a, 'crateloader> {
227228 }
228229
229230 let check_usable = |this : & mut Self , binding : & ' a NameBinding < ' a > | {
231+ if let Some ( blacklisted_binding) = this. blacklisted_binding {
232+ if ptr:: eq ( binding, blacklisted_binding) {
233+ return Err ( ( Determined , Weak :: No ) ) ;
234+ }
235+ }
230236 // `extern crate` are always usable for backwards compatibility, see issue #37020,
231237 // remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`.
232238 let usable = this. is_accessible ( binding. vis ) || binding. is_extern_crate ( ) ;
@@ -642,10 +648,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
642648 if let Some ( ( span, err, note) ) = self . finalize_import ( import) {
643649 errors = true ;
644650
645- if let SingleImport { source, ref result , .. } = import. subclass {
651+ if let SingleImport { source, ref source_bindings , .. } = import. subclass {
646652 if source. name == "self" {
647653 // Silence `unresolved import` error if E0429 is already emitted
648- if let Err ( Determined ) = result . value_ns . get ( ) {
654+ if let Err ( Determined ) = source_bindings . value_ns . get ( ) {
649655 continue ;
650656 }
651657 }
@@ -765,9 +771,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
765771 } ;
766772
767773 directive. imported_module . set ( Some ( module) ) ;
768- let ( source, target, result, type_ns_only) = match directive. subclass {
769- SingleImport { source, target, ref result, type_ns_only } =>
770- ( source, target, result, type_ns_only) ,
774+ let ( source, target, source_bindings, target_bindings, type_ns_only) =
775+ match directive. subclass {
776+ SingleImport { source, target, ref source_bindings,
777+ ref target_bindings, type_ns_only } =>
778+ ( source, target, source_bindings, target_bindings, type_ns_only) ,
771779 GlobImport { .. } => {
772780 self . resolve_glob_import ( directive) ;
773781 return true ;
@@ -777,7 +785,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
777785
778786 let mut indeterminate = false ;
779787 self . per_ns ( |this, ns| if !type_ns_only || ns == TypeNS {
780- if let Err ( Undetermined ) = result [ ns] . get ( ) {
788+ if let Err ( Undetermined ) = source_bindings [ ns] . get ( ) {
781789 // For better failure detection, pretend that the import will
782790 // not define any names while resolving its module path.
783791 let orig_vis = directive. vis . replace ( ty:: Visibility :: Invisible ) ;
@@ -786,13 +794,13 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
786794 ) ;
787795 directive. vis . set ( orig_vis) ;
788796
789- result [ ns] . set ( binding) ;
797+ source_bindings [ ns] . set ( binding) ;
790798 } else {
791799 return
792800 } ;
793801
794802 let parent = directive. parent_scope . module ;
795- match result [ ns] . get ( ) {
803+ match source_bindings [ ns] . get ( ) {
796804 Err ( Undetermined ) => indeterminate = true ,
797805 Err ( Determined ) => {
798806 this. update_resolution ( parent, target, ns, |_, resolution| {
@@ -810,6 +818,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
810818 }
811819 Ok ( binding) => {
812820 let imported_binding = this. import ( binding, directive) ;
821+ target_bindings[ ns] . set ( Some ( imported_binding) ) ;
813822 let conflict = this. try_define ( parent, target, ns, imported_binding) ;
814823 if let Err ( old_binding) = conflict {
815824 this. report_conflict ( parent, target, ns, imported_binding, old_binding) ;
@@ -879,8 +888,9 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
879888 PathResult :: Indeterminate | PathResult :: NonModule ( ..) => unreachable ! ( ) ,
880889 } ;
881890
882- let ( ident, result, type_ns_only) = match directive. subclass {
883- SingleImport { source, ref result, type_ns_only, .. } => ( source, result, type_ns_only) ,
891+ let ( ident, source_bindings, target_bindings, type_ns_only) = match directive. subclass {
892+ SingleImport { source, ref source_bindings, ref target_bindings, type_ns_only, .. } =>
893+ ( source, source_bindings, target_bindings, type_ns_only) ,
884894 GlobImport { is_prelude, ref max_vis } => {
885895 if directive. module_path . len ( ) <= 1 {
886896 // HACK(eddyb) `lint_if_path_starts_with_module` needs at least
@@ -919,17 +929,20 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
919929 let mut all_ns_err = true ;
920930 self . per_ns ( |this, ns| if !type_ns_only || ns == TypeNS {
921931 let orig_vis = directive. vis . replace ( ty:: Visibility :: Invisible ) ;
932+ let orig_blacklisted_binding =
933+ mem:: replace ( & mut this. blacklisted_binding , target_bindings[ ns] . get ( ) ) ;
922934 let orig_last_import_segment = mem:: replace ( & mut this. last_import_segment , true ) ;
923935 let binding = this. resolve_ident_in_module (
924936 module, ident, ns, Some ( & directive. parent_scope ) , true , directive. span
925937 ) ;
926938 this. last_import_segment = orig_last_import_segment;
939+ this. blacklisted_binding = orig_blacklisted_binding;
927940 directive. vis . set ( orig_vis) ;
928941
929942 match binding {
930943 Ok ( binding) => {
931944 // Consistency checks, analogous to `finalize_current_module_macro_resolutions`.
932- let initial_def = result [ ns] . get ( ) . map ( |initial_binding| {
945+ let initial_def = source_bindings [ ns] . get ( ) . map ( |initial_binding| {
933946 all_ns_err = false ;
934947 this. record_use ( ident, ns, initial_binding,
935948 directive. module_path . is_empty ( ) ) ;
@@ -1034,7 +1047,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10341047 let mut reexport_error = None ;
10351048 let mut any_successful_reexport = false ;
10361049 self . per_ns ( |this, ns| {
1037- if let Ok ( binding) = result [ ns] . get ( ) {
1050+ if let Ok ( binding) = source_bindings [ ns] . get ( ) {
10381051 let vis = directive. vis . get ( ) ;
10391052 if !binding. pseudo_vis ( ) . is_at_least ( vis, & * this) {
10401053 reexport_error = Some ( ( ns, binding) ) ;
@@ -1078,7 +1091,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10781091 let mut full_path = directive. module_path . clone ( ) ;
10791092 full_path. push ( Segment :: from_ident ( ident) ) ;
10801093 self . per_ns ( |this, ns| {
1081- if let Ok ( binding) = result [ ns] . get ( ) {
1094+ if let Ok ( binding) = source_bindings [ ns] . get ( ) {
10821095 this. lint_if_path_starts_with_module (
10831096 directive. crate_lint ( ) ,
10841097 & full_path,
@@ -1092,7 +1105,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10921105 // Record what this import resolves to for later uses in documentation,
10931106 // this may resolve to either a value or a type, but for documentation
10941107 // purposes it's good enough to just favor one over the other.
1095- self . per_ns ( |this, ns| if let Some ( binding) = result [ ns] . get ( ) . ok ( ) {
1108+ self . per_ns ( |this, ns| if let Some ( binding) = source_bindings [ ns] . get ( ) . ok ( ) {
10961109 let mut def = binding. def ( ) ;
10971110 if let Def :: Macro ( def_id, _) = def {
10981111 // `DefId`s from the "built-in macro crate" should not leak from resolve because
0 commit comments