/* * Returns the least specific supertype of t that maintains the properties * required by tc. */ Type relaxType(Type t, TypeConstraint tc) { always_assert(t <= Type::Gen && t != Type::Bottom); if (tc.category == DataTypeGeneric) return Type::Gen; auto outerRelaxed = relaxOuter(t & Type::Cell, tc); if (t.notBoxed()) return outerRelaxed; auto innerType = (t & Type::BoxedCell).innerType(); auto innerRelaxed = tc.innerCat == DataTypeGeneric ? Type::Cell : relaxOuter(innerType, tc.inner()); // Only add outerRelax into the result type if t had a meaningful outer type // coming in. return (t.isBoxed() ? Type::Bottom : outerRelaxed) | (innerRelaxed - Type::Uninit).box(); }
/* * Returns true iff t is not boxed, or if tc.innerCat is satisfied by t's inner * type. */ static bool typeFitsInnerConstraint(Type t, TypeConstraint tc) { return tc.innerCat == DataTypeGeneric || t.notBoxed() || typeFitsOuterConstraint((t & Type::BoxedCell).innerType(), tc.inner()); }