skip non-inferable

This commit is contained in:
Douglas Creager 2025-12-03 16:30:44 -05:00
parent 75e9d66d4b
commit 94aca37ca8
1 changed files with 17 additions and 3 deletions

View File

@ -15,7 +15,9 @@ use crate::types::constraints::ConstraintSet;
use crate::types::instance::{Protocol, ProtocolInstanceType}; use crate::types::instance::{Protocol, ProtocolInstanceType};
use crate::types::signatures::Parameters; use crate::types::signatures::Parameters;
use crate::types::tuple::{TupleSpec, TupleType, walk_tuple_type}; use crate::types::tuple::{TupleSpec, TupleType, walk_tuple_type};
use crate::types::visitor::{TypeCollector, TypeVisitor, walk_type_with_recursion_guard}; use crate::types::visitor::{
TypeCollector, TypeVisitor, any_over_type, walk_type_with_recursion_guard,
};
use crate::types::{ use crate::types::{
ApplyTypeMappingVisitor, BoundTypeVarIdentity, BoundTypeVarInstance, ClassLiteral, ApplyTypeMappingVisitor, BoundTypeVarIdentity, BoundTypeVarInstance, ClassLiteral,
FindLegacyTypeVarsVisitor, HasRelationToVisitor, IsDisjointVisitor, IsEquivalentVisitor, FindLegacyTypeVarsVisitor, HasRelationToVisitor, IsDisjointVisitor, IsEquivalentVisitor,
@ -1674,10 +1676,22 @@ impl<'db> SpecializationBuilder<'db> {
let typevar = constraint.typevar(self.db); let typevar = constraint.typevar(self.db);
let lower = constraint.lower(self.db); let lower = constraint.lower(self.db);
let upper = constraint.upper(self.db); let upper = constraint.upper(self.db);
if !upper.is_object() { let upper_has_noninferable_typevar = any_over_type(
self.db,
upper,
&|ty| {
ty.as_typevar().is_some_and(|bound_typevar| {
!bound_typevar.is_inferable(self.db, self.inferable)
})
},
false,
);
if !upper.is_object() && !upper_has_noninferable_typevar {
self.add_type_mapping(typevar, upper, polarity, &mut f); self.add_type_mapping(typevar, upper, polarity, &mut f);
} }
if let Type::TypeVar(lower_bound_typevar) = lower { if typevar.is_inferable(self.db, self.inferable)
&& let Type::TypeVar(lower_bound_typevar) = lower
{
self.add_type_mapping( self.add_type_mapping(
lower_bound_typevar, lower_bound_typevar,
Type::TypeVar(typevar), Type::TypeVar(typevar),