@@ -13,6 +13,7 @@ use rustc_data_structures::impl_stable_hash_via_hash;
1313
1414use  rustc_target:: abi:: { Align ,  TargetDataLayout } ; 
1515use  rustc_target:: spec:: { LinkerFlavor ,  SplitDebuginfo ,  Target ,  TargetTriple ,  TargetWarnings } ; 
16+ use  rustc_target:: spec:: { PanicStrategy ,  SanitizerSet ,  TARGETS } ; 
1617
1718use  rustc_serialize:: json; 
1819
@@ -1067,8 +1068,9 @@ pub fn to_crate_check_config(cfg: CheckCfg) -> CrateCheckConfig {
10671068
10681069impl  CrateCheckConfig  { 
10691070    /// Fills a `CrateCheckConfig` with well-known configuration names. 
1070- pub  fn  fill_well_known ( & mut  self )  { 
1071-         // NOTE: This should be kept in sync with `default_configuration` 
1071+ fn  fill_well_known_names ( & mut  self )  { 
1072+         // NOTE: This should be kept in sync with `default_configuration` and 
1073+         // `fill_well_known_values` 
10721074        const  WELL_KNOWN_NAMES :  & [ Symbol ]  = & [ 
10731075            sym:: unix, 
10741076            sym:: windows, 
@@ -1093,13 +1095,108 @@ impl CrateCheckConfig {
10931095            sym:: doctest, 
10941096            sym:: feature, 
10951097        ] ; 
1098+ 
1099+         // We only insert well-known names if `names()` was activated 
10961100        if  let  Some ( names_valid)  = & mut  self . names_valid  { 
1097-             for  & name in  WELL_KNOWN_NAMES  { 
1098-                 names_valid. insert ( name) ; 
1099-             } 
1101+             names_valid. extend ( WELL_KNOWN_NAMES ) ; 
11001102        } 
11011103    } 
11021104
1105+     /// Fills a `CrateCheckConfig` with well-known configuration values. 
1106+ fn  fill_well_known_values ( & mut  self )  { 
1107+         if  !self . well_known_values  { 
1108+             return ; 
1109+         } 
1110+ 
1111+         // NOTE: This should be kept in sync with `default_configuration` and 
1112+         // `fill_well_known_names` 
1113+ 
1114+         let  panic_values = & PanicStrategy :: all ( ) ; 
1115+ 
1116+         let  atomic_values = & [ 
1117+             sym:: ptr, 
1118+             sym:: integer ( 8usize ) , 
1119+             sym:: integer ( 16usize ) , 
1120+             sym:: integer ( 32usize ) , 
1121+             sym:: integer ( 64usize ) , 
1122+             sym:: integer ( 128usize ) , 
1123+         ] ; 
1124+ 
1125+         let  sanitize_values = SanitizerSet :: all ( ) 
1126+             . into_iter ( ) 
1127+             . map ( |sanitizer| Symbol :: intern ( sanitizer. as_str ( ) . unwrap ( ) ) ) ; 
1128+ 
1129+         // No-values 
1130+         for  name in  [ 
1131+             sym:: unix, 
1132+             sym:: windows, 
1133+             sym:: debug_assertions, 
1134+             sym:: proc_macro, 
1135+             sym:: test, 
1136+             sym:: doc, 
1137+             sym:: doctest, 
1138+             sym:: target_thread_local, 
1139+         ]  { 
1140+             self . values_valid . entry ( name) . or_default ( ) ; 
1141+         } 
1142+ 
1143+         // Pre-defined values 
1144+         self . values_valid . entry ( sym:: panic) . or_default ( ) . extend ( panic_values) ; 
1145+         self . values_valid . entry ( sym:: sanitize) . or_default ( ) . extend ( sanitize_values) ; 
1146+         self . values_valid . entry ( sym:: target_has_atomic) . or_default ( ) . extend ( atomic_values) ; 
1147+         self . values_valid 
1148+             . entry ( sym:: target_has_atomic_load_store) 
1149+             . or_default ( ) 
1150+             . extend ( atomic_values) ; 
1151+         self . values_valid 
1152+             . entry ( sym:: target_has_atomic_equal_alignment) 
1153+             . or_default ( ) 
1154+             . extend ( atomic_values) ; 
1155+ 
1156+         // Target specific values 
1157+         for  target in 
1158+             TARGETS . iter ( ) . map ( |target| Target :: expect_builtin ( & TargetTriple :: from_triple ( target) ) ) 
1159+         { 
1160+             self . values_valid 
1161+                 . entry ( sym:: target_os) 
1162+                 . or_default ( ) 
1163+                 . insert ( Symbol :: intern ( & target. options . os ) ) ; 
1164+             self . values_valid 
1165+                 . entry ( sym:: target_family) 
1166+                 . or_default ( ) 
1167+                 . extend ( target. options . families . iter ( ) . map ( |family| Symbol :: intern ( family) ) ) ; 
1168+             self . values_valid 
1169+                 . entry ( sym:: target_arch) 
1170+                 . or_default ( ) 
1171+                 . insert ( Symbol :: intern ( & target. arch ) ) ; 
1172+             self . values_valid 
1173+                 . entry ( sym:: target_endian) 
1174+                 . or_default ( ) 
1175+                 . insert ( Symbol :: intern ( & target. options . endian . as_str ( ) ) ) ; 
1176+             self . values_valid 
1177+                 . entry ( sym:: target_env) 
1178+                 . or_default ( ) 
1179+                 . insert ( Symbol :: intern ( & target. options . env ) ) ; 
1180+             self . values_valid 
1181+                 . entry ( sym:: target_abi) 
1182+                 . or_default ( ) 
1183+                 . insert ( Symbol :: intern ( & target. options . abi ) ) ; 
1184+             self . values_valid 
1185+                 . entry ( sym:: target_vendor) 
1186+                 . or_default ( ) 
1187+                 . insert ( Symbol :: intern ( & target. options . vendor ) ) ; 
1188+             self . values_valid 
1189+                 . entry ( sym:: target_pointer_width) 
1190+                 . or_default ( ) 
1191+                 . insert ( sym:: integer ( target. pointer_width ) ) ; 
1192+         } 
1193+     } 
1194+ 
1195+     pub  fn  fill_well_known ( & mut  self )  { 
1196+         self . fill_well_known_names ( ) ; 
1197+         self . fill_well_known_values ( ) ; 
1198+     } 
1199+ 
11031200    /// Fills a `CrateCheckConfig` with configuration names and values that are actually active. 
11041201pub  fn  fill_actual ( & mut  self ,  cfg :  & CrateConfig )  { 
11051202        for  & ( k,  v)  in  cfg { 
0 commit comments