@@ -40,7 +40,7 @@ use syntax::ext::base::{MacroKind, SyntaxExtension};
4040use syntax:: ext:: base:: Determinacy :: Undetermined ;
4141use syntax:: ext:: hygiene:: Mark ;
4242use syntax:: ext:: tt:: macro_rules;
43- use syntax:: feature_gate:: is_builtin_attr;
43+ use syntax:: feature_gate:: { is_builtin_attr, emit_feature_err , GateIssue } ;
4444use syntax:: parse:: token:: { self , Token } ;
4545use syntax:: std_inject:: injected_crate_name;
4646use syntax:: symbol:: keywords;
@@ -344,9 +344,23 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
344344 }
345345
346346 ItemKind :: ExternCrate ( orig_name) => {
347- let crate_id = self . crate_loader . process_extern_crate ( item, & self . definitions ) ;
348- let module =
349- self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } ) ;
347+ let module = if orig_name. is_none ( ) && ident. name == keywords:: SelfValue . name ( ) {
348+ self . session
349+ . struct_span_err ( item. span , "`extern crate self;` requires renaming" )
350+ . span_suggestion ( item. span , "try" , "extern crate self as name;" . into ( ) )
351+ . emit ( ) ;
352+ return ;
353+ } else if orig_name == Some ( keywords:: SelfValue . name ( ) ) {
354+ if !self . session . features_untracked ( ) . extern_crate_self {
355+ emit_feature_err ( & self . session . parse_sess , "extern_crate_self" , item. span ,
356+ GateIssue :: Language , "`extern crate self` is unstable" ) ;
357+ }
358+ self . graph_root
359+ } else {
360+ let crate_id = self . crate_loader . process_extern_crate ( item, & self . definitions ) ;
361+ self . get_module ( DefId { krate : crate_id, index : CRATE_DEF_INDEX } )
362+ } ;
363+
350364 self . populate_module_if_necessary ( module) ;
351365 if injected_crate_name ( ) . map_or ( false , |name| ident. name == name) {
352366 self . injected_crate = Some ( module) ;
@@ -768,6 +782,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
768782 span_err ! ( self . session, item. span, E0468 ,
769783 "an `extern crate` loading macros must be at the crate root" ) ;
770784 }
785+ if let ItemKind :: ExternCrate ( Some ( orig_name) ) = item. node {
786+ if orig_name == keywords:: SelfValue . name ( ) {
787+ self . session . span_err ( attr. span ,
788+ "`macro_use` is not supported on `extern crate self`" ) ;
789+ }
790+ }
771791 let ill_formed = |span| span_err ! ( self . session, span, E0466 , "bad macro import" ) ;
772792 match attr. meta ( ) {
773793 Some ( meta) => match meta. node {
0 commit comments