Skip to content

Commit a8fb416

Browse files
committed
[Type checker] Don't implicitly propagate @objc to read/modify accessors.
Fixes rdar://problem/46699152.
1 parent 05fc089 commit a8fb416

File tree

2 files changed

+31
-1
lines changed

2 files changed

+31
-1
lines changed

lib/Sema/TypeCheckDeclObjC.cpp

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1066,6 +1066,21 @@ Optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) {
10661066
if (VD->getFormalAccess() <= AccessLevel::FilePrivate)
10671067
return false;
10681068

1069+
if (auto accessor = dyn_cast<AccessorDecl>(VD)) {
1070+
switch (accessor->getAccessorKind()) {
1071+
case AccessorKind::DidSet:
1072+
case AccessorKind::Modify:
1073+
case AccessorKind::Read:
1074+
case AccessorKind::WillSet:
1075+
return false;
1076+
1077+
case AccessorKind::MutableAddress:
1078+
case AccessorKind::Address:
1079+
case AccessorKind::Get:
1080+
case AccessorKind::Set:
1081+
break;
1082+
}
1083+
}
10691084
return true;
10701085
};
10711086

@@ -1106,7 +1121,7 @@ Optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) {
11061121
cast<ExtensionDecl>(VD->getDeclContext())->getAttrs()
11071122
.hasAttribute<NonObjCAttr>()))
11081123
return None;
1109-
if (isMemberOfObjCClassExtension(VD))
1124+
if (isMemberOfObjCClassExtension(VD) && canInferImplicitObjC())
11101125
return ObjCReason(ObjCReason::MemberOfObjCExtension);
11111126
if (isMemberOfObjCMembersClass(VD) && canInferImplicitObjC())
11121127
return ObjCReason(ObjCReason::MemberOfObjCMembersClass);

test/attr/attr_objc.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2312,3 +2312,18 @@ protocol ObjCProtocolWithWeakProperty {
23122312
protocol ObjCProtocolWithUnownedProperty {
23132313
unowned var unownedProp: AnyObject { get set } // okay
23142314
}
2315+
2316+
// rdar://problem/46699152: errors about read/modify accessors being implicitly
2317+
// marked @objc.
2318+
@objc class MyObjCClass: NSObject {}
2319+
2320+
@objc
2321+
extension MyObjCClass {
2322+
@objc
2323+
static var objCVarInObjCExtension: Bool {
2324+
get {
2325+
return true
2326+
}
2327+
set {}
2328+
}
2329+
}

0 commit comments

Comments
 (0)