[Type checker] Don't implicitly propagate @objc to read/modify accessors.

Fixes rdar://problem/46699152.
This commit is contained in:
Doug Gregor
2019-01-04 23:29:57 -08:00
parent 05fc089af6
commit a8fb416f9e
2 changed files with 31 additions and 1 deletions

View File

@@ -1066,6 +1066,21 @@ Optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) {
if (VD->getFormalAccess() <= AccessLevel::FilePrivate)
return false;
if (auto accessor = dyn_cast<AccessorDecl>(VD)) {
switch (accessor->getAccessorKind()) {
case AccessorKind::DidSet:
case AccessorKind::Modify:
case AccessorKind::Read:
case AccessorKind::WillSet:
return false;
case AccessorKind::MutableAddress:
case AccessorKind::Address:
case AccessorKind::Get:
case AccessorKind::Set:
break;
}
}
return true;
};
@@ -1106,7 +1121,7 @@ Optional<ObjCReason> shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) {
cast<ExtensionDecl>(VD->getDeclContext())->getAttrs()
.hasAttribute<NonObjCAttr>()))
return None;
if (isMemberOfObjCClassExtension(VD))
if (isMemberOfObjCClassExtension(VD) && canInferImplicitObjC())
return ObjCReason(ObjCReason::MemberOfObjCExtension);
if (isMemberOfObjCMembersClass(VD) && canInferImplicitObjC())
return ObjCReason(ObjCReason::MemberOfObjCMembersClass);

View File

@@ -2312,3 +2312,18 @@ protocol ObjCProtocolWithWeakProperty {
protocol ObjCProtocolWithUnownedProperty {
unowned var unownedProp: AnyObject { get set } // okay
}
// rdar://problem/46699152: errors about read/modify accessors being implicitly
// marked @objc.
@objc class MyObjCClass: NSObject {}
@objc
extension MyObjCClass {
@objc
static var objCVarInObjCExtension: Bool {
get {
return true
}
set {}
}
}