@@ -625,13 +625,14 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
625625
626626 // Go through all the scopes and try to resolve the name.
627627 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 ) ,
632633 } ;
633634 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 ,
635636 TypeNS | ValueNS => WhereToResolve :: Module ( parent_scope. module ) ,
636637 MacroNS => WhereToResolve :: DeriveHelpers ,
637638 } ;
@@ -761,7 +762,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
761762 }
762763 }
763764 WhereToResolve :: ExternPrelude => {
764- if use_prelude {
765+ if use_prelude || is_absolute_path {
765766 match self . extern_prelude_get ( ident, !record_used) {
766767 Some ( binding) => Ok ( ( binding, Flags :: PRELUDE ) ) ,
767768 None => Err ( Determinacy :: determined (
@@ -827,6 +828,8 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
827828
828829 let ambiguity_error_kind = if is_import {
829830 Some ( AmbiguityKind :: Import )
831+ } else if is_absolute_path {
832+ Some ( AmbiguityKind :: AbsolutePath )
830833 } else if innermost_def == builtin || def == builtin {
831834 Some ( AmbiguityKind :: BuiltinAttr )
832835 } else if innermost_def == derive_helper || def == derive_helper {
@@ -894,10 +897,18 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
894897 LegacyScope :: Empty => WhereToResolve :: Module ( parent_scope. module ) ,
895898 LegacyScope :: Uninitialized => unreachable ! ( ) ,
896899 }
897- WhereToResolve :: CrateRoot => match ns {
900+ WhereToResolve :: CrateRoot if is_import => match ns {
898901 TypeNS | ValueNS => WhereToResolve :: Module ( parent_scope. module ) ,
899902 MacroNS => WhereToResolve :: DeriveHelpers ,
900903 }
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 ! ( ) ,
901912 WhereToResolve :: Module ( module) => {
902913 match self . hygienic_lexical_parent ( module, & mut ident. span ) {
903914 Some ( parent_module) => WhereToResolve :: Module ( parent_module) ,
@@ -915,6 +926,7 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
915926 WhereToResolve :: BuiltinMacros => WhereToResolve :: BuiltinAttrs ,
916927 WhereToResolve :: BuiltinAttrs => WhereToResolve :: LegacyPluginHelpers ,
917928 WhereToResolve :: LegacyPluginHelpers => break , // nowhere else to search
929+ WhereToResolve :: ExternPrelude if is_absolute_path => break ,
918930 WhereToResolve :: ExternPrelude => WhereToResolve :: ToolPrelude ,
919931 WhereToResolve :: ToolPrelude => WhereToResolve :: StdLibPrelude ,
920932 WhereToResolve :: StdLibPrelude => match ns {
0 commit comments