Type Type::specialize(TypeSpec spec) const { assertx(!spec.arrSpec() || supports(SpecKind::Array)); assertx(!spec.clsSpec() || supports(SpecKind::Class)); // If we don't have exactly one kind of specialization, or if our bits // support both kinds, don't specialize. if ((bool)spec.arrSpec() == (bool)spec.clsSpec() || (supports(SpecKind::Array) && supports(SpecKind::Class))) { return *this; } if (spec.arrSpec() != ArraySpec::Bottom) { return Type{*this, spec.arrSpec()}; } assertx(spec.clsSpec() != ClassSpec::Bottom); return Type{*this, spec.clsSpec()}; }