@@ -25,7 +25,6 @@ use lint;
2525use middle:: cstore;
2626
2727use syntax:: ast:: { self , IntTy , UintTy } ;
28- use syntax:: attr;
2928use syntax:: parse:: { self , token} ;
3029use syntax:: parse:: token:: InternedString ;
3130use syntax:: feature_gate:: UnstableFeatures ;
@@ -41,6 +40,7 @@ use std::collections::btree_map::Values as BTreeMapValuesIter;
4140use std:: fmt;
4241use std:: hash:: Hasher ;
4342use std:: collections:: hash_map:: DefaultHasher ;
43+ use std:: collections:: HashSet ;
4444use std:: iter:: FromIterator ;
4545use std:: path:: PathBuf ;
4646
@@ -945,47 +945,39 @@ pub fn default_configuration(sess: &Session) -> ast::CrateConfig {
945945 InternedString :: new ( "unix" )
946946 } ;
947947
948- let mk = attr:: mk_name_value_item_str;
949- let mut ret = vec ! [ // Target bindings.
950- mk( token:: intern( "target_os" ) , intern( os) ) ,
951- mk( token:: intern( "target_family" ) , fam. clone( ) ) ,
952- mk( token:: intern( "target_arch" ) , intern( arch) ) ,
953- mk( token:: intern( "target_endian" ) , intern( end) ) ,
954- mk( token:: intern( "target_pointer_width" ) , intern( wordsz) ) ,
955- mk( token:: intern( "target_env" ) , intern( env) ) ,
956- mk( token:: intern( "target_vendor" ) , intern( vendor) ) ,
957- ] ;
958- match & fam[ ..] {
959- "windows" | "unix" => ret. push ( attr:: mk_word_item ( token:: intern ( & fam) ) ) ,
960- _ => ( ) ,
948+ let mut ret = HashSet :: new ( ) ;
949+ // Target bindings.
950+ ret. insert ( ( token:: intern ( "target_os" ) , Some ( intern ( os) ) ) ) ;
951+ ret. insert ( ( token:: intern ( "target_family" ) , Some ( fam. clone ( ) ) ) ) ;
952+ ret. insert ( ( token:: intern ( "target_arch" ) , Some ( intern ( arch) ) ) ) ;
953+ ret. insert ( ( token:: intern ( "target_endian" ) , Some ( intern ( end) ) ) ) ;
954+ ret. insert ( ( token:: intern ( "target_pointer_width" ) , Some ( intern ( wordsz) ) ) ) ;
955+ ret. insert ( ( token:: intern ( "target_env" ) , Some ( intern ( env) ) ) ) ;
956+ ret. insert ( ( token:: intern ( "target_vendor" ) , Some ( intern ( vendor) ) ) ) ;
957+ if & fam == "windows" || & fam == "unix" {
958+ ret. insert ( ( token:: intern ( & fam) , None ) ) ;
961959 }
962960 if sess. target . target . options . has_elf_tls {
963- ret. push ( attr :: mk_word_item ( token:: intern ( "target_thread_local" ) ) ) ;
961+ ret. insert ( ( token:: intern ( "target_thread_local" ) , None ) ) ;
964962 }
965963 for & i in & [ 8 , 16 , 32 , 64 , 128 ] {
966964 if i <= max_atomic_width {
967965 let s = i. to_string ( ) ;
968- ret. push ( mk ( token:: intern ( "target_has_atomic" ) , intern ( & s) ) ) ;
966+ ret. insert ( ( token:: intern ( "target_has_atomic" ) , Some ( intern ( & s) ) ) ) ;
969967 if & s == wordsz {
970- ret. push ( mk ( token:: intern ( "target_has_atomic" ) , intern ( "ptr" ) ) ) ;
968+ ret. insert ( ( token:: intern ( "target_has_atomic" ) , Some ( intern ( "ptr" ) ) ) ) ;
971969 }
972970 }
973971 }
974972 if sess. opts . debug_assertions {
975- ret. push ( attr :: mk_word_item ( token:: intern ( "debug_assertions" ) ) ) ;
973+ ret. insert ( ( token:: intern ( "debug_assertions" ) , None ) ) ;
976974 }
977975 if sess. opts . crate_types . contains ( & CrateTypeProcMacro ) {
978- ret. push ( attr :: mk_word_item ( token:: intern ( "proc_macro" ) ) ) ;
976+ ret. insert ( ( token:: intern ( "proc_macro" ) , None ) ) ;
979977 }
980978 return ret;
981979}
982980
983- pub fn append_configuration ( cfg : & mut ast:: CrateConfig , name : ast:: Name ) {
984- if !cfg. iter ( ) . any ( |mi| mi. name ( ) == name) {
985- cfg. push ( attr:: mk_word_item ( name) )
986- }
987- }
988-
989981pub fn build_configuration ( sess : & Session ,
990982 mut user_cfg : ast:: CrateConfig )
991983 -> ast:: CrateConfig {
@@ -994,11 +986,10 @@ pub fn build_configuration(sess: &Session,
994986 let default_cfg = default_configuration ( sess) ;
995987 // If the user wants a test runner, then add the test cfg
996988 if sess. opts . test {
997- append_configuration ( & mut user_cfg, token:: intern ( "test" ) )
989+ user_cfg. insert ( ( token:: intern ( "test" ) , None ) ) ;
998990 }
999- let mut v = user_cfg. into_iter ( ) . collect :: < Vec < _ > > ( ) ;
1000- v. extend_from_slice ( & default_cfg[ ..] ) ;
1001- v
991+ user_cfg. extend ( default_cfg. iter ( ) . cloned ( ) ) ;
992+ user_cfg
1002993}
1003994
1004995pub fn build_target_config ( opts : & Options , sp : & Handler ) -> Config {
@@ -1244,11 +1235,14 @@ pub fn parse_cfgspecs(cfgspecs: Vec<String> ) -> ast::CrateConfig {
12441235 let meta_item = panictry ! ( parser. parse_meta_item( ) ) ;
12451236
12461237 if !parser. reader . is_eof ( ) {
1247- early_error ( ErrorOutputType :: default ( ) , & format ! ( "invalid --cfg argument: {}" ,
1248- s) )
1238+ early_error ( ErrorOutputType :: default ( ) , & format ! ( "invalid --cfg argument: {}" , s) )
1239+ } else if meta_item. is_meta_item_list ( ) {
1240+ let msg =
1241+ format ! ( "invalid predicate in --cfg command line argument: `{}`" , meta_item. name( ) ) ;
1242+ early_error ( ErrorOutputType :: default ( ) , & msg)
12491243 }
12501244
1251- meta_item
1245+ ( meta_item. name ( ) , meta_item . value_str ( ) )
12521246 } ) . collect :: < ast:: CrateConfig > ( )
12531247}
12541248
0 commit comments