13
13
#include < util/arith_tools.h>
14
14
#include < util/bitvector_types.h>
15
15
16
- static merge_result<const interval_abstract_valuet>
17
- widening_merge (const abstract_object_pointert &op1, const abstract_object_pointert &op2)
16
+ static merge_result<const interval_abstract_valuet> widening_merge (
17
+ const abstract_object_pointert &op1,
18
+ const abstract_object_pointert &op2)
18
19
{
19
20
auto result = abstract_objectt::merge (op1, op2, widen_modet::could_widen);
20
21
@@ -319,7 +320,7 @@ SCENARIO(
319
320
}
320
321
WHEN (" merging [0, 1] with [1, very_large]" )
321
322
{
322
- auto veryLarge = from_integer (2 << 29 , type);
323
+ auto veryLarge = from_integer (2 << 29 , type);
323
324
auto op1 = make_interval (val0, val1, environment, ns);
324
325
auto op2 = make_interval (val1, veryLarge, environment, ns);
325
326
@@ -330,5 +331,113 @@ SCENARIO(
330
331
EXPECT_MODIFIED (merged, val0, valMax);
331
332
}
332
333
}
334
+
335
+ WHEN (" merging [1, 10] with [MIN, 1]" )
336
+ {
337
+ auto op1 = make_interval (val1, val10, environment, ns);
338
+ auto op2 = make_interval (valMin, val1, environment, ns);
339
+
340
+ auto merged = widening_merge (op1, op2);
341
+
342
+ THEN (" result is [MIN, 10]" )
343
+ {
344
+ EXPECT_MODIFIED (merged, valMin, val10);
345
+ }
346
+ }
347
+ WHEN (" merging [0, 1] with [-very_large, 1]" )
348
+ {
349
+ auto veryLargeMinus = from_integer (-(2 << 29 ), type);
350
+ auto op1 = make_interval (val0, val1, environment, ns);
351
+ auto op2 = make_interval (veryLargeMinus, val1, environment, ns);
352
+
353
+ auto merged = widening_merge (op1, op2);
354
+
355
+ THEN (" result is [MIN, 1]" )
356
+ {
357
+ EXPECT_MODIFIED (merged, valMin, val1);
358
+ }
359
+ }
360
+
361
+ WHEN (" merging [1, MAX] with [MIN, 1]" )
362
+ {
363
+ auto op1 = make_interval (val1, valMax, environment, ns);
364
+ auto op2 = make_interval (valMin, val1, environment, ns);
365
+
366
+ auto merged = widening_merge (op1, op2);
367
+
368
+ THEN (" result is TOP - ie [MIN, MAX]" )
369
+ {
370
+ EXPECT_MODIFIED_TOP (merged);
371
+ }
372
+ }
373
+ WHEN (" merging [MIN, 1] with [1, MAX]" )
374
+ {
375
+ auto op1 = make_interval (valMin, val1, environment, ns);
376
+ auto op2 = make_interval (val1, valMax, environment, ns);
377
+
378
+ auto merged = widening_merge (op1, op2);
379
+
380
+ THEN (" result is TOP - ie [MIN, MAX]" )
381
+ {
382
+ EXPECT_MODIFIED_TOP (merged);
383
+ }
384
+ }
385
+ WHEN (" merging [0, very_large] with [-very_large, 0]" )
386
+ {
387
+ auto veryLarge = from_integer (2 << 29 , type);
388
+ auto veryLargeMinus = from_integer (-(2 << 29 ), type);
389
+ auto op1 = make_interval (val0, veryLarge, environment, ns);
390
+ auto op2 = make_interval (veryLargeMinus, val0, environment, ns);
391
+
392
+ auto merged = widening_merge (op1, op2);
393
+
394
+ THEN (" result is [MIN, very_large]" )
395
+ {
396
+ EXPECT_MODIFIED (merged, valMin, veryLarge);
397
+ }
398
+ }
399
+ WHEN (" merging [-very_large, 0] with [0, very_large]" )
400
+ {
401
+ auto veryLarge = from_integer (2 << 29 , type);
402
+ auto veryLargeMinus = from_integer (-(2 << 29 ), type);
403
+ auto op1 = make_interval (veryLargeMinus, val0, environment, ns);
404
+ auto op2 = make_interval (val0, veryLarge, environment, ns);
405
+
406
+ auto merged = widening_merge (op1, op2);
407
+
408
+ THEN (" result is [-very_large, MAX]" )
409
+ {
410
+ EXPECT_MODIFIED (merged, veryLargeMinus, valMax);
411
+ }
412
+ }
413
+
414
+ WHEN (" merging [-very_large, very_large] with [0, 1]" )
415
+ {
416
+ auto veryLarge = from_integer (2 << 29 , type);
417
+ auto veryLargeMinus = from_integer (-(2 << 29 ), type);
418
+ auto op1 = make_interval (veryLargeMinus, veryLarge, environment, ns);
419
+ auto op2 = make_interval (val0, val1, environment, ns);
420
+
421
+ auto merged = widening_merge (op1, op2);
422
+
423
+ THEN (" result is [-very_large, very_large]" )
424
+ {
425
+ EXPECT_UNMODIFIED (merged, veryLargeMinus, veryLarge);
426
+ }
427
+ }
428
+ WHEN (" merging [0, 1] with [-very_large, very_large]" )
429
+ {
430
+ auto veryLarge = from_integer (2 << 29 , type);
431
+ auto veryLargeMinus = from_integer (-(2 << 29 ), type);
432
+ auto op1 = make_interval (val0, val1, environment, ns);
433
+ auto op2 = make_interval (veryLargeMinus, veryLarge, environment, ns);
434
+
435
+ auto merged = widening_merge (op1, op2);
436
+
437
+ THEN (" result is TOP, ie [MIN, MAX]" )
438
+ {
439
+ EXPECT_MODIFIED_TOP (merged);
440
+ }
441
+ }
333
442
}
334
443
}
0 commit comments