@@ -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 ( ) ;
@@ -646,10 +652,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
646652 if let Some ( ( span, err, note) ) = self . finalize_import ( import) {
647653 errors = true ;
648654
649- if let SingleImport { source, ref result , .. } = import. subclass {
655+ if let SingleImport { source, ref source_bindings , .. } = import. subclass {
650656 if source. name == "self" {
651657 // Silence `unresolved import` error if E0429 is already emitted
652- if let Err ( Determined ) = result . value_ns . get ( ) {
658+ if let Err ( Determined ) = source_bindings . value_ns . get ( ) {
653659 continue ;
654660 }
655661 }
@@ -769,9 +775,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
769775 } ;
770776
771777 directive. imported_module . set ( Some ( module) ) ;
772- let ( source, target, result, type_ns_only) = match directive. subclass {
773- SingleImport { source, target, ref result, type_ns_only } =>
774- ( source, target, result, type_ns_only) ,
778+ let ( source, target, source_bindings, target_bindings, type_ns_only) =
779+ match directive. subclass {
780+ SingleImport { source, target, ref source_bindings,
781+ ref target_bindings, type_ns_only } =>
782+ ( source, target, source_bindings, target_bindings, type_ns_only) ,
775783 GlobImport { .. } => {
776784 self . resolve_glob_import ( directive) ;
777785 return true ;
@@ -781,7 +789,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
781789
782790 let mut indeterminate = false ;
783791 self . per_ns ( |this, ns| if !type_ns_only || ns == TypeNS {
784- if let Err ( Undetermined ) = result [ ns] . get ( ) {
792+ if let Err ( Undetermined ) = source_bindings [ ns] . get ( ) {
785793 // For better failure detection, pretend that the import will
786794 // not define any names while resolving its module path.
787795 let orig_vis = directive. vis . replace ( ty:: Visibility :: Invisible ) ;
@@ -790,13 +798,13 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
790798 ) ;
791799 directive. vis . set ( orig_vis) ;
792800
793- result [ ns] . set ( binding) ;
801+ source_bindings [ ns] . set ( binding) ;
794802 } else {
795803 return
796804 } ;
797805
798806 let parent = directive. parent_scope . module ;
799- match result [ ns] . get ( ) {
807+ match source_bindings [ ns] . get ( ) {
800808 Err ( Undetermined ) => indeterminate = true ,
801809 Err ( Determined ) => {
802810 this. update_resolution ( parent, target, ns, |_, resolution| {
@@ -814,6 +822,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
814822 }
815823 Ok ( binding) => {
816824 let imported_binding = this. import ( binding, directive) ;
825+ target_bindings[ ns] . set ( Some ( imported_binding) ) ;
817826 let conflict = this. try_define ( parent, target, ns, imported_binding) ;
818827 if let Err ( old_binding) = conflict {
819828 this. report_conflict ( parent, target, ns, imported_binding, old_binding) ;
@@ -885,8 +894,9 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
885894 PathResult :: Indeterminate | PathResult :: NonModule ( ..) => unreachable ! ( ) ,
886895 } ;
887896
888- let ( ident, result, type_ns_only) = match directive. subclass {
889- SingleImport { source, ref result, type_ns_only, .. } => ( source, result, type_ns_only) ,
897+ let ( ident, source_bindings, target_bindings, type_ns_only) = match directive. subclass {
898+ SingleImport { source, ref source_bindings, ref target_bindings, type_ns_only, .. } =>
899+ ( source, source_bindings, target_bindings, type_ns_only) ,
890900 GlobImport { is_prelude, ref max_vis } => {
891901 if directive. module_path . len ( ) <= 1 {
892902 // HACK(eddyb) `lint_if_path_starts_with_module` needs at least
@@ -925,17 +935,20 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
925935 let mut all_ns_err = true ;
926936 self . per_ns ( |this, ns| if !type_ns_only || ns == TypeNS {
927937 let orig_vis = directive. vis . replace ( ty:: Visibility :: Invisible ) ;
938+ let orig_blacklisted_binding =
939+ mem:: replace ( & mut this. blacklisted_binding , target_bindings[ ns] . get ( ) ) ;
928940 let orig_last_import_segment = mem:: replace ( & mut this. last_import_segment , true ) ;
929941 let binding = this. resolve_ident_in_module (
930942 module, ident, ns, Some ( & directive. parent_scope ) , true , directive. span
931943 ) ;
932944 this. last_import_segment = orig_last_import_segment;
945+ this. blacklisted_binding = orig_blacklisted_binding;
933946 directive. vis . set ( orig_vis) ;
934947
935948 match binding {
936949 Ok ( binding) => {
937950 // Consistency checks, analogous to `finalize_current_module_macro_resolutions`.
938- let initial_def = result [ ns] . get ( ) . map ( |initial_binding| {
951+ let initial_def = source_bindings [ ns] . get ( ) . map ( |initial_binding| {
939952 all_ns_err = false ;
940953 this. record_use ( ident, ns, initial_binding,
941954 directive. module_path . is_empty ( ) ) ;
@@ -1040,7 +1053,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10401053 let mut reexport_error = None ;
10411054 let mut any_successful_reexport = false ;
10421055 self . per_ns ( |this, ns| {
1043- if let Ok ( binding) = result [ ns] . get ( ) {
1056+ if let Ok ( binding) = source_bindings [ ns] . get ( ) {
10441057 let vis = directive. vis . get ( ) ;
10451058 if !binding. pseudo_vis ( ) . is_at_least ( vis, & * this) {
10461059 reexport_error = Some ( ( ns, binding) ) ;
@@ -1084,7 +1097,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10841097 let mut full_path = directive. module_path . clone ( ) ;
10851098 full_path. push ( Segment :: from_ident ( ident) ) ;
10861099 self . per_ns ( |this, ns| {
1087- if let Ok ( binding) = result [ ns] . get ( ) {
1100+ if let Ok ( binding) = source_bindings [ ns] . get ( ) {
10881101 this. lint_if_path_starts_with_module (
10891102 directive. crate_lint ( ) ,
10901103 & full_path,
@@ -1098,7 +1111,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10981111 // Record what this import resolves to for later uses in documentation,
10991112 // this may resolve to either a value or a type, but for documentation
11001113 // purposes it's good enough to just favor one over the other.
1101- self . per_ns ( |this, ns| if let Some ( binding) = result [ ns] . get ( ) . ok ( ) {
1114+ self . per_ns ( |this, ns| if let Some ( binding) = source_bindings [ ns] . get ( ) . ok ( ) {
11021115 let mut def = binding. def ( ) ;
11031116 if let Def :: Macro ( def_id, _) = def {
11041117 // `DefId`s from the "built-in macro crate" should not leak from resolve because
0 commit comments