@@ -40,7 +40,7 @@ use syntax::ext::base::{MacroKind, SyntaxExtension};
40
40
use syntax:: ext:: base:: Determinacy :: Undetermined ;
41
41
use syntax:: ext:: hygiene:: Mark ;
42
42
use 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 } ;
44
44
use syntax:: parse:: token:: { self , Token } ;
45
45
use syntax:: std_inject:: injected_crate_name;
46
46
use syntax:: symbol:: keywords;
@@ -344,9 +344,23 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
344
344
}
345
345
346
346
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
+
350
364
self . populate_module_if_necessary ( module) ;
351
365
if injected_crate_name ( ) . map_or ( false , |name| ident. name == name) {
352
366
self . injected_crate = Some ( module) ;
@@ -768,6 +782,12 @@ impl<'a, 'cl> Resolver<'a, 'cl> {
768
782
span_err ! ( self . session, item. span, E0468 ,
769
783
"an `extern crate` loading macros must be at the crate root" ) ;
770
784
}
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
+ }
771
791
let ill_formed = |span| span_err ! ( self . session, span, E0466 , "bad macro import" ) ;
772
792
match attr. meta ( ) {
773
793
Some ( meta) => match meta. node {
0 commit comments