mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Existential Types Cannot Satisfy Superclass Bounds
It is not the case that `any P` satisfies a class bound even if the existential is a composition with an exact match to the class bound. The resulting existential box must be opened as the exact class type before this conversion can succeed. This appears to be a regression from Swift 5.1, which was the last Swift compiler that banned this typing rule. rdar://92358570
This commit is contained in:
@@ -3465,8 +3465,11 @@ ConstraintSystem::matchExistentialTypes(Type type1, Type type2,
|
||||
if (!req)
|
||||
return getTypeMatchFailure(locator);
|
||||
|
||||
if (type1->isPlaceholder() ||
|
||||
req->getRequirementKind() == RequirementKind::Superclass)
|
||||
// Superclass constraints are never satisfied by existentials,
|
||||
// even those that contain the superclass a la `any C & P`.
|
||||
if (!type1->isExistentialType() &&
|
||||
(type1->isPlaceholder() ||
|
||||
req->getRequirementKind() == RequirementKind::Superclass))
|
||||
return getTypeMatchSuccess();
|
||||
|
||||
auto *fix = fixRequirementFailure(*this, type1, type2, locator);
|
||||
|
||||
Reference in New Issue
Block a user