File tree Expand file tree Collapse file tree 3 files changed +40
-5
lines changed Expand file tree Collapse file tree 3 files changed +40
-5
lines changed Original file line number Diff line number Diff line change @@ -958,11 +958,26 @@ class DeclAndTypePrinter::Implementation
958958
959959 template <typename T>
960960 static const T *findClangBase (const T *member) {
961- while (member) {
962- if (member->getClangDecl ())
963- return member;
964- member = member->getOverriddenDecl ();
965- }
961+ // Search overridden members.
962+ const T *ancestorMember = member;
963+ while (ancestorMember) {
964+ if (ancestorMember->getClangDecl ())
965+ return ancestorMember;
966+ ancestorMember = ancestorMember->getOverriddenDecl ();
967+ }
968+
969+ // Search witnessed requirements.
970+ // FIXME: Semi-arbitrary behavior if `member` witnesses several requirements
971+ // (The conformance which sorts first will be used; the others will be
972+ // ignored.)
973+ for (const ValueDecl *requirementVD :
974+ member->getSatisfiedProtocolRequirements (/* Sorted=*/ true )) {
975+ const T *requirement = dyn_cast<T>(requirementVD);
976+ if (requirement && requirement->getClangDecl ())
977+ return requirement;
978+ }
979+
980+ // No related clang members found.
966981 return nullptr ;
967982 }
968983
Original file line number Diff line number Diff line change 1616- (BOOL )doAnotherThingWithError : (NSError **)error ;
1717
1818@end
19+
20+ @protocol Proto <NSObject >
21+
22+ - (NSUInteger )proto ;
23+ - (NSUInteger )proto : (NSUInteger )ignored ;
24+ - (NSUInteger )proto : (NSUInteger )x y : (NSUInteger )y ;
25+
26+ @end
Original file line number Diff line number Diff line change @@ -45,6 +45,18 @@ class A_Child : Base {
4545 // CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
4646} // CHECK-NEXT: @end
4747
48+ // CHECK-LABEL: @interface A_Child ({{.*}}) <Proto>
49+ extension A_Child : Proto {
50+ // CHECK-NEXT: - (NSUInteger)proto SWIFT_WARN_UNUSED_RESULT;
51+ func proto( ) -> Int { return 0 }
52+
53+ // CHECK-NEXT: - (NSUInteger)proto:(NSUInteger)_ SWIFT_WARN_UNUSED_RESULT;
54+ func proto( _: Int ) -> Int { return 0 }
55+
56+ // CHECK-NEXT: - (NSUInteger)proto:(NSUInteger)_ y:(NSUInteger)y SWIFT_WARN_UNUSED_RESULT;
57+ func proto( _: Int , y: Int ) -> Int { return 0 }
58+ } // CHECK-NEXT: @end
59+
4860// CHECK-LABEL: @interface A_Grandchild : A_Child
4961class A_Grandchild : A_Child {
5062 // CHECK-NEXT: @property (nonatomic, readonly, getter=getProp) NSUInteger prop;
You can’t perform that action at this time.
0 commit comments