Ban @objcMembers Without Importing Foundation

rdar://98734024
This commit is contained in:
Robert Widmann
2022-08-17 16:29:56 -07:00
parent 2c295abb1b
commit 4a9a932dce
5 changed files with 20 additions and 2 deletions

View File

@@ -5238,7 +5238,7 @@ ERROR(objc_extension_not_class,none,
"'@objc' can only be applied to an extension of a class", ())
// If you change this, also change enum ObjCReason
#define OBJC_ATTR_SELECT "select{marked @_cdecl|marked dynamic|marked @objc|marked @IBOutlet|marked @IBAction|marked @IBSegueAction|marked @NSManaged|a member of an @objc protocol|implicitly @objc|an @objc override|an implementation of an @objc requirement|marked @IBInspectable|marked @GKInspectable|in an @objc extension of a class (without @nonobjc)|marked @objc by an access note}"
#define OBJC_ATTR_SELECT "select{marked @_cdecl|marked dynamic|marked @objc|marked @objcMembers|marked @IBOutlet|marked @IBAction|marked @IBSegueAction|marked @NSManaged|a member of an @objc protocol|implicitly @objc|an @objc override|an implementation of an @objc requirement|marked @IBInspectable|marked @GKInspectable|in an @objc extension of a class (without @nonobjc)|marked @objc by an access note}"
WARNING(attribute_meaningless_when_nonobjc,none,
"'@%0' attribute is meaningless on a property that cannot be "

View File

@@ -1147,9 +1147,11 @@ static bool checkObjCDeclContext(Decl *D) {
return false;
}
static void diagnoseObjCAttrWithoutFoundation(ObjCAttr *attr, Decl *decl,
static void diagnoseObjCAttrWithoutFoundation(DeclAttribute *attr, Decl *decl,
ObjCReason reason,
DiagnosticBehavior behavior) {
assert(attr->getKind() == DeclAttrKind::DAK_ObjC ||
attr->getKind() == DeclAttrKind::DAK_ObjCMembers);
auto *SF = decl->getDeclContext()->getParentSourceFile();
assert(SF);
@@ -1369,6 +1371,10 @@ void AttributeChecker::visitNonObjCAttr(NonObjCAttr *attr) {
void AttributeChecker::visitObjCMembersAttr(ObjCMembersAttr *attr) {
if (!isa<ClassDecl>(D))
diagnoseAndRemoveAttr(attr, diag::objcmembers_attribute_nonclass);
auto reason = ObjCReason(ObjCReason::ExplicitlyObjCMembers, attr);
auto behavior = behaviorLimitForObjCReason(reason, Ctx);
diagnoseObjCAttrWithoutFoundation(attr, D, reason, behavior);
}
void AttributeChecker::visitOptionalAttr(OptionalAttr *attr) {

View File

@@ -37,6 +37,7 @@ swift::behaviorLimitForObjCReason(ObjCReason reason, ASTContext &ctx) {
case ObjCReason::ExplicitlyCDecl:
case ObjCReason::ExplicitlyDynamic:
case ObjCReason::ExplicitlyObjC:
case ObjCReason::ExplicitlyObjCMembers:
case ObjCReason::ExplicitlyIBOutlet:
case ObjCReason::ExplicitlyIBAction:
case ObjCReason::ExplicitlyIBSegueAction:
@@ -71,6 +72,7 @@ unsigned swift::getObjCDiagnosticAttrKind(ObjCReason reason) {
case ObjCReason::ExplicitlyCDecl:
case ObjCReason::ExplicitlyDynamic:
case ObjCReason::ExplicitlyObjC:
case ObjCReason::ExplicitlyObjCMembers:
case ObjCReason::ExplicitlyIBOutlet:
case ObjCReason::ExplicitlyIBAction:
case ObjCReason::ExplicitlyIBSegueAction:
@@ -128,6 +130,7 @@ void ObjCReason::describe(const Decl *D) const {
case ObjCReason::ExplicitlyCDecl:
case ObjCReason::ExplicitlyDynamic:
case ObjCReason::ExplicitlyObjC:
case ObjCReason::ExplicitlyObjCMembers:
case ObjCReason::ExplicitlyIBOutlet:
case ObjCReason::ExplicitlyIBAction:
case ObjCReason::ExplicitlyIBSegueAction:

View File

@@ -49,6 +49,8 @@ public:
ExplicitlyDynamic,
/// Has an explicit '@objc' attribute.
ExplicitlyObjC,
/// Has an explicit '@objcmembers' attribute.
ExplicitlyObjCMembers,
/// Has an explicit '@IBOutlet' attribute.
ExplicitlyIBOutlet,
/// Has an explicit '@IBAction' attribute.
@@ -101,6 +103,7 @@ private:
case ExplicitlyCDecl:
case ExplicitlyDynamic:
case ExplicitlyObjC:
case ExplicitlyObjCMembers:
case ExplicitlyIBOutlet:
case ExplicitlyIBAction:
case ExplicitlyIBSegueAction:

View File

@@ -0,0 +1,6 @@
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s
// RUN: %target-swift-frontend -typecheck -verify -enable-objc-interop %s -parse-as-library
@objcMembers class Oof {
// expected-error@-1 {{@objcMembers attribute used without importing module 'Foundation'}}
}