Index: test/cctest/test-types.cc |
diff --git a/test/cctest/test-types.cc b/test/cctest/test-types.cc |
index 0cd24728c38cecd21321eea51e029af783d28bb5..a73414b7099d6ca1d70a4c9114a626a10a4ec371 100644 |
--- a/test/cctest/test-types.cc |
+++ b/test/cctest/test-types.cc |
@@ -261,17 +261,28 @@ class Types { |
TypeHandle Fuzz(int depth = 4) { |
switch (rng_->NextInt(depth == 0 ? 3 : 20)) { |
case 0: { // bitset |
- int n = 0 |
#define COUNT_BITSET_TYPES(type, value) + 1 |
- PROPER_BITSET_TYPE_LIST(COUNT_BITSET_TYPES) |
+ int n = 0 PROPER_BITSET_TYPE_LIST(COUNT_BITSET_TYPES); |
#undef COUNT_BITSET_TYPES |
- ; |
- int i = rng_->NextInt(n); |
- #define PICK_BITSET_TYPE(type, value) \ |
- if (i-- == 0) return Type::type(region_); |
- PROPER_BITSET_TYPE_LIST(PICK_BITSET_TYPE) |
- #undef PICK_BITSET_TYPE |
- UNREACHABLE(); |
+ // Pick a bunch of named bitsets and return their intersection. |
+ TypeHandle result = Type::Any(region_); |
+ for (int i = 0, m = 1 + rng_->NextInt(3); i < m; ++i) { |
+ int j = rng_->NextInt(n); |
+ #define PICK_BITSET_TYPE(type, value) \ |
+ if (j-- == 0) { \ |
+ TypeHandle tmp = Type::Intersect( \ |
+ result, Type::type(region_), region_); \ |
+ if (tmp->Is(Type::None()) && i != 0) { \ |
+ break; \ |
+ } { \ |
+ result = tmp; \ |
+ continue; \ |
+ } \ |
+ } |
+ PROPER_BITSET_TYPE_LIST(PICK_BITSET_TYPE) |
+ #undef PICK_BITSET_TYPE |
+ } |
+ return result; |
} |
case 1: { // class |
int i = rng_->NextInt(static_cast<int>(maps.size())); |
@@ -598,11 +609,11 @@ struct Tests : Rep { |
// Range(min1, max1) = Range(min2, max2) <=> min1 = min2 /\ max1 = max2 |
for (ValueIterator i1 = T.integers.begin(); |
i1 != T.integers.end(); ++i1) { |
- for (ValueIterator j1 = T.integers.begin(); |
+ for (ValueIterator j1 = i1; |
j1 != T.integers.end(); ++j1) { |
for (ValueIterator i2 = T.integers.begin(); |
i2 != T.integers.end(); ++i2) { |
- for (ValueIterator j2 = T.integers.begin(); |
+ for (ValueIterator j2 = i2; |
j2 != T.integers.end(); ++j2) { |
i::Handle<i::Object> min1 = *i1; |
i::Handle<i::Object> max1 = *j1; |
@@ -949,11 +960,11 @@ struct Tests : Rep { |
// min1 >= min2 /\ max1 <= max2 |
for (ValueIterator i1 = T.integers.begin(); |
i1 != T.integers.end(); ++i1) { |
- for (ValueIterator j1 = T.integers.begin(); |
+ for (ValueIterator j1 = i1; |
j1 != T.integers.end(); ++j1) { |
for (ValueIterator i2 = T.integers.begin(); |
i2 != T.integers.end(); ++i2) { |
- for (ValueIterator j2 = T.integers.begin(); |
+ for (ValueIterator j2 = i2; |
j2 != T.integers.end(); ++j2) { |
i::Handle<i::Object> min1 = *i1; |
i::Handle<i::Object> max1 = *j1; |
@@ -1523,7 +1534,7 @@ struct Tests : Rep { |
// Monotonicity: T1->Is(T2) or T1->Is(T3) implies T1->Is(Union(T2, T3)) |
for (TypeIterator it1 = T.types.begin(); it1 != T.types.end(); ++it1) { |
for (TypeIterator it2 = T.types.begin(); it2 != T.types.end(); ++it2) { |
- for (TypeIterator it3 = T.types.begin(); it3 != T.types.end(); ++it3) { |
+ for (TypeIterator it3 = it2; it3 != T.types.end(); ++it3) { |
TypeHandle type1 = *it1; |
TypeHandle type2 = *it2; |
TypeHandle type3 = *it3; |