@@ -692,8 +692,14 @@ fn resolve_dependencies<'a>(
692692
693693 let mut deps = BTreeMap :: new ( ) ;
694694 for ( name_in_toml, v) in dependencies. iter ( ) {
695- let mut resolved =
696- dependency_inherit_with ( v. clone ( ) , name_in_toml, inherit, package_root, warnings) ?;
695+ let mut resolved = dependency_inherit_with (
696+ v. clone ( ) ,
697+ name_in_toml,
698+ inherit,
699+ package_root,
700+ edition,
701+ warnings,
702+ ) ?;
697703 if let manifest:: TomlDependency :: Detailed ( ref mut d) = resolved {
698704 deprecated_underscore (
699705 & d. default_features2 ,
@@ -949,12 +955,13 @@ fn dependency_inherit_with<'a>(
949955 name : & str ,
950956 inherit : & dyn Fn ( ) -> CargoResult < & ' a InheritableFields > ,
951957 package_root : & Path ,
958+ edition : Edition ,
952959 warnings : & mut Vec < String > ,
953960) -> CargoResult < manifest:: TomlDependency > {
954961 match dependency {
955962 manifest:: InheritableDependency :: Value ( value) => Ok ( value) ,
956963 manifest:: InheritableDependency :: Inherit ( w) => {
957- inner_dependency_inherit_with ( w, name, inherit, package_root, warnings) . with_context ( || {
964+ inner_dependency_inherit_with ( w, name, inherit, package_root, edition , warnings) . with_context ( || {
958965 format ! (
959966 "error inheriting `{name}` from workspace root manifest's `workspace.dependencies.{name}`" ,
960967 )
@@ -968,76 +975,87 @@ fn inner_dependency_inherit_with<'a>(
968975 name : & str ,
969976 inherit : & dyn Fn ( ) -> CargoResult < & ' a InheritableFields > ,
970977 package_root : & Path ,
978+ edition : Edition ,
971979 warnings : & mut Vec < String > ,
972980) -> CargoResult < manifest:: TomlDependency > {
973- fn default_features_msg ( label : & str , ws_def_feat : Option < bool > , warnings : & mut Vec < String > ) {
974- let ws_def_feat = match ws_def_feat {
975- Some ( true ) => "true" ,
976- Some ( false ) => "false" ,
977- None => "not specified" ,
978- } ;
981+ let ws_dep = inherit ( ) ?. get_dependency ( name, package_root) ?;
982+ let mut merged_dep = match ws_dep {
983+ manifest:: TomlDependency :: Simple ( ws_version) => manifest:: TomlDetailedDependency {
984+ version : Some ( ws_version) ,
985+ ..Default :: default ( )
986+ } ,
987+ manifest:: TomlDependency :: Detailed ( ws_dep) => ws_dep. clone ( ) ,
988+ } ;
989+ let manifest:: TomlInheritedDependency {
990+ workspace : _,
991+
992+ features,
993+ optional,
994+ default_features,
995+ default_features2,
996+ public,
997+
998+ _unused_keys : _,
999+ } = & pkg_dep;
1000+ let default_features = default_features. or ( * default_features2) ;
1001+
1002+ match ( default_features, merged_dep. default_features ( ) ) {
1003+ // member: default-features = true and
1004+ // workspace: default-features = false should turn on
1005+ // default-features
1006+ ( Some ( true ) , Some ( false ) ) => {
1007+ merged_dep. default_features = Some ( true ) ;
1008+ }
1009+ // member: default-features = false and
1010+ // workspace: default-features = true should ignore member
1011+ // default-features
1012+ ( Some ( false ) , Some ( true ) ) => {
1013+ deprecated_ws_default_features ( name, Some ( true ) , edition, warnings) ?;
1014+ }
1015+ // member: default-features = false and
1016+ // workspace: dep = "1.0" should ignore member default-features
1017+ ( Some ( false ) , None ) => {
1018+ deprecated_ws_default_features ( name, None , edition, warnings) ?;
1019+ }
1020+ _ => { }
1021+ }
1022+ merged_dep. features = match ( merged_dep. features . clone ( ) , features. clone ( ) ) {
1023+ ( Some ( dep_feat) , Some ( inherit_feat) ) => Some (
1024+ dep_feat
1025+ . into_iter ( )
1026+ . chain ( inherit_feat)
1027+ . collect :: < Vec < String > > ( ) ,
1028+ ) ,
1029+ ( Some ( dep_fet) , None ) => Some ( dep_fet) ,
1030+ ( None , Some ( inherit_feat) ) => Some ( inherit_feat) ,
1031+ ( None , None ) => None ,
1032+ } ;
1033+ merged_dep. optional = * optional;
1034+ merged_dep. public = * public;
1035+ Ok ( manifest:: TomlDependency :: Detailed ( merged_dep) )
1036+ }
1037+
1038+ fn deprecated_ws_default_features (
1039+ label : & str ,
1040+ ws_def_feat : Option < bool > ,
1041+ edition : Edition ,
1042+ warnings : & mut Vec < String > ,
1043+ ) -> CargoResult < ( ) > {
1044+ let ws_def_feat = match ws_def_feat {
1045+ Some ( true ) => "true" ,
1046+ Some ( false ) => "false" ,
1047+ None => "not specified" ,
1048+ } ;
1049+ if Edition :: Edition2024 <= edition {
1050+ anyhow:: bail!( "`default-features = false` cannot override workspace's `default-features`" ) ;
1051+ } else {
9791052 warnings. push ( format ! (
9801053 "`default-features` is ignored for {label}, since `default-features` was \
9811054 {ws_def_feat} for `workspace.dependencies.{label}`, \
9821055 this could become a hard error in the future"
983- ) )
1056+ ) ) ;
9841057 }
985- inherit ( ) ?. get_dependency ( name, package_root) . map ( |ws_dep| {
986- let mut merged_dep = match ws_dep {
987- manifest:: TomlDependency :: Simple ( ws_version) => manifest:: TomlDetailedDependency {
988- version : Some ( ws_version) ,
989- ..Default :: default ( )
990- } ,
991- manifest:: TomlDependency :: Detailed ( ws_dep) => ws_dep. clone ( ) ,
992- } ;
993- let manifest:: TomlInheritedDependency {
994- workspace : _,
995-
996- features,
997- optional,
998- default_features,
999- default_features2,
1000- public,
1001-
1002- _unused_keys : _,
1003- } = & pkg_dep;
1004- let default_features = default_features. or ( * default_features2) ;
1005-
1006- match ( default_features, merged_dep. default_features ( ) ) {
1007- // member: default-features = true and
1008- // workspace: default-features = false should turn on
1009- // default-features
1010- ( Some ( true ) , Some ( false ) ) => {
1011- merged_dep. default_features = Some ( true ) ;
1012- }
1013- // member: default-features = false and
1014- // workspace: default-features = true should ignore member
1015- // default-features
1016- ( Some ( false ) , Some ( true ) ) => {
1017- default_features_msg ( name, Some ( true ) , warnings) ;
1018- }
1019- // member: default-features = false and
1020- // workspace: dep = "1.0" should ignore member default-features
1021- ( Some ( false ) , None ) => {
1022- default_features_msg ( name, None , warnings) ;
1023- }
1024- _ => { }
1025- }
1026- merged_dep. features = match ( merged_dep. features . clone ( ) , features. clone ( ) ) {
1027- ( Some ( dep_feat) , Some ( inherit_feat) ) => Some (
1028- dep_feat
1029- . into_iter ( )
1030- . chain ( inherit_feat)
1031- . collect :: < Vec < String > > ( ) ,
1032- ) ,
1033- ( Some ( dep_fet) , None ) => Some ( dep_fet) ,
1034- ( None , Some ( inherit_feat) ) => Some ( inherit_feat) ,
1035- ( None , None ) => None ,
1036- } ;
1037- merged_dep. optional = * optional;
1038- merged_dep. public = * public;
1039- manifest:: TomlDependency :: Detailed ( merged_dep)
1040- } )
1058+ Ok ( ( ) )
10411059}
10421060
10431061#[ tracing:: instrument( skip_all) ]
0 commit comments