check protocols nominally, too

This commit is contained in:
Douglas Creager 2025-12-15 19:34:07 -05:00
parent 3ff8a3c3db
commit b55afcd48f
1 changed files with 23 additions and 8 deletions

View File

@ -133,6 +133,20 @@ impl<'db> Type<'db> {
disjointness_visitor: &IsDisjointVisitor<'db>, disjointness_visitor: &IsDisjointVisitor<'db>,
) -> ConstraintSet<'db> { ) -> ConstraintSet<'db> {
let structurally_satisfied = if let Type::ProtocolInstance(self_protocol) = self { let structurally_satisfied = if let Type::ProtocolInstance(self_protocol) = self {
let self_as_nominal = self_protocol.as_nominal_type();
let other_as_nominal = protocol.as_nominal_type();
let nominal_match = match self_as_nominal.zip(other_as_nominal) {
Some((self_as_nominal, other_as_nominal)) => self_as_nominal.has_relation_to_impl(
db,
other_as_nominal,
inferable,
relation,
relation_visitor,
disjointness_visitor,
),
_ => ConstraintSet::from(false),
};
nominal_match.or(db, || {
self_protocol.interface(db).has_relation_to_impl( self_protocol.interface(db).has_relation_to_impl(
db, db,
protocol.interface(db), protocol.interface(db),
@ -141,6 +155,7 @@ impl<'db> Type<'db> {
relation_visitor, relation_visitor,
disjointness_visitor, disjointness_visitor,
) )
})
} else { } else {
protocol protocol
.inner .inner