Skip to content

Commit eff456f

Browse files
authored
Merge pull request #72203 from beccadax/does-this-sign-conform-to-the-protocol
[PrintAsObjC] Use NSUInteger if protocol requires
2 parents 7d7673b + 0ef9b79 commit eff456f

File tree

3 files changed

+40
-5
lines changed

3 files changed

+40
-5
lines changed

lib/PrintAsClang/DeclAndTypePrinter.cpp

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff 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

test/PrintAsObjC/Inputs/custom-modules/override.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,11 @@
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

test/PrintAsObjC/override.swift

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff 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
4961
class A_Grandchild : A_Child {
5062
// CHECK-NEXT: @property (nonatomic, readonly, getter=getProp) NSUInteger prop;

0 commit comments

Comments
 (0)