@@ -73,16 +73,26 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'tcx> {
73
73
} ) ;
74
74
75
75
if value_target. is_some ( ) || overflow_target. is_some ( ) {
76
- let ( val, mut overflow) = self . binary_op ( state, * op, left, right) ;
77
-
78
- if !self . propagate_overflow {
79
- overflow = FlatSet :: Top ;
80
- }
76
+ let ( val, overflow) = self . binary_op ( state, * op, left, right) ;
81
77
82
78
if let Some ( value_target) = value_target {
83
79
state. assign_idx ( value_target, ValueOrPlaceOrRef :: Value ( val) , self . map ( ) ) ;
84
80
}
85
81
if let Some ( overflow_target) = overflow_target {
82
+ let overflow = match overflow {
83
+ FlatSet :: Top => FlatSet :: Top ,
84
+ FlatSet :: Elem ( overflow) => {
85
+ if overflow && !self . propagate_overflow {
86
+ FlatSet :: Top
87
+ } else {
88
+ self . wrap_scalar (
89
+ Scalar :: from_bool ( overflow) ,
90
+ self . tcx . types . bool ,
91
+ )
92
+ }
93
+ }
94
+ FlatSet :: Bottom => FlatSet :: Bottom ,
95
+ } ;
86
96
state. assign_idx (
87
97
overflow_target,
88
98
ValueOrPlaceOrRef :: Value ( overflow) ,
@@ -120,8 +130,8 @@ impl<'tcx> ValueAnalysis<'tcx> for ConstAnalysis<'tcx> {
120
130
}
121
131
}
122
132
Rvalue :: BinaryOp ( op, box ( left, right) ) => {
133
+ // Overflows must be ignored here.
123
134
let ( val, _overflow) = self . binary_op ( state, * op, left, right) ;
124
- // FIXME: Just ignore overflow here?
125
135
ValueOrPlaceOrRef :: Value ( val)
126
136
}
127
137
Rvalue :: UnaryOp ( op, operand) => match self . eval_operand ( operand, state) {
@@ -230,16 +240,13 @@ impl<'tcx> ConstAnalysis<'tcx> {
230
240
op : BinOp ,
231
241
left : & Operand < ' tcx > ,
232
242
right : & Operand < ' tcx > ,
233
- ) -> ( FlatSet < ScalarTy < ' tcx > > , FlatSet < ScalarTy < ' tcx > > ) {
243
+ ) -> ( FlatSet < ScalarTy < ' tcx > > , FlatSet < bool > ) {
234
244
let left = self . eval_operand ( left, state) ;
235
245
let right = self . eval_operand ( right, state) ;
236
246
match ( left, right) {
237
247
( FlatSet :: Elem ( left) , FlatSet :: Elem ( right) ) => {
238
248
match self . ecx . overflowing_binary_op ( op, & left, & right) {
239
- Ok ( ( val, overflow, ty) ) => (
240
- self . wrap_scalar ( val, ty) ,
241
- self . wrap_scalar ( Scalar :: from_bool ( overflow) , self . tcx . types . bool ) ,
242
- ) ,
249
+ Ok ( ( val, overflow, ty) ) => ( self . wrap_scalar ( val, ty) , FlatSet :: Elem ( overflow) ) ,
243
250
_ => ( FlatSet :: Top , FlatSet :: Top ) ,
244
251
}
245
252
}
0 commit comments