@@ -1047,22 +1047,17 @@ impl<'a, Ty> TyLayout<'a, Ty> {
1047
1047
/// FIXME: Once we removed all the conservatism, we could alternatively
1048
1048
/// create an all-0/all-undef constant and run the vonst value validator to see if
1049
1049
/// this is a valid value for the given type.
1050
- pub fn might_permit_raw_init < C , E > (
1051
- self ,
1052
- cx : & C ,
1053
- zero : bool ,
1054
- ) -> Result < bool , E >
1050
+ pub fn might_permit_raw_init < C , E > ( self , cx : & C , zero : bool ) -> Result < bool , E >
1055
1051
where
1056
1052
Self : Copy ,
1057
1053
Ty : TyLayoutMethods < ' a , C > ,
1058
- C : LayoutOf < Ty = Ty , TyLayout : MaybeResult < Self , Error = E > > + HasDataLayout
1054
+ C : LayoutOf < Ty = Ty , TyLayout : MaybeResult < Self , Error = E > > + HasDataLayout ,
1059
1055
{
1060
1056
let scalar_allows_raw_init = move |s : & Scalar | -> bool {
1061
1057
if zero {
1062
1058
let range = & s. valid_range ;
1063
1059
// The range must contain 0.
1064
- range. contains ( & 0 ) ||
1065
- ( * range. start ( ) > * range. end ( ) ) // wrap-around allows 0
1060
+ range. contains ( & 0 ) || ( * range. start ( ) > * range. end ( ) ) // wrap-around allows 0
1066
1061
} else {
1067
1062
// The range must include all values. `valid_range_exclusive` handles
1068
1063
// the wrap-around using target arithmetic; with wrap-around then the full
@@ -1076,13 +1071,11 @@ impl<'a, Ty> TyLayout<'a, Ty> {
1076
1071
let res = match & self . abi {
1077
1072
Abi :: Uninhabited => false , // definitely UB
1078
1073
Abi :: Scalar ( s) => scalar_allows_raw_init ( s) ,
1079
- Abi :: ScalarPair ( s1, s2) =>
1080
- scalar_allows_raw_init ( s1) && scalar_allows_raw_init ( s2) ,
1081
- Abi :: Vector { element : s, count } =>
1082
- * count == 0 || scalar_allows_raw_init ( s) ,
1074
+ Abi :: ScalarPair ( s1, s2) => scalar_allows_raw_init ( s1) && scalar_allows_raw_init ( s2) ,
1075
+ Abi :: Vector { element : s, count } => * count == 0 || scalar_allows_raw_init ( s) ,
1083
1076
Abi :: Aggregate { .. } => {
1084
1077
match self . variants {
1085
- Variants :: Multiple { .. } =>
1078
+ Variants :: Multiple { .. } => {
1086
1079
if zero {
1087
1080
// FIXME(#66151):
1088
1081
// could we identify the variant with discriminant 0, check that?
@@ -1091,17 +1084,20 @@ impl<'a, Ty> TyLayout<'a, Ty> {
1091
1084
// FIXME(#66151): This needs to have some sort of discriminant,
1092
1085
// which cannot be undef. But for now we are conservative.
1093
1086
true
1094
- } ,
1087
+ }
1088
+ }
1095
1089
Variants :: Single { .. } => {
1096
1090
// For aggregates, recurse.
1097
1091
match self . fields {
1098
1092
FieldPlacement :: Union ( ..) => true , // An all-0 unit is fine.
1099
1093
FieldPlacement :: Array { .. } =>
1100
- // FIXME(#66151): The widely use smallvec 0.6 creates uninit arrays
1101
- // with any element type, so let us not (yet) complain about that.
1102
- /* count == 0 ||
1103
- self.field(cx, 0).to_result()?.might_permit_raw_init(cx, zero)? */
1104
- true ,
1094
+ // FIXME(#66151): The widely use smallvec 0.6 creates uninit arrays
1095
+ // with any element type, so let us not (yet) complain about that.
1096
+ /* count == 0 ||
1097
+ self.field(cx, 0).to_result()?.might_permit_raw_init(cx, zero)? */
1098
+ {
1099
+ true
1100
+ }
1105
1101
FieldPlacement :: Arbitrary { .. } => {
1106
1102
// FIXME(#66151) cargo depends on sized-chunks 0.3.0 which
1107
1103
// has some illegal zero-initialization, so let us not (yet)
0 commit comments