@@ -574,61 +574,54 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
574574 let mut source = module_path. pop ( ) . unwrap ( ) ;
575575 let mut type_ns_only = false ;
576576
577- if nested {
578- // Correctly handle `self`
579- if source. ident . name == kw:: SelfLower {
580- type_ns_only = true ;
581-
582- if empty_for_self ( & module_path) {
583- self . r . report_error (
584- use_tree. span ,
585- ResolutionError :: SelfImportOnlyInImportListWithNonEmptyPrefix ,
577+ match source. ident . name {
578+ kw:: Crate => {
579+ if !module_path. is_empty ( ) {
580+ self . r . dcx ( ) . span_err (
581+ ident. span ,
582+ "`crate` in paths can only be used in start position" ,
586583 ) ;
587584 return ;
588585 }
589-
590- // Replace `use foo::{ self };` with `use foo;`
591- let self_span = source. ident . span ;
592- source = module_path. pop ( ) . unwrap ( ) ;
593- if rename. is_none ( ) {
594- // Keep the span of `self`, but the name of `foo`
595- ident = Ident :: new ( source. ident . name , self_span) ;
596- }
597586 }
598- } else {
599- // Disallow `self`
600- if source. ident . name == kw:: SelfLower {
601- let parent = module_path. last ( ) ;
602-
603- let span = match parent {
604- // only `::self` from `use foo::self as bar`
605- Some ( seg) => seg. ident . span . shrink_to_hi ( ) . to ( source. ident . span ) ,
606- None => source. ident . span ,
607- } ;
608- let span_with_rename = match rename {
609- // only `self as bar` from `use foo::self as bar`
610- Some ( rename) => source. ident . span . to ( rename. span ) ,
611- None => source. ident . span ,
612- } ;
613- self . r . report_error (
614- span,
615- ResolutionError :: SelfImportsOnlyAllowedWithin {
616- root : parent. is_none ( ) ,
617- span_with_rename,
618- } ,
619- ) ;
620-
621- // Error recovery: replace `use foo::self;` with `use foo;`
587+ kw:: Super => {
588+ type_ns_only = true ;
589+ }
590+ kw:: SelfLower => {
622591 if let Some ( parent) = module_path. pop ( ) {
592+ let span_with_rename = match rename {
593+ Some ( rename) => source. ident . span . to ( rename. span ) ,
594+ None => source. ident . span ,
595+ } ;
596+
597+ if !nested && parent. ident . name != kw:: PathRoot {
598+ self . r . report_error (
599+ parent. ident . span . shrink_to_hi ( ) . to ( source. ident . span ) ,
600+ ResolutionError :: SelfImportsOnlyAllowedWithin {
601+ root : false ,
602+ span_with_rename,
603+ } ,
604+ ) ;
605+ }
606+
607+ let self_span = source. ident . span ;
623608 source = parent;
624609 if rename. is_none ( ) {
625- ident = source. ident ;
610+ ident = Ident :: new ( source. ident . name , self_span ) ;
626611 }
627612 }
613+
614+ type_ns_only = true ;
628615 }
616+ kw:: DollarCrate => {
617+ if !module_path. is_empty ( ) {
618+ self . r . dcx ( ) . span_err (
619+ ident. span ,
620+ "`$crate` in paths can only be used in start position" ,
621+ ) ;
622+ return ;
623+ }
629624
630- // Disallow `use $crate;`
631- if source. ident . name == kw:: DollarCrate && module_path. is_empty ( ) {
632625 let crate_root = self . r . resolve_crate_root ( source. ident ) ;
633626 let crate_name = match crate_root. kind {
634627 ModuleKind :: Def ( .., name) => name,
@@ -645,16 +638,22 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
645638 ) ) ;
646639 source. ident . name = crate_name;
647640 }
648- if rename. is_none ( ) {
649- ident. name = sym:: dummy;
650- }
651-
652- self . r . dcx ( ) . emit_err ( errors:: CrateImported { span : item. span } ) ;
653641 }
642+ _ => { }
654643 }
655644
656645 if ident. name == kw:: Crate {
657646 self . r . dcx ( ) . emit_err ( errors:: UnnamedCrateRootImport { span : ident. span } ) ;
647+ return ;
648+ } else if ident. name == kw:: DollarCrate {
649+ self . r . dcx ( ) . emit_err ( errors:: CrateImported { span : item. span } ) ;
650+ return ;
651+ } else if source. ident . name == kw:: PathRoot {
652+ self . r . dcx ( ) . span_err ( ident. span , "{{root}} cannot be imported" ) ;
653+ return ;
654+ } else if ident. is_path_segment_keyword ( ) {
655+ self . r . dcx ( ) . emit_err ( errors:: UnnamedImports { span : ident. span , ident } ) ;
656+ return ;
658657 }
659658
660659 let kind = ImportKind :: Single {
@@ -708,6 +707,12 @@ impl<'a, 'ra, 'tcx> BuildReducedGraphVisitor<'a, 'ra, 'tcx> {
708707 }
709708
710709 e. emit ( ) ;
710+ } else if let & [ self_span] = & self_spans[ ..]
711+ && prefix. len ( ) == 1
712+ && prefix[ 0 ] . ident . name == kw:: DollarCrate
713+ {
714+ // Disallow `use $crate::{self};`
715+ self . r . dcx ( ) . emit_err ( errors:: CrateImported { span : self_span } ) ;
711716 }
712717
713718 for & ( ref tree, id) in items {
0 commit comments