@@ -999,27 +999,33 @@ fn merge_config_profiles(
999
999
Some ( profiles) => profiles. get_all ( ) . clone ( ) ,
1000
1000
None => BTreeMap :: new ( ) ,
1001
1001
} ;
1002
- // List of profile names to check if defined in config only.
1003
- let mut check_to_add = vec ! [ requested_profile] ;
1002
+ // Set of profile names to check if defined in config only.
1003
+ let mut check_to_add = HashSet :: new ( ) ;
1004
+ check_to_add. insert ( requested_profile) ;
1004
1005
// Merge config onto manifest profiles.
1005
1006
for ( name, profile) in & mut profiles {
1006
1007
if let Some ( config_profile) = get_config_profile ( name, config, features) ? {
1007
1008
profile. merge ( & config_profile) ;
1008
1009
}
1009
1010
if let Some ( inherits) = & profile. inherits {
1010
- check_to_add. push ( * inherits) ;
1011
+ check_to_add. insert ( * inherits) ;
1011
1012
}
1012
1013
}
1014
+ // Add the built-in profiles. This is important for things like `cargo
1015
+ // test` which implicitly use the "dev" profile for dependencies.
1016
+ for name in & [ "dev" , "release" , "test" , "bench" ] {
1017
+ check_to_add. insert ( InternedString :: new ( name) ) ;
1018
+ }
1013
1019
// Add config-only profiles.
1014
1020
// Need to iterate repeatedly to get all the inherits values.
1015
- let mut current = Vec :: new ( ) ;
1021
+ let mut current = HashSet :: new ( ) ;
1016
1022
while !check_to_add. is_empty ( ) {
1017
1023
std:: mem:: swap ( & mut current, & mut check_to_add) ;
1018
- for name in current. drain ( .. ) {
1024
+ for name in current. drain ( ) {
1019
1025
if !profiles. contains_key ( & name) {
1020
1026
if let Some ( config_profile) = get_config_profile ( & name, config, features) ? {
1021
1027
if let Some ( inherits) = & config_profile. inherits {
1022
- check_to_add. push ( * inherits) ;
1028
+ check_to_add. insert ( * inherits) ;
1023
1029
}
1024
1030
profiles. insert ( name, config_profile) ;
1025
1031
}
0 commit comments