@@ -625,13 +625,14 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
625
625
626
626
// Go through all the scopes and try to resolve the name.
627
627
let rust_2015 = orig_ident. span . rust_2015 ( ) ;
628
- let ( ns, macro_kind, is_import) = match scope_set {
629
- ScopeSet :: Import ( ns) => ( ns, None , true ) ,
630
- ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) , false ) ,
631
- ScopeSet :: Module => ( TypeNS , None , false ) ,
628
+ let ( ns, macro_kind, is_import, is_absolute_path) = match scope_set {
629
+ ScopeSet :: Import ( ns) => ( ns, None , true , false ) ,
630
+ ScopeSet :: AbsolutePath ( ns) => ( ns, None , false , true ) ,
631
+ ScopeSet :: Macro ( macro_kind) => ( MacroNS , Some ( macro_kind) , false , false ) ,
632
+ ScopeSet :: Module => ( TypeNS , None , false , false ) ,
632
633
} ;
633
634
let mut where_to_resolve = match ns {
634
- _ if is_import && rust_2015 => WhereToResolve :: CrateRoot ,
635
+ _ if is_absolute_path || is_import && rust_2015 => WhereToResolve :: CrateRoot ,
635
636
TypeNS | ValueNS => WhereToResolve :: Module ( parent_scope. module ) ,
636
637
MacroNS => WhereToResolve :: DeriveHelpers ,
637
638
} ;
@@ -761,7 +762,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
761
762
}
762
763
}
763
764
WhereToResolve :: ExternPrelude => {
764
- if use_prelude {
765
+ if use_prelude || is_absolute_path {
765
766
match self . extern_prelude_get ( ident, !record_used) {
766
767
Some ( binding) => Ok ( ( binding, Flags :: PRELUDE ) ) ,
767
768
None => Err ( Determinacy :: determined (
@@ -827,6 +828,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
827
828
828
829
let ambiguity_error_kind = if is_import {
829
830
Some ( AmbiguityKind :: Import )
831
+ } else if is_absolute_path {
832
+ Some ( AmbiguityKind :: AbsolutePath )
830
833
} else if innermost_def == builtin || def == builtin {
831
834
Some ( AmbiguityKind :: BuiltinAttr )
832
835
} else if innermost_def == derive_helper || def == derive_helper {
@@ -894,10 +897,18 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
894
897
LegacyScope :: Empty => WhereToResolve :: Module ( parent_scope. module ) ,
895
898
LegacyScope :: Uninitialized => unreachable ! ( ) ,
896
899
}
897
- WhereToResolve :: CrateRoot => match ns {
900
+ WhereToResolve :: CrateRoot if is_import => match ns {
898
901
TypeNS | ValueNS => WhereToResolve :: Module ( parent_scope. module ) ,
899
902
MacroNS => WhereToResolve :: DeriveHelpers ,
900
903
}
904
+ WhereToResolve :: CrateRoot if is_absolute_path => match ns {
905
+ TypeNS => {
906
+ ident. span . adjust ( Mark :: root ( ) ) ;
907
+ WhereToResolve :: ExternPrelude
908
+ }
909
+ ValueNS | MacroNS => break ,
910
+ }
911
+ WhereToResolve :: CrateRoot => unreachable ! ( ) ,
901
912
WhereToResolve :: Module ( module) => {
902
913
match self . hygienic_lexical_parent ( module, & mut ident. span ) {
903
914
Some ( parent_module) => WhereToResolve :: Module ( parent_module) ,
@@ -915,6 +926,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
915
926
WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
916
927
WhereToResolve :: BuiltinAttrs => WhereToResolve :: LegacyPluginHelpers ,
917
928
WhereToResolve :: LegacyPluginHelpers => break , // nowhere else to search
929
+ WhereToResolve :: ExternPrelude if is_absolute_path => break ,
918
930
WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
919
931
WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
920
932
WhereToResolve :: StdLibPrelude => match ns {
0 commit comments