@@ -193,6 +193,12 @@ tristate
193
193
symbolic_byte_range::intersection (const symbolic_byte_range &other,
194
194
const region_model &model) const
195
195
{
196
+ /* If either is empty, then there is no intersection. */
197
+ if (empty_p ())
198
+ return tristate::TS_FALSE;
199
+ if (other.empty_p ())
200
+ return tristate::TS_FALSE;
201
+
196
202
/* For brevity, consider THIS to be "range A", and OTHER to be "range B". */
197
203
198
204
region_model_manager *mgr = model.get_manager ();
@@ -262,12 +268,17 @@ static void test_intersects (void)
262
268
ASSERT_EQ (r0_9.get_next_byte_offset (mgr), ten);
263
269
ASSERT_EQ (r0_9.get_last_byte_offset (mgr), nine);
264
270
271
+ symbolic_byte_range concrete_empty (zero, zero);
272
+ ASSERT_TRUE (concrete_empty.empty_p ());
273
+
265
274
ASSERT_EQ (r0_9.intersection (r0, m), tristate::TS_TRUE);
266
275
ASSERT_EQ (r0.intersection (r0_9, m), tristate::TS_TRUE);
267
276
ASSERT_EQ (r0_9.intersection (r9, m), tristate::TS_TRUE);
268
277
ASSERT_EQ (r9.intersection (r0_9, m), tristate::TS_TRUE);
269
278
ASSERT_EQ (r0_9.intersection (r10, m), tristate::TS_FALSE);
270
279
ASSERT_EQ (r10.intersection (r0_9, m), tristate::TS_FALSE);
280
+ ASSERT_EQ (concrete_empty.intersection (r0_9, m), tristate::TS_FALSE);
281
+ ASSERT_EQ (r0_9.intersection (concrete_empty, m), tristate::TS_FALSE);
271
282
272
283
ASSERT_EQ (r5_9.intersection (r0, m), tristate::TS_FALSE);
273
284
ASSERT_EQ (r0.intersection (r5_9, m), tristate::TS_FALSE);
@@ -286,6 +297,9 @@ static void test_intersects (void)
286
297
symbolic_byte_range ry (y_init_sval, one);
287
298
symbolic_byte_range rx_x_plus_y_minus_1 (x_init_sval, y_init_sval);
288
299
300
+ symbolic_byte_range symbolic_empty (x_init_sval, zero);
301
+ ASSERT_TRUE (symbolic_empty.empty_p ());
302
+
289
303
ASSERT_EQ (rx_x_plus_y_minus_1.get_start_byte_offset (), x_init_sval);
290
304
ASSERT_EQ (rx_x_plus_y_minus_1.get_size_in_bytes (), y_init_sval);
291
305
ASSERT_EQ
@@ -296,6 +310,10 @@ static void test_intersects (void)
296
310
SK_BINOP);
297
311
298
312
ASSERT_EQ (rx.intersection (ry, m), tristate::TS_UNKNOWN);
313
+ ASSERT_EQ (rx.intersection (concrete_empty, m), tristate::TS_FALSE);
314
+ ASSERT_EQ (concrete_empty.intersection (rx, m), tristate::TS_FALSE);
315
+ ASSERT_EQ (rx.intersection (symbolic_empty, m), tristate::TS_FALSE);
316
+ ASSERT_EQ (symbolic_empty.intersection (rx, m), tristate::TS_FALSE);
299
317
ASSERT_EQ (r0_x_minus_1.intersection (r0, m), tristate::TS_TRUE);
300
318
#if 0
301
319
ASSERT_EQ (r0_x_minus_1.intersection (rx, m), tristate::TS_FALSE);
0 commit comments