Merge pull request #21657 from DougGregor/objc-read-modify

diff --git a/lib/Sema/TypeCheckDeclObjC.cpp b/lib/Sema/TypeCheckDeclObjC.cpp
index 1396b8e..6196585 100644
--- a/lib/Sema/TypeCheckDeclObjC.cpp
+++ b/lib/Sema/TypeCheckDeclObjC.cpp
@@ -1066,6 +1066,21 @@
     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 @@
        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);
diff --git a/test/attr/attr_objc.swift b/test/attr/attr_objc.swift
index 71391e3..ebfe523 100644
--- a/test/attr/attr_objc.swift
+++ b/test/attr/attr_objc.swift
@@ -2312,3 +2312,18 @@
 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 {}
+    }
+}