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
958
958
959
959
template <typename T>
960
960
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.
966
981
return nullptr ;
967
982
}
968
983
Original file line number Diff line number Diff line change 16
16
- (BOOL )doAnotherThingWithError : (NSError **)error ;
17
17
18
18
@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 {
45
45
// CHECK-NEXT: - (nonnull instancetype)init OBJC_DESIGNATED_INITIALIZER;
46
46
} // CHECK-NEXT: @end
47
47
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
+
48
60
// CHECK-LABEL: @interface A_Grandchild : A_Child
49
61
class A_Grandchild : A_Child {
50
62
// CHECK-NEXT: @property (nonatomic, readonly, getter=getProp) NSUInteger prop;
You can’t perform that action at this time.
0 commit comments