don't create T ≤ T constraints

This commit is contained in:
Douglas Creager 2025-11-24 19:41:34 -05:00
parent 93e71be357
commit 312c4ce5c8
1 changed files with 22 additions and 3 deletions

View File

@ -2715,17 +2715,36 @@ impl<'db> SequentMap<'db> {
let left_upper = left_constraint.upper(db); let left_upper = left_constraint.upper(db);
let right_lower = right_constraint.lower(db); let right_lower = right_constraint.lower(db);
let right_upper = right_constraint.upper(db); let right_upper = right_constraint.upper(db);
let new_constraint = |bound_typevar: BoundTypeVarInstance<'db>,
right_lower: Type<'db>,
right_upper: Type<'db>| {
let right_lower = if let Type::TypeVar(other_bound_typevar) = right_lower
&& bound_typevar.is_same_typevar_as(db, other_bound_typevar)
{
Type::Never
} else {
right_lower
};
let right_upper = if let Type::TypeVar(other_bound_typevar) = right_upper
&& bound_typevar.is_same_typevar_as(db, other_bound_typevar)
{
Type::object()
} else {
right_upper
};
ConstrainedTypeVar::new(db, bound_typevar, right_lower, right_upper)
};
let post_constraint = match (left_lower, left_upper) { let post_constraint = match (left_lower, left_upper) {
(Type::TypeVar(bound_typevar), Type::TypeVar(other_bound_typevar)) (Type::TypeVar(bound_typevar), Type::TypeVar(other_bound_typevar))
if bound_typevar.is_same_typevar_as(db, other_bound_typevar) => if bound_typevar.is_same_typevar_as(db, other_bound_typevar) =>
{ {
ConstrainedTypeVar::new(db, bound_typevar, right_lower, right_upper) new_constraint(bound_typevar, right_lower, right_upper)
} }
(Type::TypeVar(bound_typevar), _) => { (Type::TypeVar(bound_typevar), _) => {
ConstrainedTypeVar::new(db, bound_typevar, Type::Never, right_upper) new_constraint(bound_typevar, Type::Never, right_upper)
} }
(_, Type::TypeVar(bound_typevar)) => { (_, Type::TypeVar(bound_typevar)) => {
ConstrainedTypeVar::new(db, bound_typevar, right_lower, Type::object()) new_constraint(bound_typevar, right_lower, Type::object())
} }
_ => return, _ => return,
}; };