File tree Expand file tree Collapse file tree 2 files changed +33
-0
lines changed Expand file tree Collapse file tree 2 files changed +33
-0
lines changed Original file line number Diff line number Diff line change @@ -841,6 +841,15 @@ bool swift::_checkGenericRequirements(
841841 substGenericParam, substWitnessTable).getMetadata ();
842842 if (!baseType) return true ;
843843
844+ // If the type which is constrained to a base class is an existential
845+ // type, and if that existential type includes a superclass constraint,
846+ // just require that the superclass by which the existential is
847+ // constrained is a subclass of the base class.
848+ if (auto *existential = dyn_cast<ExistentialTypeMetadata>(subjectType)) {
849+ if (auto *superclassConstraint = existential->getSuperclassConstraint ())
850+ subjectType = superclassConstraint;
851+ }
852+
844853 if (!isSubclass (subjectType, baseType))
845854 return true ;
846855
Original file line number Diff line number Diff line change 1+ // RUN: %target-run-simple-swift
2+ // REQUIRES: objc_interop
3+
4+ import Foundation
5+
6+ final class Storage < T: NSObject > {
7+ weak var object : T ?
8+ init ( object: T ) {
9+ self . object = object
10+ }
11+ }
12+
13+
14+ @objc protocol MyProtocol { }
15+ typealias MyStorage = Storage < NSObject & MyProtocol >
16+
17+ class Gadget : NSObject , MyProtocol {
18+ func testit( ) {
19+ _ = MyStorage ( object: self )
20+ }
21+ }
22+
23+ let gadget = Gadget ( )
24+ gadget. testit ( )
You can’t perform that action at this time.
0 commit comments