@@ -19,7 +19,7 @@ use crate::{
1919    AmbiguityError ,  AmbiguityErrorMisc ,  AmbiguityKind ,  BindingKey ,  CmResolver ,  Determinacy , 
2020    Finalize ,  ImportKind ,  LexicalScopeBinding ,  Module ,  ModuleKind ,  ModuleOrUniformRoot , 
2121    NameBinding ,  NameBindingKind ,  ParentScope ,  PathResult ,  PrivacyError ,  Res ,  ResolutionError , 
22-     Resolver ,  Scope ,  ScopeSet ,  Segment ,  Used ,  Weak ,  errors, 
22+     Resolver ,  Scope ,  ScopeSet ,  Segment ,  Shadowing ,   Used ,  Weak ,  errors, 
2323} ; 
2424
2525#[ derive( Copy ,  Clone ) ]  
@@ -34,12 +34,6 @@ impl From<UsePrelude> for bool {
3434    } 
3535} 
3636
37- #[ derive( Debug ,  PartialEq ,  Clone ,  Copy ) ]  
38- enum  Shadowing  { 
39-     Restricted , 
40-     Unrestricted , 
41- } 
42- 
4337bitflags:: bitflags! { 
4438    #[ derive( Clone ,  Copy ,  Debug ) ] 
4539    struct  Flags :  u8  { 
@@ -113,18 +107,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
113107        let  ( ns,  macro_kind)  = match  scope_set { 
114108            ScopeSet :: All ( ns) 
115109            | ScopeSet :: ModuleAndExternPrelude ( ns,  _) 
116-             | ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
110+             | ScopeSet :: Module ( _,  ns,  _)  => ( ns,  None ) , 
111+             ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
117112            ScopeSet :: Macro ( macro_kind)  => ( MacroNS ,  Some ( macro_kind) ) , 
118113        } ; 
119114        let  module = match  scope_set { 
120115            // Start with the specified module. 
121-             ScopeSet :: Late ( _,  module,  _)  | ScopeSet :: ModuleAndExternPrelude ( _,  module)  => module, 
116+             ScopeSet :: Late ( _,  module,  _) 
117+             | ScopeSet :: ModuleAndExternPrelude ( _,  module) 
118+             | ScopeSet :: Module ( module,  ..)  => module, 
122119            // Jump out of trait or enum modules, they do not act as scopes. 
123120            _ => parent_scope. module . nearest_item_scope ( ) , 
124121        } ; 
122+ 
123+         let  module_scope = matches ! ( scope_set,  ScopeSet :: Module ( ..) ) ; 
125124        let  module_and_extern_prelude = matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) ) ; 
126125        let  mut  scope = match  ns { 
127-             _ if  module_and_extern_prelude => Scope :: NonGlobModule ( module,  None ) , 
126+             _ if  ( module_and_extern_prelude || module_scope )  => Scope :: NonGlobModule ( module,  None ) , 
128127            TypeNS  | ValueNS  => Scope :: NonGlobModule ( module,  None ) , 
129128            MacroNS  => Scope :: DeriveHelpers ( parent_scope. expansion ) , 
130129        } ; 
@@ -198,6 +197,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
198197                    } 
199198                    ValueNS  | MacroNS  => break , 
200199                } , 
200+                 Scope :: GlobModule ( ..)  if  module_scope => break , 
201201                Scope :: NonGlobModule ( module,  prev_lint_id)  => { 
202202                    use_prelude = !module. no_implicit_prelude ; 
203203                    Scope :: GlobModule ( module,  prev_lint_id) 
@@ -417,7 +417,8 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
417417        let  ( ns,  macro_kind)  = match  scope_set { 
418418            ScopeSet :: All ( ns) 
419419            | ScopeSet :: ModuleAndExternPrelude ( ns,  _) 
420-             | ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
420+             | ScopeSet :: Module ( _,  ns,  _)  => ( ns,  None ) , 
421+             ScopeSet :: Late ( ns,  ..)  => ( ns,  None ) , 
421422            ScopeSet :: Macro ( macro_kind)  => ( MacroNS ,  Some ( macro_kind) ) , 
422423        } ; 
423424
@@ -500,7 +501,9 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
500501                    } , 
501502                    Scope :: NonGlobModule ( module,  derive_fallback_lint_id)  => { 
502503                        let  ( adjusted_parent_scope,  finalize)  =
503-                             if  matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) )  { 
504+                             if  matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) ) 
505+                                 || matches ! ( scope_set,  ScopeSet :: Module ( ..) ) 
506+                             { 
504507                                ( parent_scope,  finalize) 
505508                            }  else  { 
506509                                ( 
@@ -514,10 +517,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
514517                            ident, 
515518                            ns, 
516519                            adjusted_parent_scope, 
517-                             if   matches ! ( scope_set,   ScopeSet :: Late ( .. ) )  { 
518-                                 Shadowing :: Unrestricted 
519-                             }   else   { 
520-                                 Shadowing :: Restricted 
520+                             match   scope_set { 
521+                                 ScopeSet :: Late ( .. )  =>  Shadowing :: Unrestricted , 
522+                                  ScopeSet :: Module ( _ ,  _ ,  shadowing )  => shadowing , 
523+                                 _ =>  Shadowing :: Restricted , 
521524                            } , 
522525                            finalize, 
523526                            ignore_binding, 
@@ -539,6 +542,12 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
539542                                    ) ; 
540543                                } 
541544
545+                                 // Don't visit Scope::GlobModule after successful resolution in 
546+                                 // Scope::NonGlobModule with ScopeSet::Module. 
547+                                 if  matches ! ( scope_set,  ScopeSet :: Module ( ..) )  { 
548+                                     return  Some ( Ok ( binding) ) ; 
549+                                 } 
550+ 
542551                                let  misc_flags = this. create_module_misc_flags ( module) ; 
543552                                Ok ( ( binding,  Flags :: NON_GLOB_MODULE  | misc_flags) ) 
544553                            } 
@@ -548,12 +557,23 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
548557                            Err ( ( Determinacy :: Undetermined ,  Weak :: Yes ) )  => { 
549558                                Err ( Determinacy :: Undetermined ) 
550559                            } 
551-                             Err ( ( Determinacy :: Determined ,  _) )  => Err ( Determinacy :: Determined ) , 
560+                             Err ( ( Determinacy :: Determined ,  weak) )  => { 
561+                                 // Only go through Glob Scope with `Weak::Yes` errors in ScopeSet::Module 
562+                                 if  matches ! ( scope_set,  ScopeSet :: Module ( ..) ) 
563+                                     && matches ! ( weak,  Weak :: No ) 
564+                                 { 
565+                                     return  Some ( Err ( Determinacy :: Determined ) ) ; 
566+                                 } 
567+ 
568+                                 Err ( Determinacy :: Determined ) 
569+                             } 
552570                        } 
553571                    } 
554572                    Scope :: GlobModule ( module,  derive_fallback_lint_id)  => { 
555573                        let  ( adjusted_parent_scope,  finalize)  =
556-                             if  matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) )  { 
574+                             if  matches ! ( scope_set,  ScopeSet :: ModuleAndExternPrelude ( ..) ) 
575+                                 || matches ! ( scope_set,  ScopeSet :: Module ( ..) ) 
576+                             { 
557577                                ( parent_scope,  finalize) 
558578                            }  else  { 
559579                                ( 
@@ -567,10 +587,10 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
567587                            ident, 
568588                            ns, 
569589                            adjusted_parent_scope, 
570-                             if   matches ! ( scope_set,   ScopeSet :: Late ( .. ) )  { 
571-                                 Shadowing :: Unrestricted 
572-                             }   else   { 
573-                                 Shadowing :: Restricted 
590+                             match   scope_set { 
591+                                 ScopeSet :: Late ( .. )  =>  Shadowing :: Unrestricted , 
592+                                  ScopeSet :: Module ( _ ,  _ ,  shadowing )  => shadowing , 
593+                                 _ =>  Shadowing :: Restricted , 
574594                            } , 
575595                            finalize. map ( |finalize| Finalize  {  used :  Used :: Scope ,  ..finalize } ) , 
576596                            ignore_binding, 
@@ -831,7 +851,6 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
831851        ignore_import :  Option < Import < ' ra > > , 
832852    )  -> Result < NameBinding < ' ra > ,  Determinacy >  { 
833853        self . resolve_ident_in_module ( module,  ident,  ns,  parent_scope,  None ,  None ,  ignore_import) 
834-             . map_err ( |( determinacy,  _) | determinacy) 
835854    } 
836855
837856    #[ instrument( level = "debug" ,  skip( self ) ) ]  
@@ -844,7 +863,7 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
844863        finalize :  Option < Finalize > , 
845864        ignore_binding :  Option < NameBinding < ' ra > > , 
846865        ignore_import :  Option < Import < ' ra > > , 
847-     )  -> Result < NameBinding < ' ra > ,  ( Determinacy ,   Weak ) >  { 
866+     )  -> Result < NameBinding < ' ra > ,  Determinacy >  { 
848867        let  tmp_parent_scope; 
849868        let  mut  adjusted_parent_scope = parent_scope; 
850869        match  module { 
@@ -888,35 +907,42 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
888907        // "self-confirming" import resolutions during import validation and checking. 
889908        ignore_binding :  Option < NameBinding < ' ra > > , 
890909        ignore_import :  Option < Import < ' ra > > , 
891-     )  -> Result < NameBinding < ' ra > ,  ( Determinacy ,  Weak ) >  { 
892-         let  module = match  module { 
893-             ModuleOrUniformRoot :: Module ( module)  => module, 
910+     )  -> Result < NameBinding < ' ra > ,  Determinacy >  { 
911+         match  module { 
912+             ModuleOrUniformRoot :: Module ( module)  => self . early_resolve_ident_in_lexical_scope ( 
913+                 ident, 
914+                 ScopeSet :: Module ( module,  ns,  shadowing) , 
915+                 parent_scope, 
916+                 finalize, 
917+                 finalize. is_some ( ) , 
918+                 ignore_binding, 
919+                 ignore_import, 
920+             ) , 
894921            ModuleOrUniformRoot :: ModuleAndExternPrelude ( module)  => { 
895922                assert_eq ! ( shadowing,  Shadowing :: Unrestricted ) ; 
896-                 let  binding =  self . early_resolve_ident_in_lexical_scope ( 
923+                 self . early_resolve_ident_in_lexical_scope ( 
897924                    ident, 
898925                    ScopeSet :: ModuleAndExternPrelude ( ns,  module) , 
899926                    parent_scope, 
900927                    finalize, 
901928                    finalize. is_some ( ) , 
902929                    ignore_binding, 
903930                    ignore_import, 
904-                 ) ; 
905-                 return  binding. map_err ( |determinacy| ( determinacy,  Weak :: No ) ) ; 
931+                 ) 
906932            } 
907933            ModuleOrUniformRoot :: ExternPrelude  => { 
908934                assert_eq ! ( shadowing,  Shadowing :: Unrestricted ) ; 
909935                return  if  ns != TypeNS  { 
910-                     Err ( ( Determined ,   Weak :: No ) ) 
936+                     Err ( Determined ) 
911937                }  else  if  let  Some ( binding)  =
912938                    self . reborrow ( ) . extern_prelude_get ( ident,  finalize. is_some ( ) ) 
913939                { 
914940                    Ok ( binding) 
915941                }  else  if  !self . graph_root . unexpanded_invocations . borrow ( ) . is_empty ( )  { 
916942                    // Macro-expanded `extern crate` items can add names to extern prelude. 
917-                     Err ( ( Undetermined ,   Weak :: No ) ) 
943+                     Err ( Undetermined ) 
918944                }  else  { 
919-                     Err ( ( Determined ,   Weak :: No ) ) 
945+                     Err ( Determined ) 
920946                } ; 
921947            } 
922948            ModuleOrUniformRoot :: CurrentScope  => { 
@@ -932,47 +958,17 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
932958                    } 
933959                } 
934960
935-                 let  binding =  self . early_resolve_ident_in_lexical_scope ( 
961+                 self . early_resolve_ident_in_lexical_scope ( 
936962                    ident, 
937963                    ScopeSet :: All ( ns) , 
938964                    parent_scope, 
939965                    finalize, 
940966                    finalize. is_some ( ) , 
941967                    ignore_binding, 
942968                    ignore_import, 
943-                 ) ; 
944-                 return  binding. map_err ( |determinacy| ( determinacy,  Weak :: No ) ) ; 
945-             } 
946-         } ; 
947- 
948-         match  self . reborrow ( ) . resolve_ident_in_non_glob_module_unadjusted ( 
949-             module, 
950-             ident, 
951-             ns, 
952-             parent_scope, 
953-             shadowing, 
954-             finalize, 
955-             ignore_binding, 
956-             ignore_import, 
957-         )  { 
958-             Ok ( binding)  => return  Ok ( binding) , 
959-             Err ( ( _,  Weak :: No ) )  => { 
960-                 return  Err ( ( Determined ,  Weak :: No ) ) ; 
969+                 ) 
961970            } 
962-             // no non-glob binding was found, check for glob binding 
963-             Err ( ( _,  Weak :: Yes ) )  => { } 
964971        } 
965- 
966-         self . reborrow ( ) . resolve_ident_in_glob_module_unadjusted ( 
967-             module, 
968-             ident, 
969-             ns, 
970-             parent_scope, 
971-             shadowing, 
972-             finalize, 
973-             ignore_binding, 
974-             ignore_import, 
975-         ) 
976972    } 
977973
978974    fn  resolve_ident_in_non_glob_module_unadjusted < ' r > ( 
@@ -1176,13 +1172,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
11761172            ) ; 
11771173
11781174            match  result { 
1179-                 Err ( ( Determined ,  _ ) )  => continue , 
1175+                 Err ( Determined )  => continue , 
11801176                Ok ( binding) 
11811177                    if  !self . is_accessible_from ( binding. vis ,  glob_import. parent_scope . module )  =>
11821178                { 
11831179                    continue ; 
11841180                } 
1185-                 Ok ( _)  | Err ( ( Undetermined ,  _ ) )  => return  ( Undetermined ,  Weak :: Yes ) , 
1181+                 Ok ( _)  | Err ( Undetermined )  => return  ( Undetermined ,  Weak :: Yes ) , 
11861182            } 
11871183        } 
11881184
@@ -1332,13 +1328,13 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
13321328                ignore_binding, 
13331329                ignore_import, 
13341330            )  { 
1335-                 Err ( ( Determined ,  _ ) )  => continue , 
1331+                 Err ( Determined )  => continue , 
13361332                Ok ( binding) 
13371333                    if  !self . is_accessible_from ( binding. vis ,  single_import. parent_scope . module )  =>
13381334                { 
13391335                    continue ; 
13401336                } 
1341-                 Ok ( _)  | Err ( ( Undetermined ,  _ ) )  => { 
1337+                 Ok ( _)  | Err ( Undetermined )  => { 
13421338                    return  true ; 
13431339                } 
13441340            } 
@@ -1803,17 +1799,15 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
18031799            } 
18041800
18051801            let  binding = if  let  Some ( module)  = module { 
1806-                 self . reborrow ( ) 
1807-                     . resolve_ident_in_module ( 
1808-                         module, 
1809-                         ident, 
1810-                         ns, 
1811-                         parent_scope, 
1812-                         finalize, 
1813-                         ignore_binding, 
1814-                         ignore_import, 
1815-                     ) 
1816-                     . map_err ( |( determinacy,  _) | determinacy) 
1802+                 self . reborrow ( ) . resolve_ident_in_module ( 
1803+                     module, 
1804+                     ident, 
1805+                     ns, 
1806+                     parent_scope, 
1807+                     finalize, 
1808+                     ignore_binding, 
1809+                     ignore_import, 
1810+                 ) 
18171811            }  else  if  let  Some ( ribs)  = ribs
18181812                && let  Some ( TypeNS  | ValueNS )  = opt_ns
18191813            { 
0 commit comments