@@ -110,48 +110,46 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'_, 'tcx> {
110
110
// we must make sure that all `target as Variant#i` are `Top`.
111
111
state. flood ( target. as_ref ( ) , self . map ( ) ) ;
112
112
113
- if let Some ( target_idx) = self . map ( ) . find ( target. as_ref ( ) ) {
114
- let ( variant_target, variant_index) = match * * kind {
115
- AggregateKind :: Tuple | AggregateKind :: Closure ( ..) => {
116
- ( Some ( target_idx) , None )
117
- }
118
- AggregateKind :: Adt ( def_id, variant_index, ..) => {
119
- match self . tcx . def_kind ( def_id) {
120
- DefKind :: Struct => ( Some ( target_idx) , None ) ,
121
- DefKind :: Enum => (
122
- self . map . apply ( target_idx, TrackElem :: Variant ( variant_index) ) ,
123
- Some ( variant_index) ,
124
- ) ,
125
- _ => ( None , None ) ,
126
- }
127
- }
128
- _ => ( None , None ) ,
129
- } ;
130
- if let Some ( variant_target_idx) = variant_target {
131
- for ( field_index, operand) in operands. iter ( ) . enumerate ( ) {
132
- if let Some ( field) = self . map ( ) . apply (
133
- variant_target_idx,
134
- TrackElem :: Field ( FieldIdx :: from_usize ( field_index) ) ,
135
- ) {
136
- let result = self . handle_operand ( operand, state) ;
137
- state. insert_idx ( field, result, self . map ( ) ) ;
138
- }
113
+ let Some ( target_idx) = self . map ( ) . find ( target. as_ref ( ) ) else { return } ;
114
+
115
+ let ( variant_target, variant_index) = match * * kind {
116
+ AggregateKind :: Tuple | AggregateKind :: Closure ( ..) => ( Some ( target_idx) , None ) ,
117
+ AggregateKind :: Adt ( def_id, variant_index, ..) => {
118
+ match self . tcx . def_kind ( def_id) {
119
+ DefKind :: Struct => ( Some ( target_idx) , None ) ,
120
+ DefKind :: Enum => (
121
+ self . map . apply ( target_idx, TrackElem :: Variant ( variant_index) ) ,
122
+ Some ( variant_index) ,
123
+ ) ,
124
+ _ => return ,
139
125
}
140
126
}
141
- if let Some ( variant_index) = variant_index
142
- && let Some ( discr_idx) = self . map ( ) . apply ( target_idx, TrackElem :: Discriminant )
143
- {
144
- // We are assigning the discriminant as part of an aggregate.
145
- // This discriminant can only alias a variant field's value if the operand
146
- // had an invalid value for that type.
147
- // Using invalid values is UB, so we are allowed to perform the assignment
148
- // without extra flooding.
149
- let enum_ty = target. ty ( self . local_decls , self . tcx ) . ty ;
150
- if let Some ( discr_val) = self . eval_discriminant ( enum_ty, variant_index) {
151
- state. insert_value_idx ( discr_idx, FlatSet :: Elem ( discr_val) , & self . map ) ;
127
+ _ => return ,
128
+ } ;
129
+ if let Some ( variant_target_idx) = variant_target {
130
+ for ( field_index, operand) in operands. iter ( ) . enumerate ( ) {
131
+ if let Some ( field) = self . map ( ) . apply (
132
+ variant_target_idx,
133
+ TrackElem :: Field ( FieldIdx :: from_usize ( field_index) ) ,
134
+ ) {
135
+ let result = self . handle_operand ( operand, state) ;
136
+ state. insert_idx ( field, result, self . map ( ) ) ;
152
137
}
153
138
}
154
139
}
140
+ if let Some ( variant_index) = variant_index
141
+ && let Some ( discr_idx) = self . map ( ) . apply ( target_idx, TrackElem :: Discriminant )
142
+ {
143
+ // We are assigning the discriminant as part of an aggregate.
144
+ // This discriminant can only alias a variant field's value if the operand
145
+ // had an invalid value for that type.
146
+ // Using invalid values is UB, so we are allowed to perform the assignment
147
+ // without extra flooding.
148
+ let enum_ty = target. ty ( self . local_decls , self . tcx ) . ty ;
149
+ if let Some ( discr_val) = self . eval_discriminant ( enum_ty, variant_index) {
150
+ state. insert_value_idx ( discr_idx, FlatSet :: Elem ( discr_val) , & self . map ) ;
151
+ }
152
+ }
155
153
}
156
154
Rvalue :: CheckedBinaryOp ( op, box ( left, right) ) => {
157
155
// Flood everything now, so we can use `insert_value_idx` directly later.
0 commit comments