From a8fb416f9e34ca8ce86b547d7cca77a8fc55a970 Mon Sep 17 00:00:00 2001 From: Doug Gregor Date: Fri, 4 Jan 2019 23:29:57 -0800 Subject: [PATCH] [Type checker] Don't implicitly propagate @objc to read/modify accessors. Fixes rdar://problem/46699152. --- lib/Sema/TypeCheckDeclObjC.cpp | 17 ++++++++++++++++- test/attr/attr_objc.swift | 15 +++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/lib/Sema/TypeCheckDeclObjC.cpp b/lib/Sema/TypeCheckDeclObjC.cpp index 1396b8ea40d..61965850233 100644 --- a/lib/Sema/TypeCheckDeclObjC.cpp +++ b/lib/Sema/TypeCheckDeclObjC.cpp @@ -1066,6 +1066,21 @@ Optional shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) { if (VD->getFormalAccess() <= AccessLevel::FilePrivate) return false; + if (auto accessor = dyn_cast(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 shouldMarkAsObjC(const ValueDecl *VD, bool allowImplicit) { cast(VD->getDeclContext())->getAttrs() .hasAttribute())) return None; - if (isMemberOfObjCClassExtension(VD)) + if (isMemberOfObjCClassExtension(VD) && canInferImplicitObjC()) return ObjCReason(ObjCReason::MemberOfObjCExtension); if (isMemberOfObjCMembersClass(VD) && canInferImplicitObjC()) return ObjCReason(ObjCReason::MemberOfObjCMembersClass); diff --git a/test/attr/attr_objc.swift b/test/attr/attr_objc.swift index c1ef5366fd9..fa70ca88b14 100644 --- a/test/attr/attr_objc.swift +++ b/test/attr/attr_objc.swift @@ -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 {} + } +}